{"id":9076,"date":"2022-11-17T03:46:31","date_gmt":"2022-11-17T11:46:31","guid":{"rendered":"https:\/\/blog.mozilla.org\/addons\/?p=9076"},"modified":"2023-07-05T12:18:18","modified_gmt":"2023-07-05T19:18:18","slug":"unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/","title":{"rendered":"Extensions button and how to handle permissions in Manifest V3"},"content":{"rendered":"<p>Manifest V3 (MV3) is bringing new user-facing changes to Firefox, including an extensions button to manage installed and enabled browser extension permissions (origin controls), providing Firefox users control over extension access to their browsers. The first building blocks of this button were added to Nightly in Firefox 107 and will become available with the general release of MV3 in Firefox 109.<\/p>\n<h2>Extensions button<\/h2>\n<div id=\"attachment_9067\" style=\"width: 610px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn.png\"><img aria-describedby=\"caption-attachment-9067\" decoding=\"async\" loading=\"lazy\" class=\"size-large wp-image-9067\" src=\"https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn-600x405.png\" alt=\"\" width=\"600\" height=\"405\" srcset=\"https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn-600x405.png 600w, https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn-252x170.png 252w, https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn-768x519.png 768w, https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn.png 1332w\" sizes=\"(max-width: 600px) 100vw, 600px\" \/><\/a><p id=\"caption-attachment-9067\" class=\"wp-caption-text\">The extensions button will give Firefox users direct control over website specific extension permissions.<\/p><\/div>\n<p>In MV2, host permissions are granted by the user at the time of install and there\u2019s no elegant way for the user to change this setting (short of uninstalling\/reinstalling and choosing different permissions). But with the new extensions button in MV3 in Firefox, users will have easy access and persistent control over which extensions can access any web page, at any time. Users are free to grant ongoing access to a website, or make a choice per visit. To enable this, MV3 treats host permissions (listed in the extension manifest) as opt-in.<\/p>\n<p>The button panel will display the user\u2019s installed and enabled extensions and their current permission state. In addition to managing host permissions, the panel also allows the user to manage, remove, or report the extension. Extensions with browser actions will behave similarly in the toolbar as in the panel.<\/p>\n<p>Manifest V2 (MV2) extensions will also display in the panel; however users can\u2019t take actions for MV2 host permissions since those were granted at installation and this choice cannot be reversed in MV2 without uninstalling the extension and starting again.<\/p>\n<p>You can also find more information about the <a href=\"https:\/\/support.mozilla.org\/en-US\/kb\/extensions-button\">extensions button from support.mozilla.org<\/a><\/p>\n<h2>How to deal with opt-in permissions in extension code<\/h2>\n<p><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/permissions\">The Permissions API<\/a> provides a way for developers to read and request permissions.<\/p>\n<p>With<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/permissions\/request\"> permissions.request()<\/a>, you can request specific permissions that have been defined as optional permissions in the manifest:<\/p>\n<pre><code>const permissionsToRequest = {\r\n  permissions: [\"bookmarks\", \"history\"],\r\n  origins: [\"https:\/\/developer.mozilla.org\/\"]\r\n}\r\n\r\nasync function requestPermissions() {\r\n  function onResponse(response) {\r\n    if (response) {\r\n      console.log(\"Permission was granted\");\r\n    } else {\r\n      console.log(\"Permission was refused\");\r\n    }\r\n\r\n    return browser.permissions.getAll();\r\n  }\r\n\r\n  const response = await browser.permissions.request(permissionsToRequest);\r\n  const currentPermissions = await onResponse(response);\r\n\r\n  console.log(`Current permissions:`, currentPermissions);\r\n}<\/code><\/pre>\n<p>This is handy when the request for permissions is tied to <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/User_actions\">a user action<\/a> like selecting a context menu item. Note that you cannot request for a permission that is not defined in the manifest.<\/p>\n<p>Other times, you\u2019ll want to react to a permission being granted or removed. This can be done with <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/permissions\/onAdded\">permissions.onAdded<\/a> and <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/permissions\/onRemoved\">permissions.onRemoved<\/a> respectively.<\/p>\n<pre><code>\r\nfunction handleAdded(permissions) {\r\n  console.log(`New API permissions: ${permissions.permissions}`);\r\n  console.log(`New host permissions: ${permissions.origins}`);\r\n}\r\n\r\nbrowser.permissions.onAdded.addListener(handleAdded);\r\n<\/code><\/pre>\n<p>Finally, you can check for already existing permissions in two different ways: <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/permissions\/getAll\">permissions.getAll()<\/a> returns a list of all granted permissions and <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/permissions\/contains\">permissions.contains(permissionsToCheck)<\/a> checks for specific permissions and resolves to true if, and only if, all checked permissions are granted.<\/p>\n<pre><code>\r\n\/\/ Extension permissions are:\r\n\/\/ \"webRequest\", \"tabs\", \"*:\/\/*.mozilla.org\/*\"\r\n\r\nlet testPermissions1 = {\r\n  origins: [\"*:\/\/mozilla.org\/\"],\r\n  permissions: [\"tabs\"]\r\n};\r\n\r\nconst testResult1 = await browser.permissions.contains(testPermissions1);\r\nconsole.log(testResult1); \/\/ true\r\n\r\n<\/code><\/pre>\n<p>We always encourage feedback from our developer community, so don\u2019t hesitate to get in touch:<code><\/code><\/p>\n<ul>\n<li aria-level=\"1\">Chat: <a href=\"https:\/\/chat.mozilla.org\/#\/room\/#addons:mozilla.org\" target=\"_blank\" rel=\"noopener\">chat.mozilla.org<\/a><\/li>\n<li aria-level=\"1\">Report issues and ask questions on<a href=\"https:\/\/discourse.mozilla.org\/c\/add-ons\/35\" target=\"_blank\" rel=\"noopener\"> Discourse<\/a> (where knowledge may be shared among other developers)<\/li>\n<li aria-level=\"1\">Report problems on:<a href=\"https:\/\/bugzilla.mozilla.org\/enter_bug.cgi?product=WebExtensions\" target=\"_blank\" rel=\"noopener\"> Bugzilla<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Manifest V3 (MV3) is bringing new user-facing changes to Firefox, including an extensions button to manage installed and enabled browser extension permissions (origin controls), providing Firefox users control over extension &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/\">Read more<\/a><\/p>\n","protected":false},"author":1910,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[44,278886],"tags":[322922],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Extensions button and how to handle permissions in Manifest V3 - Mozilla Add-ons Community Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Juha-Matti Santala\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/\",\"name\":\"Extensions button and how to handle permissions in Manifest V3 - Mozilla Add-ons Community Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn-600x405.png\",\"datePublished\":\"2022-11-17T11:46:31+00:00\",\"dateModified\":\"2023-07-05T19:18:18+00:00\",\"author\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/fd33b2805840bce3d501e2441481b6c8\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#primaryimage\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn.png\",\"contentUrl\":\"https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn.png\",\"width\":1332,\"height\":900,\"caption\":\"The Unified Extensions button will give Firefox users direct control over website specific extension permissions.\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/addons\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Extensions button and how to handle permissions in Manifest V3\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#website\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/\",\"name\":\"Mozilla Add-ons Community Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.mozilla.org\/addons\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/fd33b2805840bce3d501e2441481b6c8\",\"name\":\"Juha-Matti Santala\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cff31adb9c2efc823393ac2a60f0f6f1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cff31adb9c2efc823393ac2a60f0f6f1?s=96&d=mm&r=g\",\"caption\":\"Juha-Matti Santala\"},\"description\":\"I'm a developer advocate for add-ons at Mozilla. A Finnish dude who loves to build communities, teach programming and help developers have a positive impact in the world and humanity through technology.\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/author\/jsantalamozilla-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Extensions button and how to handle permissions in Manifest V3 - Mozilla Add-ons Community Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/","twitter_misc":{"Written by":"Juha-Matti Santala","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/","url":"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/","name":"Extensions button and how to handle permissions in Manifest V3 - Mozilla Add-ons Community Blog","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/addons\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn-600x405.png","datePublished":"2022-11-17T11:46:31+00:00","dateModified":"2023-07-05T19:18:18+00:00","author":{"@id":"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/fd33b2805840bce3d501e2441481b6c8"},"breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#primaryimage","url":"https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn.png","contentUrl":"https:\/\/blog.mozilla.org\/addons\/files\/2022\/10\/blog_uni_ex_btn.png","width":1332,"height":900,"caption":"The Unified Extensions button will give Firefox users direct control over website specific extension permissions."},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/addons\/2022\/11\/17\/unified-extensions-button-and-how-to-handle-permissions-in-manifest-v3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/addons\/"},{"@type":"ListItem","position":2,"name":"Extensions button and how to handle permissions in Manifest V3"}]},{"@type":"WebSite","@id":"https:\/\/blog.mozilla.org\/addons\/#website","url":"https:\/\/blog.mozilla.org\/addons\/","name":"Mozilla Add-ons Community Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.mozilla.org\/addons\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/fd33b2805840bce3d501e2441481b6c8","name":"Juha-Matti Santala","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cff31adb9c2efc823393ac2a60f0f6f1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cff31adb9c2efc823393ac2a60f0f6f1?s=96&d=mm&r=g","caption":"Juha-Matti Santala"},"description":"I'm a developer advocate for add-ons at Mozilla. A Finnish dude who loves to build communities, teach programming and help developers have a positive impact in the world and humanity through technology.","url":"https:\/\/blog.mozilla.org\/addons\/author\/jsantalamozilla-com\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/9076"}],"collection":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/users\/1910"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/comments?post=9076"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/9076\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/media?parent=9076"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/categories?post=9076"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/tags?post=9076"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}