[{"data":1,"prerenderedAt":1187},["ShallowReactive",2],{"i-lucide:monitor":3,"i-lucide:heart":8,"blog-chrome-extension-permissions":10,"blog-tag-counts":1181},{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":7},0,24,false,"\u003Cg fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\">\u003Crect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"/>\u003Cpath d=\"M8 21h8m-4-4v4\"/>\u003C/g>",{"left":4,"top":4,"width":5,"height":5,"rotate":4,"vFlip":6,"hFlip":6,"body":9},"\u003Cpath fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M2 9.5a5.5 5.5 0 0 1 9.591-3.676a.56.56 0 0 0 .818 0A5.49 5.49 0 0 1 22 9.5c0 2.29-1.5 4-3 5.5l-5.492 5.313a2 2 0 0 1-3 .019L5 15c-1.5-1.5-3-3.2-3-5.5\"/>",{"id":11,"title":12,"author":13,"body":14,"canonical":13,"cover":1105,"coverAlt":1106,"date":1107,"description":1108,"extension":1109,"heroImage":1110,"meta":1111,"metaDescription":1112,"navigation":1113,"path":1114,"readingTime":1115,"seo":1116,"sources":1117,"sourcesExempt":13,"stem":1175,"tags":1176,"thumb":13,"thumbAlt":13,"updated":13,"__hash__":1180},"blog/blog/chrome-extension-permissions.md","Chrome Extension Permissions: What the Prompt Leaves Out",null,{"type":15,"value":16,"toc":1091},"minimark",[17,21,24,27,34,39,51,54,127,140,144,193,198,219,222,237,243,247,269,278,281,397,400,463,469,475,483,487,503,551,554,557,567,587,653,660,669,676,680,696,703,731,738,742,745,762,775,785,794,798,807,813,821,827,833,839,849,861,867,876,880,905,932,987,1006,1012,1016,1019,1053,1060,1063,1087],[18,19,20],"p",{},"Chrome does not show you an extension's permissions when you install it. It shows you warnings, and those are a different list, generated from the first one by a set of rules that throws information away. More than forty permissions produce no line in that box at all. One permission can delete another permission's line. And the most alarming sentence Chrome prints is usually generated by the dullest thing an extension can ask for.",[18,22,23],{},"None of that is hidden. Google publishes the permission-to-warning table, Chromium publishes the rules that collapse it, and between them they explain every strange thing you have ever read in an install prompt.",[18,25,26],{},"Everything below comes from Chrome's own documentation and Chromium's own source, read on 27 August 2026, plus two measurements against Chrome 151. Both methods are written out, because a claim about what a browser prints is worth nothing unless you can print it yourself.",[28,29,31],"article-disclosure",{"kind":30},"ownership",[18,32,33],{},"The worked example in this article is our own extension, TheTab. We picked it because we can show you its manifest and its store listing rather than guessing at someone else's, and because it is the only permission list we can be held to.",[35,36,38],"h2",{"id":37},"what-is-chrome-actually-showing-you-in-that-box","What is Chrome actually showing you in that box?",[18,40,41,45,46,50],{},[42,43,44],"strong",{},"A generated summary, not the manifest."," An extension declares permissions in four manifest fields, and Chrome runs the two non-optional ones through a rule table that decides which English sentences to print. ",[47,48],"cite-ref",{"n":49},"4"," Some permissions map to one sentence, some map to nothing at all, and some quietly delete a different permission's sentence on their way past. The box is that table's output. In every real extension it is shorter than its input.",[18,52,53],{},"The four fields are worth knowing, because two of them never appear at install time:",[55,56,57,73],"table",{},[58,59,60],"thead",{},[61,62,63,67,70],"tr",{},[64,65,66],"th",{},"Manifest field",[64,68,69],{},"Granted when",[64,71,72],{},"Shows in the install box",[74,75,76,91,103,116],"tbody",{},[61,77,78,85,88],{},[79,80,81],"td",{},[82,83,84],"code",{},"permissions",[79,86,87],{},"At install",[79,89,90],{},"Yes, if the permission has a warning",[61,92,93,98,100],{},[79,94,95],{},[82,96,97],{},"host_permissions",[79,99,87],{},[79,101,102],{},"Yes",[61,104,105,110,113],{},[79,106,107],{},[82,108,109],{},"optional_permissions",[79,111,112],{},"Later, when the extension asks",[79,114,115],{},"No",[61,117,118,123,125],{},[79,119,120],{},[82,121,122],{},"optional_host_permissions",[79,124,112],{},[79,126,115],{},[18,128,129,130,133,134,136,137,139],{},"An extension that puts ",[82,131,132],{},"downloads"," in ",[82,135,109],{}," is not asking for it now. It is asking for the right to ask you later, at which point Chrome will show a prompt of its own. ",[47,138],{"n":49}," That is the well-behaved pattern, and it is one of the few things in a manifest that reliably distinguishes a careful developer from a careless one.",[35,141,143],{"id":142},"which-extension-permissions-produce-no-warning-at-all","Which extension permissions produce no warning at all?",[18,145,146,149,150,153,154,153,157,153,160,153,163,153,166,153,169,153,172,153,175,153,178,181,182,185,186,189,190],{},[42,147,148],{},"Around forty-five of them",", and the list contains several you would expect to see. Chrome's permissions reference marks each entry with its warning string or with nothing, and the nothing column includes ",[82,151,152],{},"storage",", ",[82,155,156],{},"cookies",[82,158,159],{},"scripting",[82,161,162],{},"webRequest",[82,164,165],{},"activeTab",[82,167,168],{},"alarms",[82,170,171],{},"contextMenus",[82,173,174],{},"identity",[82,176,177],{},"offscreen",[82,179,180],{},"sidePanel"," and ",[82,183,184],{},"unlimitedStorage",". ",[47,187],{"n":188},"1"," Firefox's equivalent table marks nearly the same set as silent. ",[47,191],{"n":192},"11",[18,194,195,197],{},[82,196,156],{}," is the one that stops people. An extension can declare it and you will never be told.",[18,199,200,201,204,205,185,209,212,213,215,216],{},"The reason it is safe to hide is that the permission does nothing on its own. Chrome's documentation states that to use the cookies API you must declare ",[82,202,203],{},"\"cookies\""," ",[206,207,208],"em",{},"along with host permissions for any hosts whose cookies you want to access",[47,210],{"n":211},"6"," The host permission is what carries the risk, and the host permission is what Chrome warns about. ",[82,214,162],{}," is built the same way, and its documentation says so in the same shape. ",[47,217],{"n":218},"7",[18,220,221],{},"So the silence is not carelessness. It is a deliberate decision that a capability which cannot reach your data on its own does not deserve a sentence that will frighten you. Whether you agree with that decision is a separate question from whether you know it is being made, and until you have read the table you do not know.",[18,223,224,226,227,204,230,236],{},[82,225,165],{}," is the interesting member of the silent set, because it is the one that replaces something loud. It grants an extension access to the tab you are on, but only after you invoke the extension yourself, by clicking its toolbar icon, choosing its context menu item, pressing its keyboard shortcut or accepting its omnibox suggestion. The grant dies when you navigate to another origin or close the tab, and Chrome shows no warning for it at all. ",[47,228],{"n":229},"5",[42,231,232,233,235],{},"An extension that uses ",[82,234,165],{}," where it could have demanded access to every site has chosen the version of itself that can see less."," That choice is invisible in the install box, which is exactly the problem with reading only the install box.",[18,238,239,240,242],{},"It is not invisible everywhere, though. There is one screen where ",[82,241,165],{}," shows up in the most alarming wording Chrome owns, and it comes up further down.",[35,244,246],{"id":245},"why-does-a-tab-manager-want-to-read-your-browsing-history","Why does a tab manager want to read your browsing history?",[18,248,249,256,257,259,260,262,263,266,267],{},[42,250,251,252,255],{},"Because ",[82,253,254],{},"tabs"," is printed as \"Read your browsing history\", and a tab manager cannot list your tabs without it."," This is the single most misread line in Chrome, and the mapping is right there in the reference table: the ",[82,258,254],{}," permission produces the string \"Read your browsing history\". ",[47,261],{"n":188}," It does not grant access to the History API. That is a separate permission, ",[82,264,265],{},"history",", which produces a longer and genuinely broader sentence: \"Read and change your browsing history on all signed-in devices.\" ",[47,268],{"n":188},[18,270,271,272,274,275,277],{},"The difference matters. ",[82,273,254],{}," lets an extension read the URL, title and favicon of tabs that are open right now. ",[82,276,265],{}," lets it read and rewrite the record of everywhere you have been, across every device you are signed into. Chrome describes the first one using the words most people associate with the second.",[18,279,280],{},"Here is our own extension, so the example is one we can be held to. TheTab's shipped manifest declares thirteen permissions plus one optional:",[282,283,288],"pre",{"className":284,"code":285,"language":286,"meta":287,"style":287},"language-json shiki shiki-themes github-light github-dark","\"permissions\": [\n  \"storage\", \"unlimitedStorage\", \"tabs\", \"tabGroups\", \"activeTab\",\n  \"sidePanel\", \"contextMenus\", \"alarms\", \"notifications\", \"favicon\",\n  \"offscreen\", \"clipboardWrite\", \"bookmarks\"\n],\n\"optional_permissions\": [\"downloads\"]\n","json","",[82,289,290,303,332,360,376,382],{"__ignoreMap":287},[291,292,295,299],"span",{"class":293,"line":294},"line",1,[291,296,298],{"class":297},"sZZnC","\"permissions\"",[291,300,302],{"class":301},"sVt8B",": [\n",[291,304,306,309,311,314,316,319,321,324,326,329],{"class":293,"line":305},2,[291,307,308],{"class":297},"  \"storage\"",[291,310,153],{"class":301},[291,312,313],{"class":297},"\"unlimitedStorage\"",[291,315,153],{"class":301},[291,317,318],{"class":297},"\"tabs\"",[291,320,153],{"class":301},[291,322,323],{"class":297},"\"tabGroups\"",[291,325,153],{"class":301},[291,327,328],{"class":297},"\"activeTab\"",[291,330,331],{"class":301},",\n",[291,333,335,338,340,343,345,348,350,353,355,358],{"class":293,"line":334},3,[291,336,337],{"class":297},"  \"sidePanel\"",[291,339,153],{"class":301},[291,341,342],{"class":297},"\"contextMenus\"",[291,344,153],{"class":301},[291,346,347],{"class":297},"\"alarms\"",[291,349,153],{"class":301},[291,351,352],{"class":297},"\"notifications\"",[291,354,153],{"class":301},[291,356,357],{"class":297},"\"favicon\"",[291,359,331],{"class":301},[291,361,363,366,368,371,373],{"class":293,"line":362},4,[291,364,365],{"class":297},"  \"offscreen\"",[291,367,153],{"class":301},[291,369,370],{"class":297},"\"clipboardWrite\"",[291,372,153],{"class":301},[291,374,375],{"class":297},"\"bookmarks\"\n",[291,377,379],{"class":293,"line":378},5,[291,380,381],{"class":301},"],\n",[291,383,385,388,391,394],{"class":293,"line":384},6,[291,386,387],{"class":297},"\"optional_permissions\"",[291,389,390],{"class":301},": [",[291,392,393],{"class":297},"\"downloads\"",[291,395,396],{"class":301},"]\n",[18,398,399],{},"Chrome prints five lines for that.",[55,401,402,412],{},[58,403,404],{},[61,405,406,409],{},[64,407,408],{},"What Chrome prints",[64,410,411],{},"Which permission produced it",[74,413,414,423,433,443,453],{},[61,415,416,419],{},[79,417,418],{},"Read your browsing history",[79,420,421],{},[82,422,254],{},[61,424,425,428],{},[79,426,427],{},"Display notifications",[79,429,430],{},[82,431,432],{},"notifications",[61,434,435,438],{},[79,436,437],{},"Read and change your bookmarks",[79,439,440],{},[82,441,442],{},"bookmarks",[61,444,445,448],{},[79,446,447],{},"Modify data you copy and paste",[79,449,450],{},[82,451,452],{},"clipboardWrite",[61,454,455,458],{},[79,456,457],{},"View and manage your tab groups",[79,459,460],{},[82,461,462],{},"tabGroups",[18,464,465,466,468],{},"Eight of the thirteen never reach the box. Seven of those have no warning of their own; the eighth is hidden by another permission, which is the next section. ",[82,467,132],{}," is missing for a third reason, being optional, so it gets a prompt of its own on the day the export feature is first used.",[18,470,471,472],{},"Which leaves the line at the top. It reads like a browsing-history grab and it is what a tab manager needs to know which tabs you have open. ",[42,473,474],{},"We would rather it said what it means. It does not, and there is nothing an extension developer can do about the wording.",[18,476,477],{},[478,479],"img",{"alt":480,"src":481,"title":482},"Chrome's extension details page for TheTab, showing five permission lines and a site access section","/blog/chrome-extension-permissions/thetab-permissions-in-chrome.png","1: the whole permission list, five lines from thirteen declared permissions. 2: the site access section, which the install box never showed you, and which says something the permission list did not.",[35,484,486],{"id":485},"can-one-permission-hide-another-ones-warning","Can one permission hide another one's warning?",[18,488,489,492,493,495,496,499,500],{},[42,490,491],{},"Yes, and this is where the summary stops being merely shorter than the manifest and starts being differently shaped."," Chrome's own guidance says it plainly: \"some permissions may not display warnings when paired with other permissions. For example, the ",[82,494,254],{}," warning won't show if the extension also requests ",[82,497,498],{},"\u003Call_urls>",".\" ",[47,501],{"n":502},"2",[18,504,505,506,509,510,513,514,181,517,520,521,153,524,181,527,530,531,153,534,181,537,540,541,153,543,181,545,547,548],{},"The rules behind that live in ",[82,507,508],{},"chrome_permission_message_rules.cc"," in the Chromium tree, and they are readable without knowing any C++. Each rule names one required permission and a list of permissions it absorbs. The rule keyed on ",[82,511,512],{},"kTab"," absorbs ",[82,515,516],{},"kFavicon",[82,518,519],{},"kTopSites",". The rules keyed on ",[82,522,523],{},"kHistory",[82,525,526],{},"kWebNavigation",[82,528,529],{},"kProcesses"," absorb the same two. The rules keyed on ",[82,532,533],{},"kFullAccess",[82,535,536],{},"kHostsAll",[82,538,539],{},"kHostsAllReadOnly"," absorb ",[82,542,516],{},[82,544,512],{},[82,546,519],{},", among a longer list. ",[47,549],{"n":550},"3",[18,552,553],{},"That is a hierarchy: broad access swallows narrow access, and only the widest sentence is printed.",[18,555,556],{},"You can watch it happen, and it is worth doing once. Reading a rule table and watching a line vanish are different kinds of conviction.",[18,558,559,560,563,564,566],{},"Look again at the five lines above. TheTab declares ",[82,561,562],{},"favicon",", whose documented warning is \"Read the icons of the websites you visit\", ",[47,565],{"n":188}," and that sentence is not among them.",[18,568,569,572,573,576,577,579,580,582,583,586],{},[42,570,571],{},"The method, so the result is checkable rather than asserted."," Load the shipped Chrome build of TheTab as an unpacked extension in Chrome 151, open ",[82,574,575],{},"chrome://extensions/?id=\u003Cthe id>",", and read the Permissions block. Then copy the same build to a second folder, delete ",[82,578,318],{}," from the ",[82,581,84],{}," array in its ",[82,584,585],{},"manifest.json",", load that copy, and read the block again. Nothing else changes.",[55,588,589,605],{},[58,590,591],{},[61,592,593,595,600],{},[64,594],{},[64,596,597,598],{},"With ",[82,599,254],{},[64,601,597,602,604],{},[82,603,254],{}," removed",[74,606,607,617,626,635,644],{},[61,608,609,612,614],{},[79,610,611],{},"Line 1",[79,613,418],{},[79,615,616],{},"Read the icons of the websites you visit",[61,618,619,622,624],{},[79,620,621],{},"Line 2",[79,623,427],{},[79,625,427],{},[61,627,628,631,633],{},[79,629,630],{},"Line 3",[79,632,437],{},[79,634,437],{},[61,636,637,640,642],{},[79,638,639],{},"Line 4",[79,641,447],{},[79,643,447],{},[61,645,646,649,651],{},[79,647,648],{},"Line 5",[79,650,457],{},[79,652,457],{},[18,654,655],{},[478,656],{"alt":657,"src":658,"title":659},"Two captures of the same permission list stacked, the second from a build with the tabs permission deleted, differing only in the first line","/blog/chrome-extension-permissions/favicon-warning-hidden-under-tabs.png","Both panels are the same crop of the same page, taken minutes apart. The only edit between them is one word removed from a manifest.",[18,661,662,663,665,666,668],{},"Same number of lines. Different first line. The ",[82,664,562],{}," warning was suppressed the whole time, sitting underneath ",[82,667,254],{}," exactly as rule 6 of that file says it should. Remove the permission on top and the one underneath surfaces.",[18,670,671,672,675],{},"The practical consequence is the one to carry away. ",[42,673,674],{},"A short warning list can mean an extension asks for little, or it can mean one broad permission ate all the narrow ones."," Those two situations look identical from the install box, and they are opposites.",[35,677,679],{"id":678},"which-line-on-the-list-actually-matters","Which line on the list actually matters?",[18,681,682,685,686,153,688,153,690,692,693,695],{},[42,683,684],{},"\"Read and change all your data on all websites.\""," If it is there, the rest of the list is close to noise, because that sentence is generated by host permissions broad enough that Chromium's rules discard ",[82,687,516],{},[82,689,512],{},[82,691,519],{}," and everything else in the same family. ",[47,694],{"n":550}," The extension can read the contents of every page you open and change them before you see them.",[18,697,698],{},[478,699],{"alt":700,"src":701,"title":702},"Diagram of how Chrome collapses permission warnings, with broad host access absorbing the tabs, favicon and topSites warnings and tabs in turn absorbing favicon and topSites","/blog/chrome-extension-permissions/how-chrome-collapses-permission-warnings-diagram.svg","Read it as a drain. Whatever is highest on the left is the only thing printed, and the box on the right never reaches the page at all.",[18,704,705,706,153,709,153,712,153,715,181,718,721,722,724,725,727,728,730],{},"Several permissions produce that same sentence without any host pattern at all, because they amount to the same power by another route: ",[82,707,708],{},"debugger",[82,710,711],{},"pageCapture",[82,713,714],{},"proxy",[82,716,717],{},"tabCapture",[82,719,720],{},"webAuthenticationProxy"," each print it. ",[47,723],{"n":188}," An extension asking for ",[82,726,708],{}," is asking for the whole browser, and Chrome tells you so in the same words it uses for ",[82,729,498],{},".",[18,732,733,734,737],{},"None of which is a reason to refuse every extension that asks. An ad blocker, a password manager and a grammar checker all genuinely need to see page content, and the ones that do not ask for it are the ones that cannot work. But ",[42,735,736],{},"this line is the whole decision, and the four under it are detail."," Ask what the extension does that requires reading every page. If you cannot answer that from the store listing in one sentence, that is your answer.",[35,739,741],{"id":740},"where-do-you-actually-see-the-list-before-installing","Where do you actually see the list before installing?",[18,743,744],{},"The install confirmation dialog is the first place and the worst one, because it appears at the moment you have already decided. Two better ones exist.",[18,746,747,750,751,754,755,758,759],{},[42,748,749],{},"The store listing's Privacy practices tab."," On a Chrome Web Store page it sits alongside Overview and Reviews, and it holds a different kind of information from the permission box: not what the extension ",[206,752,753],{},"can"," do, but what the developer has declared it ",[206,756,757],{},"does"," with what it collects. Developers must tick which of nine categories apply, and Google's documentation names them: personally identifiable information, health information, financial and payment information, authentication information, personal communications, location, web history, user activity and website content. ",[47,760],{"n":761},"9",[18,763,764,765,768,769,772,773],{},"Ours declares one of the nine. TheTab's privacy tab says ",[42,766,767],{},"User activity",", which the listing defines as \"network monitoring, clicks, mouse position, scroll, or keystroke logging\". ",[47,770],{"n":771},"10"," That is there because the extension sends anonymous product-usage events, and it is the honest box to tick even though the phrasing is broader than what we do. Alongside it sit three certifications every listing carries: that data is not sold to third parties outside the approved use cases, not used or transferred for purposes unrelated to the item's core functionality, and not used to determine creditworthiness or for lending. ",[47,774],{"n":771},[18,776,777,778,781,782,784],{},"Read this tab against the permission list rather than instead of it. A short permission list with ",[82,779,780],{},"Personally identifiable information"," ticked is stranger than a long permission list with nothing ticked, and only reading both surfaces it. Google's own policy says the disclosures \"should be consistent with the existing privacy policy URL\" the developer supplied, ",[47,783],{"n":761}," which gives you a third thing to compare when the first two disagree.",[18,786,787,204,790,793],{},[42,788,789],{},"The extension's own details page, after installing.",[82,791,792],{},"chrome://extensions",", then Details on the extension, is the same computed list the install box showed you, except you can read it without a dialog waiting for a click. It is also where the site-access control lives, which the install box does not mention at all.",[35,795,797],{"id":796},"what-can-you-change-after-you-have-said-yes","What can you change after you have said yes?",[18,799,800,803,804],{},[42,801,802],{},"Site access, and it is the strongest control Chrome gives you."," From Extensions, Manage extensions, Details, Chrome offers three settings for an extension that asked for host permissions: access only when you select the extension, access on the current site, or access on all sites. ",[47,805],{"n":806},"8",[18,808,809,810,812],{},"The first of those is close to converting a permanent grant into ",[82,811,165],{}," after the fact. The extension gets the page only when you click it, and gets nothing the rest of the time. It breaks anything that has to run automatically, and an ad blocker set this way stops blocking, so it is not a free win. For the large category of extensions you invoke deliberately, a screenshot tool, a clipper, a converter, it costs nothing and removes a standing grant to read everything you browse.",[814,815,817,818,820],"h3",{"id":816},"the-one-place-activetab-stops-being-quiet","The one place ",[82,819,165],{}," stops being quiet",[18,822,823,824,826],{},"The Site access section on that page is also where the tidy story about ",[82,825,165],{}," breaks, and since it breaks against our own extension it is worth showing rather than skipping.",[18,828,829,830,832],{},"TheTab requests no host permissions. It has no ",[82,831,97],{}," array and no content scripts, and its install box says nothing about websites. Its Site access section says this:",[834,835,836],"blockquote",{},[18,837,838],{},"This extension can read and change your data on sites. You can control which sites the extension can access.",[18,840,841,842,844,845,848],{},"Same experiment as before, one permission at a time. Delete ",[82,843,165],{}," from the manifest of the same build and reload it, and that sentence is replaced by ",[42,846,847],{},"\"This extension has no additional site access.\""," Nothing else in the manifest changed, and no other line on the page moved.",[18,850,851,852,854,855,857,858],{},"So ",[82,853,165],{}," is the permission Chrome deliberately does not warn about at install, described on the details page in the same verb it uses for reading every page you open. Both descriptions are defensible. ",[82,856,165],{}," genuinely can read and change the page, and it genuinely cannot do so until you click the extension, and no single sentence carries both halves. ",[42,859,860],{},"The install box picked the reassuring half and the details page picked the alarming one, and a reader who sees only one of them gets a skewed picture in whichever direction they happened to look.",[18,862,863,864,866],{},"The practical version: an extension whose Site access section names specific sites, or says it has none, is telling you something real. One that says it can read and change your data on sites, with nothing listed underneath, is usually an ",[82,865,165],{}," extension being described in the loudest available terms.",[18,868,869,870,204,873,875],{},"The other thing worth knowing is what happens when an extension updates. ",[42,871,872],{},"Chrome disables an extension that adds a permission carrying a new warning until you accept the new list.",[47,874],{"n":502}," That is a real protection and it is also the exact boundary of what a permission list can promise you: it constrains what a version may do, and it re-asks when the constraint widens. It says nothing about what the code inside those constraints actually does, and nothing about who will own the extension by the next release.",[35,877,879],{"id":878},"what-does-firefox-show-and-where-does-it-differ","What does Firefox show, and where does it differ?",[18,881,882,885,886,888,889,891,892,894,895,898,899,901,902,904],{},[42,883,884],{},"Different words, mostly the same lists, and one thing Chrome has no equivalent for."," Firefox's install panel describes broad host access as \"Access your data for all websites\", ",[82,887,254],{}," as \"Access browser tabs\", ",[82,890,265],{}," as \"Access browsing history\", ",[82,893,442],{}," as \"Read and modify bookmarks\" and ",[82,896,897],{},"nativeMessaging"," as \"Exchange messages with programs other than Firefox\". ",[47,900],{"n":192}," The ",[82,903,254],{}," wording is plainer than Chrome's and describes the same capability.",[18,906,907,908,153,910,153,912,153,914,153,916,153,919,153,921,153,924,181,926,928,929,931],{},"Firefox's silent set also looks familiar: ",[82,909,156],{},[82,911,152],{},[82,913,162],{},[82,915,168],{},[82,917,918],{},"menus",[82,920,174],{},[82,922,923],{},"idle",[82,925,184],{},[82,927,165],{}," all install without a word. ",[47,930],{"n":192}," The two browsers made the same call about the same permissions, independently, which is a reasonable argument that the call is defensible.",[18,933,934,935,938,939,185,942,945,946,153,949,153,952,153,955,153,958,153,961,153,964,153,967,153,970,153,973,153,976,979,980,983,984],{},"The thing Chrome has no equivalent for is a declared data-collection list in the manifest itself. Since ",[42,936,937],{},"3 November 2025",", every new Firefox extension must state whether it collects or transmits personal data, through ",[82,940,941],{},"browser_specific_settings.gecko.data_collection_permissions",[47,943],{"n":944},"13"," The values are specific rather than categorical: ",[82,947,948],{},"personallyIdentifyingInfo",[82,950,951],{},"healthInfo",[82,953,954],{},"financialAndPaymentInfo",[82,956,957],{},"authenticationInfo",[82,959,960],{},"personalCommunications",[82,962,963],{},"locationInfo",[82,965,966],{},"browsingActivity",[82,968,969],{},"websiteContent",[82,971,972],{},"websiteActivity",[82,974,975],{},"searchTerms",[82,977,978],{},"bookmarksInfo",", and the special value ",[82,981,982],{},"none"," for an extension that collects nothing. ",[47,985],{"n":986},"12",[18,988,989,990,993,994,996,997,1000,1001,185,1004],{},"Required types appear in the install prompt beside the permissions. Optional ones do not, with one exception: ",[82,991,992],{},"technicalAndInteraction",", the telemetry-shaped one, appears in the install flow as a toggle you can switch off before you finish installing. ",[47,995],{"n":986}," Afterwards, all of it is reviewable and changeable in ",[82,998,999],{},"about:addons"," under ",[42,1002,1003],{},"Permissions and data",[47,1005],{"n":986},[18,1007,1008,1009,1011],{},"Two limits are worth stating rather than glossing. The requirement applies to new extensions only, not to new versions of extensions that already existed, ",[47,1010],{"n":944}," so an add-on you installed in 2023 may declare nothing. And a declaration is a statement by the developer, verified by review rather than by the browser. It is the same kind of promise as the Chrome Web Store privacy tab, made in a place a machine can read.",[35,1013,1015],{"id":1014},"the-version-of-this-you-can-do-in-thirty-seconds","The version of this you can do in thirty seconds",[18,1017,1018],{},"Nobody is going to read a Chromium source file before installing a screenshot tool. The compressed version, in the order that gets you the most for the least:",[1020,1021,1022,1029,1035,1041,1047],"ol",{},[1023,1024,1025,1028],"li",{},[42,1026,1027],{},"Look for \"Read and change all your data on all websites\" first."," If it is there, that is the decision. Everything else on the list is detail.",[1023,1030,1031,1034],{},[42,1032,1033],{},"Then ask why the list is short."," A short list is either a modest extension or one broad permission eating five narrow ones, and those look the same.",[1023,1036,1037,1040],{},[42,1038,1039],{},"Open the Privacy practices tab"," and read it against the permissions. Disagreement between the two is the signal, in either direction.",[1023,1042,1043,1046],{},[42,1044,1045],{},"Set site access to \"on click\""," for anything you invoke deliberately rather than anything that runs on its own.",[1023,1048,1049,1052],{},[42,1050,1051],{},"Treat the update prompt as a real question."," Chrome disabling an extension until you accept a new permission is the one moment it will interrupt you about this, and it only happens when the boundary got wider.",[18,1054,1055],{},[478,1056],{"alt":1057,"src":1058,"title":1059},"Numbered checklist for reading an extension permission list","/blog/chrome-extension-permissions/how-to-read-an-extension-permission-list.png","Steps one and two are most of the value. Steps three to five are what to do when the first two leave you unsure.",[18,1061,1062],{},"The permission list is a good tool used badly. It is worth ten seconds more than most people give it, and it will never be worth trusting on its own, because it describes a boundary rather than a behaviour. A tab manager asking to read your browsing history and a keylogger asking to read your browsing history print the same sentence.",[18,1064,1065,1066,1071,1072,1076,1077,1081,1082,1086],{},"That is also why the rest of the evidence matters: how the extension explains itself, whether it publishes anything you can check, and ",[1067,1068,1070],"a",{"href":1069},"/blog/extensions-that-keep-your-data-local","whether its claim to keep your data on your machine is one you can verify rather than one you have to take",". If you are still working out what kind of tool you need before you get to the question of trusting one, ",[1067,1073,1075],{"href":1074},"/blog/what-is-a-tab-manager","the four families of tab manager"," is the place to start, and ",[1067,1078,1080],{"href":1079},"/blog/best-browser-extensions-productivity-2026","the roundup of extensions we actually run"," lists what each one asks for. The other direction is worth a look too: ",[1067,1083,1085],{"href":1084},"/blog/firefox-tab-management","Firefox ships a good deal of tab machinery in the browser itself",", and the best permission list is the one you never have to grant.",[1088,1089,1090],"style",{},"html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":287,"searchDepth":305,"depth":305,"links":1092},[1093,1094,1095,1096,1097,1098,1099,1103,1104],{"id":37,"depth":305,"text":38},{"id":142,"depth":305,"text":143},{"id":245,"depth":305,"text":246},{"id":485,"depth":305,"text":486},{"id":678,"depth":305,"text":679},{"id":740,"depth":305,"text":741},{"id":796,"depth":305,"text":797,"children":1100},[1101],{"id":816,"depth":334,"text":1102},"The one place activeTab stops being quiet",{"id":878,"depth":305,"text":879},{"id":1014,"depth":305,"text":1015},"/blog/chrome-extension-permissions/chrome-extension-permissions-hero.png","Title card reading \"Chrome Extension Permissions: What the Prompt Leaves Out\"","2026-08-27T00:00:00.000Z","Chrome shows you warnings, not permissions, and the two are different lists. More than forty permissions produce no line at all, one permission can hide another's line entirely, and the most alarming sentence in the box usually comes from the most ordinary thing an extension can ask for. Including our own extension's list, where eight of the thirteen permissions never reach the box.","md","/blog/chrome-extension-permissions/hero-bg.webp",{},"Chrome's install box shows warnings, not permissions. Forty-odd produce no line, and one can hide another. How to read what is actually there.",true,"/blog/chrome-extension-permissions",13,{"title":12,"description":1108},[1118,1124,1128,1133,1137,1141,1145,1149,1153,1157,1161,1166,1170],{"title":1119,"url":1120,"publisher":1121,"date":1122,"tier":294,"supports":1123},"Permissions reference","https://developer.chrome.com/docs/extensions/reference/permissions-list","Google","2026-08-27","Chrome's own table of every extension permission and the exact warning string it produces. It lists \"tabs\" as \"Read your browsing history\", \"favicon\" as \"Read the icons of the websites you visit\", \"bookmarks\" as \"Read and change your bookmarks\", \"clipboardWrite\" as \"Modify data you copy and paste\", \"tabGroups\" as \"View and manage your tab groups\", \"notifications\" as \"Display notifications\", \"history\" as \"Read and change your browsing history on all signed-in devices\", and \"management\" as \"Manage your apps, extensions, and themes\". It also names the permissions that produce no warning at all, a list that includes \"storage\", \"cookies\", \"scripting\", \"webRequest\", \"activeTab\", \"alarms\", \"contextMenus\", \"identity\", \"offscreen\", \"sidePanel\" and \"unlimitedStorage\".",{"title":1125,"url":1126,"publisher":1121,"date":1122,"tier":294,"supports":1127},"Permission warning guidelines","https://developer.chrome.com/docs/extensions/develop/concepts/permission-warnings","States that \"some permissions may not display warnings when paired with other permissions. For example, the \"tabs\" warning won't show if the extension also requests \"\u003Call_urls>\".\" Also states that an extension adding a permission that triggers a new warning is disabled until the user accepts it, and that \"activeTab\" does not display a permission warning.",{"title":1129,"url":1130,"publisher":1131,"date":1122,"tier":294,"supports":1132},"Chromium source: chrome_permission_message_rules.cc","https://chromium.googlesource.com/chromium/src/+/refs/heads/main/chrome/common/extensions/permissions/chrome_permission_message_rules.cc","The Chromium Project","The rule table that turns a set of permissions into the list of sentences Chrome prints. Each rule names a required permission and the permissions it absorbs. The rule keyed on kTab absorbs kFavicon and kTopSites; the rules keyed on kHistory, kWebNavigation and kProcesses absorb the same two; and the rules keyed on kFullAccess, kHostsAll and kHostsAllReadOnly absorb kFavicon, kTab and kTopSites among others.",{"title":1134,"url":1135,"publisher":1121,"date":1122,"tier":294,"supports":1136},"Declare permissions","https://developer.chrome.com/docs/extensions/develop/concepts/declare-permissions","Defines the four manifest fields that carry permissions: \"permissions\", \"optional_permissions\", \"host_permissions\" and \"optional_host_permissions\". Host permissions are declared as match patterns, and only the two non-optional fields are granted at install time.",{"title":1138,"url":1139,"publisher":1121,"date":1122,"tier":294,"supports":1140},"activeTab permission","https://developer.chrome.com/docs/extensions/develop/concepts/activeTab","States that activeTab grants temporary access to the current tab when the user invokes the extension, through the toolbar icon, a context menu item, a keyboard shortcut or an omnibox suggestion; that access is revoked on navigation to another origin or when the tab closes; and that it \"displays no warning message during installation\".",{"title":1142,"url":1143,"publisher":1121,"date":1122,"tier":294,"supports":1144},"chrome.cookies API","https://developer.chrome.com/docs/extensions/reference/api/cookies","States that \"to use the cookies API, declare the \"cookies\" permission in your manifest along with host permissions for any hosts whose cookies you want to access\", which is why the silent \"cookies\" permission cannot on its own read anything.",{"title":1146,"url":1147,"publisher":1121,"date":1122,"tier":294,"supports":1148},"chrome.webRequest API","https://developer.chrome.com/docs/extensions/reference/api/webRequest","States that \"you must declare the \"webRequest\" permission in the extension manifest to use the web request API, along with the necessary host permissions\", and that webRequestBlocking is available only to policy installed extensions as of Manifest V3.",{"title":1150,"url":1151,"publisher":1121,"date":1122,"tier":294,"supports":1152},"Change extension site access","https://support.google.com/chrome_webstore/answer/2664769","Chrome's user-facing instructions for the three site-access settings, described as access only when you select the extension, access on the current site, and access on all sites, changed from Extensions, Manage extensions, Details.",{"title":1154,"url":1155,"publisher":1121,"date":1122,"tier":294,"supports":1156},"Fill out the privacy fields","https://developer.chrome.com/docs/webstore/cws-dashboard-privacy","Names the nine data categories a Chrome Web Store developer must declare on the Privacy practices tab: personally identifiable information, health information, financial and payment information, authentication information, personal communications, location, web history, user activity and website content. States that \"your disclosures are displayed to Chrome users, and should be consistent with the existing privacy policy URL that you provided to the Chrome Web Store under your developer account page.\"",{"title":1158,"url":1159,"publisher":1121,"date":1122,"tier":294,"supports":1160},"TheTab: Chrome Web Store privacy practices","https://chromewebstore.google.com/detail/thetab/gpcpelphnlchgnnbbelodbcnaechefna/privacy","Our own listing's privacy tab, cited as the worked example. It declares the \"User activity\" category, described on the listing as \"network monitoring, clicks, mouse position, scroll, or keystroke logging\", and carries the three certifications about not selling data, not using it outside the item's core functionality, and not using it for creditworthiness or lending.",{"title":1162,"url":1163,"publisher":1164,"date":1122,"tier":294,"supports":1165},"Request the right permissions","https://extensionworkshop.com/documentation/develop/request-the-right-permissions/","Mozilla","Firefox's table of permissions and the exact text it shows users, including \"Access your data for all websites\" for broad host access, \"Access browser tabs\" for tabs, \"Access browsing history\" for history, \"Read and modify bookmarks\" for bookmarks, and \"Exchange messages with programs other than Firefox\" for nativeMessaging. It lists cookies, storage, webRequest, alarms, menus, identity, idle, unlimitedStorage and activeTab among the permissions that display no warning.",{"title":1167,"url":1168,"publisher":1164,"date":1122,"tier":294,"supports":1169},"Firefox built-in consent for data collection and transmission","https://extensionworkshop.com/documentation/develop/firefox-builtin-data-consent/","Names the data collection permission values an extension declares in its manifest, including personallyIdentifyingInfo, healthInfo, financialAndPaymentInfo, authenticationInfo, personalCommunications, locationInfo, browsingActivity, websiteContent, websiteActivity, searchTerms, bookmarksInfo, technicalAndInteraction, and the special value none. Required types appear in the install prompt; optional ones do not, except technicalAndInteraction, which the user can toggle during installation. Both are reviewable afterwards in about:addons under Permissions and data.",{"title":1171,"url":1172,"publisher":1164,"date":1173,"tier":294,"supports":1174},"Announcing data collection consent changes for new Firefox extensions","https://blog.mozilla.org/addons/2025/10/23/data-collection-consent-changes-for-new-firefox-extensions/","2025-10-23","Mozilla's announcement that as of 3 November 2025 all new Firefox extensions must declare whether they collect or transmit personal data, through browser_specific_settings.gecko.data_collection_permissions. The requirement applies to new extensions only, not to new versions of existing ones, and the consent prompt ships in Firefox 140 for desktop and 142 for Android.","blog/chrome-extension-permissions",[1177,1178,1179],"browser-extensions","privacy","productivity","Fjw8XfOBmHF_XSq9w1XGZ7WvOmolfV7msLC7YkC4l3k",[1179,1182,1177,1183,1184,1178,1185,1186],"tab-management","browser-performance","focus","browser-comparison","onetab-alternative",1787832182842]