{"id":9294,"date":"2026-04-23T14:30:12","date_gmt":"2026-04-23T21:30:12","guid":{"rendered":"https:\/\/blog.mozilla.org\/addons\/?p=9294"},"modified":"2026-04-23T15:42:45","modified_gmt":"2026-04-23T22:42:45","slug":"webextensions-api-changes-firefox-149-152","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/","title":{"rendered":"WebExtensions API Changes (Firefox 149-152)"},"content":{"rendered":"<h2>Intro<\/h2>\n<p>Hey everyone, we\u2019ve been working on some exciting changes, and want to share them with you.<\/p>\n<p>But first, let me introduce myself. I am Christos, the new Sr. Developer Relations engineer in Add-ons, and I\u2019m excited to write my first post on the Add-ons engineering blog.<\/p>\n<h2><b>Deprecations and changes<\/b><\/h2>\n<p>To start, I&#8217;m looking at a couple of features that are going away: avoiding content script execution in extension contexts, decoupling file access from host permissions, and improving the display of <span style=\"color: #339966;\">pageAction<\/span> SVG icon.<\/p>\n<h2><b>executeScript \/ registerContentScript in moz-extension documents<\/b><\/h2>\n<p><strong>Deprecated: Firefox 149\u00a0 Removed: Firefox 152<\/strong><\/p>\n<p>Starting in Firefox Nightly 149 and scheduled for Firefox 152, the scripting and tabs injection APIs no longer inject into <span style=\"color: #339966;\">moz-extension:\/\/<\/span>documents. This change brings the API in line with broader efforts to discourage string-based code execution in extension contexts, alongside the default CSP that restricts <span style=\"color: #339966;\">script-src<\/span> to extension URLs and the removal of remote source allowlisting in MV3 (<a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1581608\">bug 1581608<\/a>).<\/p>\n<p>Firefox emits a warning when this restriction is met, so you are aware of and can address any use of this process in your extensions. This is an example of the warning message:<\/p>\n<p><a href=\"https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone size-medium wp-image-9295\" src=\"https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137-580x69.png\" alt=\"\" width=\"580\" height=\"69\" srcset=\"https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137-580x69.png 580w, https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137.png 678w\" sizes=\"(max-width: 580px) 100vw, 580px\" \/><\/a><\/p>\n<blockquote><p><em>Content Script execution in moz-extension document has been deprecated and it has been blocked<\/em><\/p><\/blockquote>\n<p><b>To work around this change, <\/b>\u00a0you can:<\/p>\n<ul>\n<li aria-level=\"1\"><b>Import scripts directly<\/b> in the extension page\u2019s HTML.<\/li>\n<li aria-level=\"1\">Use module imports or standard <span style=\"color: #339966;\">&lt;script&gt;<\/span> tags in extension documents.<\/li>\n<li aria-level=\"1\">Restructure code to avoid dynamic code execution patterns. An extension can run code in its documents dynamically by registering a<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/runtime\/onMessage\"> runtime.onMessage<\/a> listener in the document&#8217;s script, then sending a message to trigger execution of the required code.<\/li>\n<\/ul>\n<h2><b>File access becomes opt-in<\/b><\/h2>\n<p><b>Target<\/b>: Firefox 152<\/p>\n<p>Extensions requesting <span style=\"color: #339966;\">file:\/\/*\/<\/span> or <span style=\"color: #339966;\">&lt;all_urls&gt;<\/span> currently trigger the \u201cAccess your data for all websites&#8221; permission message, and when granted, can run content scripts in file:-URLs. From Firefox 152, file access in extensions requires an opt-in for all extensions, including those already installed (<a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2034168\">bug 2034168<\/a>).<\/p>\n<h2><\/h2>\n<h2><b>pageAction SVG icon CSS filter (automatic color scheme)<\/b><\/h2>\n<p><b>Removed<\/b>: Firefox 152<\/p>\n<p>Firefox has been automatically applying a greyscale and brightness CSS filter to <span style=\"color: #339966;\"><span style=\"color: #339966;\">pageAction<\/span><\/span> (address bar button) SVG icons when a dark theme is active. This was intended to improve contrast, but it actually reduced contrast for multi-color icons and caused poor visibility for some extensions, such as Firefox Multi-Account Containers.<\/p>\n<p>For icons that adapt to light and dark color schemes, you can now use <span style=\"color: #339966;\">@media (prefers-color-scheme: dark<\/span>) in the SVG icon, or the MV3 <span style=\"color: #339966;\">action<\/span> manifest key, and specify <span style=\"color: #339966;\"><span style=\"color: #000000;\"><span style=\"color: #339966;\">theme_icons<\/span><\/span><\/span>.<\/p>\n<p>Here is an example of how to use a `prefers-color-scheme` media query in a pageAction SVG icon to control how the icon adapts to dark mode:<\/p>\n<p><b>manifest.json<\/b><\/p>\n<pre>\"page_action\": {\r\n  \"default_icon\": \"icons\/icon.svg\"\r\n}<\/pre>\n<p><b>icons\/icon.svg<\/b><\/p>\n<pre>&lt;svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\"&gt;\r\n  &lt;style&gt;\r\n    :root { color: black; }\r\n    @media (prefers-color-scheme: dark) { :root { color: white; } }\r\n  &lt;\/style&gt;\r\n  &lt;path fill=\"currentColor\" d=\"M2 2h12v12H2z\"\/&gt;\r\n&lt;\/svg&gt;<\/pre>\n<p>Use of <span style=\"color: #339966;\">prefers-color-scheme<\/span> media queries is also allowed in MV2 <span style=\"color: #339966;\"><span style=\"color: #339966;\">browserAction<\/span><\/span> and MV3 action SVG icons as an alternative to the <span style=\"color: #339966;\">theme_icons<\/span> manifest properties.<\/p>\n<p>There are additional <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/user_interface\/Page_actions#icons\">examples at the Mozilla Developer Network<\/a> on how to test your extension pageAction icon with and without the implicit CSS filter.<\/p>\n<hr \/>\n<h2><b>New APIs &amp; Capabilities<\/b><\/h2>\n<p>Now to the new stuff. Here, you get the ability to use popups without user activation, initial support for the new tab split view feature, and WebAuthn RP ID assertion.<\/p>\n<h2><b>openPopup without user activation (Firefox Desktop)<\/b><\/h2>\n<p><b>Available<\/b>: Firefox 149 Desktop<\/p>\n<p><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/action\/openPopup\">action.openPopup()<\/a> and <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/browserAction\/openPopup\">browserAction.openPopup()<\/a> no longer require a user gesture on Firefox Desktop. You can open your extension&#8217;s popup programmatically, e.g., in response to a native-messaging event, an alarm, or a background-script condition.<\/p>\n<p>This change is part of the ongoing cross-browser alignment work in the<a href=\"https:\/\/github.com\/w3c\/webextensions\"> WebExtensions Community Group<\/a> to harmonize popup behavior across engines.<\/p>\n<p>Example<\/p>\n<p><b>Before (Firefox &lt; 149)<\/b>: must hang off a user gesture, e.g., a context menu click:<\/p>\n<pre>browser.menus.create({\r\n  id: \"nudge\",\r\n  title: \"Open popup\",\r\n  contexts: [\"all\"],\r\n});\r\n\r\nbrowser.menus.onClicked.addListener((info) =&gt; {\r\n  if (info.menuItemId === \"nudge\") {\r\n    browser.action.openPopup(); \/\/ user clicked the menu \u2192 allowed\r\n  }\r\n});<\/pre>\n<p>&nbsp;<\/p>\n<p><b>After (Firefox \u2265 149)<\/b> \u2014 same intent, no user gesture needed, fires from a timer:<\/p>\n<pre>browser.alarms.create(\"nudge\", { delayInMinutes: 1 });\r\n\r\nbrowser.alarms.onAlarm.addListener((alarm) =&gt; {\r\n  if (alarm.name === \"nudge\") {\r\n    browser.action.openPopup(); \/\/ works without a click\r\n  }\r\n});<\/pre>\n<p>It\u2019s the same call with the same result, but only the trigger changes from a user-action handler to any background event.<\/p>\n<p>It\u2019s the same call with the same result, but only the trigger changes from a user-action handler to any background event.<\/p>\n<h2><\/h2>\n<h2><b>splitViewId in the tabs API<\/b><\/h2>\n<p><b>Available<\/b>: Firefox 149<\/p>\n<p>Firefox 149 introduces a new <b>read-only <\/b><span style=\"color: #339966;\"><b>splitViewId<\/b><\/span><b> property<\/b> on the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/tabs\/Tab\">tabs.Tab<\/a> object to expose Firefox&#8217;s new <a href=\"https:\/\/support.mozilla.org\/en-US\/kb\/split-view-firefox\">split view<\/a> feature (where two tabs are displayed side-by-side in one window). Split views are treated as one unit, and Web Extensions treat them the same way.<\/p>\n<p>In Firefox 150, extensions can swap tabs within a split view. This update also resolves a confusing issue where using the user interface to reverse tab order incorrectly reports the <span style=\"color: #339966;\">tabs.onMoved<\/span> event with inaccurate values. Additionally, Firefox introduces unsplitting behavior for web extensions: when <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/tabs\/move\">tabs.move()<\/a> is called with <span style=\"color: #339966;\">split-view<\/span> tabs positioned separately (non-adjacently) in the array. Now, after the call, Firefox removes the split view rather than keeping the tabs locked together.<\/p>\n<p>Here is an example of using the new <span style=\"color: #339966;\">splitViewId<\/span> property.<\/p>\n<pre>\/\/ Log whenever a tab joins or leaves a split view.\r\nbrowser.tabs.onUpdated.addListener((tabId, changeInfo) =&gt; {\r\n  if (!(\"splitViewId\" in changeInfo)) return;\r\n\r\n  if (changeInfo.splitViewId === browser.tabs.SPLIT_VIEW_ID_NONE) {\r\n    console.log(`Tab ${tabId} left its split view`);\r\n  } else {\r\n    console.log(`Tab ${tabId} joined split view ${changeInfo.splitViewId}`);\r\n  }\r\n});\r\n\/\/ Firefox desktop also supports a filter to limite onUpdated events:\r\n\/\/ }, { properties: [\"splitViewId\"] });<\/pre>\n<p>&nbsp;<\/p>\n<p>Firefox 151 enables extensions to move split views in tab groups. More improvements are coming, such as the ability to create split views from extensions (<a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=2016928\">bug 2016928<\/a>).<\/p>\n<p>&nbsp;<\/p>\n<h2><b>WebAuthn RP ID assertion<\/b><\/h2>\n<p><b>Available<\/b>: Firefox 150<\/p>\n<p>Previously, web extensions couldn&#8217;t use WebAuthn credentials registered on their company&#8217;s website or mobile apps. When extensions tried to set a custom Relying Party ID (RP ID) in <span style=\"color: #339966;\">navigator.credentials.create()<\/span> or <span style=\"color: #339966;\">navigator.credentials.get()<\/span>, Firefox rejected it with &#8220;SecurityError: The operation is insecure.&#8221;<\/p>\n<p>With Firefox 150, Extensions can now <b>assert a <\/b><a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/Use_the_web_authn_api\"><b>WebAuthn RP ID<\/b><\/a><b> for any domain they have host permissions for<\/b><\/p>\n<p>when calling <span style=\"color: #339966;\">navigator.credentials.create()<\/span> or <span style=\"color: #339966;\">navigator.credentials.get()<\/span>. This applies to both the <span style=\"color: #339966;\">publicKey.rp.id<\/span> field during credential creation and the <span style=\"color: #339966;\">publicKey.rpId<\/span> field during authentication.<\/p>\n<p><b>A critical detail for server-side validation:<\/b> When relying party servers validate credentials created by extensions, they must account for <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/Use_the_web_authn_api#extension_origin_and_server-side_validation\">different origin formats across browsers<\/a>. In Chrome, the origin follows the pattern <span style=\"color: #339966;\">chrome-extension:\/\/extensionid<\/span>, which matches the extension&#8217;s <span style=\"color: #339966;\">location.origin<\/span>. Firefox 150 introduces a new stable origin format: <span style=\"color: #339966;\">moz-extension:\/\/hash<\/span>, where the hash is a 64-character SHA-256 representation of the extension ID (using characters a-p to represent hex values). Importantly, this hash-based origin is the same all users, unlike Firefox&#8217;s existing UUID-based <span style=\"color: #339966;\">moz-extension:\/\/<\/span> URLs used for extension documents.<\/p>\n<p>To extract the origin from a credential for validation:<\/p>\n<pre>let clientData = JSON.parse(new TextDecoder().decode(\r\n  publicKeyCredential.response.clientDataJSON\r\n));\r\nconsole.log(clientData.origin);<\/pre>\n<p>For more details, see <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/Use_the_web_authn_api\">Use Web Authn API in web extensions<\/a> on MDN.<\/p>\n<h2><b>Summary<\/b><\/h2>\n<table>\n<tbody>\n<tr>\n<td><b>Change<\/b><\/td>\n<td><b>Type<\/b><\/td>\n<td><b>Firefox Version<\/b><\/td>\n<\/tr>\n<tr>\n<td><span style=\"color: #339966;\">executeScript \/ registerContentScript<\/span> in <span style=\"color: #339966;\">moz-extension<\/span> documents<\/td>\n<td>Deprecation \u2192 Removal<\/td>\n<td>Deprecated 149, removed 152<\/td>\n<\/tr>\n<tr>\n<td>File access opt-in<\/td>\n<td>Change<\/td>\n<td>152<\/td>\n<\/tr>\n<tr>\n<td><span style=\"color: #339966;\">pageAction<\/span> SVG CSS filter<\/td>\n<td>Removal<\/td>\n<td>152<\/td>\n<\/tr>\n<tr>\n<td><span style=\"color: #339966;\">openPopup()<\/span> without user activation<\/td>\n<td>New capability<\/td>\n<td>149 (Desktop only)<\/td>\n<\/tr>\n<tr>\n<td><span style=\"color: #339966;\">splitViewId<\/span> on <span style=\"color: #339966;\">tabs.Tab<\/span><\/td>\n<td>New API<\/td>\n<td>149<\/td>\n<\/tr>\n<tr>\n<td>WebAuthn RP ID assertion<\/td>\n<td>New capability<\/td>\n<td>150<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2><b>Need more?<\/b><\/h2>\n<p>You can always find detailed information about WebExtensions API and Add-ons updates in the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Firefox\/Releases\">MDN release notes<\/a>, e.g., for <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Firefox\/Releases\/149#changes_for_add-on_developers\">Firefox 149<\/a> and <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Firefox\/Releases\/150#changes_for_add-on_developers\">Firefox 150<\/a>.<\/p>\n<p>For any help or questions navigating any changes, don\u2019t hesitate to post your topic on the <a href=\"https:\/\/discourse.mozilla.org\/c\/add-ons\/35\">Add-ons Discourse<\/a>.<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro Hey everyone, we\u2019ve been working on some exciting changes, and want to share them with you. But first, let me introduce myself. I am Christos, the new Sr. Developer &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/\">Read more<\/a><\/p>\n","protected":false},"author":2039,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[388,44,295,227,278886],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>WebExtensions API Changes (Firefox 149-152) - 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\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"cbacharakis@mozilla.com\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/\",\"name\":\"WebExtensions API Changes (Firefox 149-152) - Mozilla Add-ons Community Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137-580x69.png\",\"datePublished\":\"2026-04-23T21:30:12+00:00\",\"dateModified\":\"2026-04-23T22:42:45+00:00\",\"author\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/83a047c76910255b455ef06faafc194a\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#primaryimage\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137.png\",\"contentUrl\":\"https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137.png\",\"width\":678,\"height\":81},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/addons\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"WebExtensions API Changes (Firefox 149-152)\"}]},{\"@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\/83a047c76910255b455ef06faafc194a\",\"name\":\"cbacharakis@mozilla.com\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/8b0f872ddf5a2dd99475e60360cdabd1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/8b0f872ddf5a2dd99475e60360cdabd1?s=96&d=mm&r=g\",\"caption\":\"cbacharakis@mozilla.com\"},\"url\":\"https:\/\/blog.mozilla.org\/addons\/author\/cbacharakismozilla-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"WebExtensions API Changes (Firefox 149-152) - 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\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/","twitter_misc":{"Written by":"cbacharakis@mozilla.com","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/","url":"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/","name":"WebExtensions API Changes (Firefox 149-152) - Mozilla Add-ons Community Blog","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/addons\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137-580x69.png","datePublished":"2026-04-23T21:30:12+00:00","dateModified":"2026-04-23T22:42:45+00:00","author":{"@id":"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/83a047c76910255b455ef06faafc194a"},"breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#primaryimage","url":"https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137.png","contentUrl":"https:\/\/blog.mozilla.org\/addons\/files\/2026\/04\/Screenshot-2026-04-14-092137.png","width":678,"height":81},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/addons\/2026\/04\/23\/webextensions-api-changes-firefox-149-152\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/addons\/"},{"@type":"ListItem","position":2,"name":"WebExtensions API Changes (Firefox 149-152)"}]},{"@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\/83a047c76910255b455ef06faafc194a","name":"cbacharakis@mozilla.com","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/8b0f872ddf5a2dd99475e60360cdabd1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/8b0f872ddf5a2dd99475e60360cdabd1?s=96&d=mm&r=g","caption":"cbacharakis@mozilla.com"},"url":"https:\/\/blog.mozilla.org\/addons\/author\/cbacharakismozilla-com\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/9294"}],"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\/2039"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/comments?post=9294"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/9294\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/media?parent=9294"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/categories?post=9294"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/tags?post=9294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}