{"id":8635,"date":"2019-03-26T18:52:49","date_gmt":"2019-03-27T01:52:49","guid":{"rendered":"http:\/\/blog.mozilla.org\/addons\/?p=8635"},"modified":"2019-05-31T09:16:56","modified_gmt":"2019-05-31T16:16:56","slug":"extensions-in-firefox-67","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/","title":{"rendered":"Extensions in Firefox 67"},"content":{"rendered":"<p>There are a couple of major changes coming to Firefox. One is in the current <a href=\"https:\/\/www.mozilla.org\/firefox\/channel\/desktop\/\" rel=\"noopener\">Beta 67 release<\/a>, while the other in the <a href=\"https:\/\/www.mozilla.org\/firefox\/channel\/desktop\/\" rel=\"noopener\">Nightly 68 release<\/a>, but is covered here as an early preview for extension developers.<\/p>\n<h1>Respecting User Privacy<\/h1>\n<p>The biggest change in release 67 is Firefox now offers controls to determine which extensions run in private browsing windows. Prior to this release, all extensions ran in all windows, normal and private, which wasn\u2019t in line with Mozilla\u2019s commitment to user privacy. Starting with release 67, though, both developers and users have ways to specify which extensions are allowed to run in private windows.<\/p>\n<h3>Going Incognito<\/h3>\n<p>For extension developers, Firefox now fully supports the value\u00a0<code>not_allowed<\/code> for the <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/manifest.json\/incognito\" rel=\"noopener\">manifest `incognito` key<\/a>. \u00a0As with Chrome, specifying <code>not_allowed<\/code> in the manifest will prevent the extension from running or receiving events from private windows.<\/p>\n<p>The <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/AMO\/Policy\/Reviews#Additional_Privacy_Protocols\" rel=\"noopener\">Mozilla Add-on Policies<\/a> require that extensions not store browsing data or leak identity information to private windows. Depending on what features your extension provides, using <code>not_allowed<\/code> might be an easy way to guarantee that your extension adheres to the policy.<\/p>\n<p>Note that Chrome\u2019s <code>split<\/code> value for <code>incognito<\/code> is not supported in Firefox at this time.<\/p>\n<h3>Raising User Awareness<\/h3>\n<p>There are significant changes in Firefox\u2019s behavior and user interface so that users can better see and control which extensions run in private windows. \u00a0Starting with release 67, any extension that is installed will be, by default, disallowed from running in private windows. The post-install door hanger, shown after an extension has been installed, now includes a checkbox asking the user if the extension should be allowed to run in private windows.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter wp-image-8636 size-full\" src=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/post-install.png\" alt=\"\" width=\"381\" height=\"153\" srcset=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/post-install.png 381w, https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/post-install-252x101.png 252w\" sizes=\"(max-width: 381px) 100vw, 381px\" \/><\/p>\n<p>To avoid potentially breaking existing user workflows, extensions that are already installed when a user upgrades from a previous version of Firefox to version 67 will automatically be granted permission to run in private windows. Only newly installed extensions will be excluded from private windows by default and subject to the installation flow described above.<\/p>\n<p>There are significant changes to the Add-ons Manager page (about:addons), too. First, a banner at the top of the page describes the new behavior in Firefox.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-8637\" src=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-banner.png\" alt=\"\" width=\"673\" height=\"114\" srcset=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-banner.png 673w, https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-banner-252x43.png 252w, https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-banner-600x102.png 600w\" sizes=\"(max-width: 673px) 100vw, 673px\" \/>This banner will remain in Firefox for at least two releases to make sure all users have a chance to understand and get used to the new policy.<\/p>\n<p>In addition, for each extension that is allowed to run in private windows, the Add-ons Manager will add a badge to the extension\u2019s card indicating that it has this permission, as shown below.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-8638\" src=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-card.png\" alt=\"\" width=\"677\" height=\"108\" srcset=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-card.png 677w, https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-card-252x40.png 252w, https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-card-600x96.png 600w\" sizes=\"(max-width: 677px) 100vw, 677px\" \/>The lack of a badge indicates that the extension is not allowed to run in private windows and will, therefore, only run in normal windows. To change the behavior and either grant or revoke permission to run in private windows, the user can click on an extension\u2019s card to bring up its details.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-8639\" src=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-detail.png\" alt=\"\" width=\"680\" height=\"488\" srcset=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-detail.png 680w, https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-detail-252x181.png 252w, https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/aom-detail-600x431.png 600w\" sizes=\"(max-width: 680px) 100vw, 680px\" \/>On the detail page, the user can choose to either allow or disallow the extension to run in private windows.<\/p>\n<p>Finally, to make sure that users of private windows are fully aware of the new extension behavior, Firefox will display a message the first time a user opens a new private window.<\/p>\n<p><img decoding=\"async\" loading=\"lazy\" class=\"aligncenter size-full wp-image-8640\" src=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/new-pb-window.png\" alt=\"\" width=\"367\" height=\"152\" srcset=\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/new-pb-window.png 367w, https:\/\/blog.mozilla.org\/addons\/files\/2019\/03\/new-pb-window-252x104.png 252w\" sizes=\"(max-width: 367px) 100vw, 367px\" \/><\/p>\n<h3>Proper Private Behavior<\/h3>\n<p>As a developer, you should take steps to ensure that, when the user has not granted your extension permission to run in private windows, it continues to work normally. If your extension depends on access to private windows, it is important to communicate this to your users, including the reasons why access is needed. You can use the <code>extension.isAllowedIncognitoAccess<\/code> API to determine whether users have granted your extension permission to run in private windows.<\/p>\n<p>Note that some WebExtension API may still affect private windows, even if the user has not granted the calling extension access to private windows. The <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/browserSettings\" rel=\"noopener\">browserSettings<\/a> API is the best example of this, where an extension may make changes to the general behavior of Firefox, including how private windows behave, without needing permission to access private windows.<\/p>\n<p>Finally, there is a <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1526299\" rel=\"noopener\">known issue<\/a> where some extensions that use the <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/proxy\/settings\" rel=\"noopener\">proxy.settings API<\/a> require private browsing permission to use that API even in normal windows (all other proxy API work as expected). Mozilla is working to address this and will be reaching out to impacted developers.<br \/>\n<a id=\"userscripts\"><\/a><\/p>\n<h1>User Scripts Are Coming<\/h1>\n<p>This is a bit of a teaser for Firefox 68, but after many months of design, implementation and testing, a WebExtensions user scripts API is just about ready. User scripts have been around for a very long time and are often closely associated with Firefox. \u00a0With the help of a user script extension such as <a href=\"https:\/\/www.greasespot.net\/\" rel=\"noopener\">Greasemonkey<\/a> or <a href=\"https:\/\/tampermonkey.net\/\" rel=\"noopener\">Tampermonkey<\/a>, users can find and install scripts that modify how sites look and\/or work, all without having to write an extension themselves.<\/p>\n<p>Support for user scripts is available by default in the Nightly version of Firefox 68, but can be enabled in both the current Firefox release (66) and Beta release (67) versions by setting the following preference in <code>about:config<\/code>:<\/p>\n<p style=\"padding-left: 30px;\"><code>extensions.webextensions.userScripts.enabled = true<\/code><\/p>\n<p>This is a fairly complex feature and we would love for developers to give it a try as early as possible, which is why it\u2019s being mentioned now. Documentation on MDN is still being developed, but below is a brief description of how this feature works.<\/p>\n<h3>Registering A User Script<\/h3>\n<p>The userScripts API provides a <code>browser.userScripts.register<\/code> API very similar to the <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/contentScripts\/register\" rel=\"noopener\">browser.contentScripts.register<\/a> API. It returns a promise which is resolved to an API object that provides an <code>unregister<\/code> method to unregister the script from all child processes.<\/p>\n<pre style=\"padding-left: 30px;\">const registeredUserScript = await browser.userScripts.register(\r\n   userScriptOptions \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/ object\r\n);\r\n\r\n...\r\nawait registeredUserScript.unregister();<\/pre>\n<p><code>userScriptOptions<\/code> is an object that represents the user scripts to register. It has the same syntax as the <code>contentScript<\/code> options supported by <code>browser.contentScripts.register<\/code> that describe which web pages the scripts should be applied to, but with two differences:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>It does not support a <code>css<\/code> property (use <code>browser.contentScripts.register<\/code> to dynamically register\/unregister stylesheets).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>It supports an optional property, <code>scriptMetadata<\/code>, a plain JSON object which contains metadata properties associated with the registered user script.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Providing User Script Functionality<\/h3>\n<p>To support injected user scripts, an extension must provide a special kind of content script called an <code>APIScript<\/code>. Like a regular content script, it:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>runs in the content processes<\/li>\n<li>has access to the window and document globals related to the webpage attached to it<\/li>\n<li>can use the <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/Content_scripts#WebExtension_APIs\">same subset of WebExtension APIs usually available in a content script<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>The <code>APIScript<\/code> is declared in the manifest using the <code>user_scripts.api_script property<\/code>:<\/p>\n<pre style=\"padding-left: 30px;\">manifest.json\r\n{\r\n  ...\r\n\r\n  \"user_scripts\": {\r\n    \"api_script\": \"apiscript.js\",\r\n  }\r\n}<\/pre>\n<p><code><\/code><br \/>\nThe <code>APIScript<\/code> is executed automatically on any page matched by the <code>userScript.register<\/code> API called from the same extension. It is executed before the user script is executed.<\/p>\n<p>The userScript API also provides a new event, <code>browser.userScripts.onBeforeScript<\/code>, which the <code>APIScript<\/code> can listen for. \u00a0It is called right before a matched user script is executed, allowing the <code>APIScript<\/code> to export custom API methods to the user script.<\/p>\n<p style=\"padding-left: 30px;\"><code>browser.userScripts.onBeforeScript.addListener(listener)<br \/>\nbrowser.userScripts.onBeforeScript.removeListener(listener)<br \/>\nbrowser.userScripts.onBeforeScript.hasListener(listener)<\/code><\/p>\n<p>In the above API, <code>listener<\/code> is a function called right before a user script is executed. The function will be passed a single argument, a <code>script<\/code> object that represents the user script that matched a web page. The <code>script<\/code> object provides the following properties and methods:<\/p>\n<ul>\n<li><code>metadata<\/code> &#8211; The <code>scriptMetadata<\/code> property that was set when the user script was registered via the <code>userScripts.register<\/code> API.<\/li>\n<li><code>global<\/code> &#8211; Provides access to the isolated sandbox for this particular user script.<\/li>\n<li><code>defineGlobals<\/code> &#8211; An API method that exports an object containing globally available properties and methods to the user script sandbox. \u00a0This method must be called synchronously to guarantee that the user script has not already executed.<\/li>\n<li><code>export<\/code> &#8211; An API method that converts a given value to a value that the user script code is allowed to access (this method can be used in API methods exported to the userScript to result or resolve non primitive values, the exported objects can also provide methods that the userScripts code is allowed to access and call).<\/li>\n<\/ul>\n<p>The example below shows how a listener might work:<\/p>\n<pre style=\"padding-left: 30px;\">browser.userScripts.onBeforeScript.addListener(function (script) {\r\n\r\n  script \/\/ This is an API object that represents the userScript\r\n         \/\/ that is going to be executed.\r\n\r\n  script.metadata \/\/ Access the userScript metadata (returns the\r\n                  \/\/ value of the scriptMetadata property from\r\n                  \/\/ the call to userScripts.register\r\n\r\n  \/\/ Export some global properties into the userScript sandbox\r\n  \/\/ (this method has to be called synchronously from the\r\n  \/\/ listener, otherwise the userScript may have been already\r\n  \/\/ be executed).\r\n  script.defineGlobals({\r\n    aGlobalPropertyAccessibleFromUserScriptCode: \u201cprop value\u201d,\r\n\r\n    myCustomAPIMethod(param1, param2) {\r\n      \/\/ Custom methods exported from the API script can use\r\n      \/\/ the WebExtensions APIs available to the extension\r\n      \/\/ content scripts\r\n      browser.runtime.sendMessage(...);\r\n      ...\r\n\r\n      return 123; \/\/ primitive values can be returned directly\r\n      ...\r\n\r\n      \/\/ Non primitive values have to be exported explicitly\r\n      \/\/ using the export method provided by the script API\r\n      \/\/ object\r\n      return script.export({{\r\n        objKey1: {\r\n          nestedProp: \"nestedvalue\",\r\n        },\r\n        \/\/ Explicitly exported objects can also provide methods.\r\n        objMethod() { ... }\r\n    },\r\n\r\n    async myAsyncMethod(param1, param2, param2) {\r\n    \/\/ exported methods can also be declared as async\r\n    },\r\n  });\r\n});<\/pre>\n<h2>Miscellaneous Items<\/h2>\n<p>It was a busy release and besides the two major features detailed above, a number of smaller features (and fixes) also made it into Firefox 67.<\/p>\n<ul>\n<li>Support for setting <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1230802\">storage.managed values via an enterprise policy<\/a>.<\/li>\n<li>Extension context menus now respect any <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1522820\">enterprise policy that has restricted the removal<\/a> of extensions.<\/li>\n<li>It is now possible to theme the <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1450114\">foreground and background colors of the selected text<\/a> in the URL bar.<\/li>\n<li>Corrected the implementation of <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1451079\">runtime.setUninstallURL to honor `null`<\/a> as an accepted value.<\/li>\n<li>Preserved the state of tabs, including <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1521346\">lazy loading, when moving<\/a> between windows.<\/li>\n<li>Updated the browser_style CSS to properly style <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1514567\">invalid input<\/a> elements.<\/li>\n<li>Prevented the built-in <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1520068\">CTRL+Page Up\/Down<\/a> keyboard shortcut from being assigned to an extension.<\/li>\n<li>Made the UI for extensions with a lot of keyboard shortcuts much <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1521826\">easier to understand<\/a> and navigate.<\/li>\n<li>Any optional permissions granted to extensions are now <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1522918\">properly removed<\/a> when the extension is uninstalled.<\/li>\n<li>Match patterns now properly support <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1529230\">IPv6 literals<\/a>.<\/li>\n<\/ul>\n<h2>Thank You<\/h2>\n<p>Within the WebExtensions API, a total of <a href=\"https:\/\/mzl.la\/2Ostoho\">74 bugs<\/a> were closed in Firefox 67. Volunteer contributors continue to be an integral part of the effort and a huge thank you goes out those that contributed to this release, including: <a href=\"https:\/\/mozillians.org\/Oriol\/\">Oriol Brufau<\/a>, <a href=\"https:\/\/mozillians.org\/u\/shailja.agarwala21\/\">Shailja Agarwala<\/a>, <a href=\"https:\/\/mozillians.org\/u\/edward.i.wu\/\">Edward Wu<\/a>, violet.bugreport and rugk. The combined efforts of Mozilla and its amazing community members are what make Firefox the best browser in the world.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>There are a couple of major changes coming to Firefox. One is in the current Beta 67 release, while the other in the Nightly 68 release, but is covered here &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/\">Read more<\/a><\/p>\n","protected":false},"author":1526,"featured_media":8388,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[44,227,278886],"tags":[278873,304461,278875,278871],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Extensions in Firefox 67 - Mozilla Add-ons Community Blog<\/title>\n<meta name=\"description\" content=\"Firefox 67 improves user control of extensions in private windows and adds user script capabilities.\" \/>\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\/2019\/03\/26\/extensions-in-firefox-67\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Mike Conca\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/\",\"name\":\"Extensions in Firefox 67 - Mozilla Add-ons Community Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.mozilla.org\/addons\/files\/2018\/01\/puzzle-1746563_640.png\",\"datePublished\":\"2019-03-27T01:52:49+00:00\",\"dateModified\":\"2019-05-31T16:16:56+00:00\",\"author\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/e06b9ebc82832ecd9f04e7dd59c65325\"},\"description\":\"Firefox 67 improves user control of extensions in private windows and adds user script capabilities.\",\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#primaryimage\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/files\/2018\/01\/puzzle-1746563_640.png\",\"contentUrl\":\"https:\/\/blog.mozilla.org\/addons\/files\/2018\/01\/puzzle-1746563_640.png\",\"width\":640,\"height\":640,\"caption\":\"Firefox Extensions\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/addons\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Extensions in Firefox 67\"}]},{\"@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\/e06b9ebc82832ecd9f04e7dd59c65325\",\"name\":\"Mike Conca\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/04780e375a532aeb20ec1365ce163109?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/04780e375a532aeb20ec1365ce163109?s=96&d=mm&r=g\",\"caption\":\"Mike Conca\"},\"description\":\"Mike Conca is the Group Product Manager for the Firefox Web Platform, leading the product team responsible for the core web technologies in Firefox including JavaScript, DOM Web API, WebAssembly, storage, layout, media, and graphics.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/mconca\/\",\"https:\/\/x.com\/MikeConca\"],\"url\":\"https:\/\/blog.mozilla.org\/addons\/author\/mconcamozilla-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Extensions in Firefox 67 - Mozilla Add-ons Community Blog","description":"Firefox 67 improves user control of extensions in private windows and adds user script capabilities.","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\/2019\/03\/26\/extensions-in-firefox-67\/","twitter_misc":{"Written by":"Mike Conca","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/","url":"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/","name":"Extensions in Firefox 67 - Mozilla Add-ons Community Blog","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/addons\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.mozilla.org\/addons\/files\/2018\/01\/puzzle-1746563_640.png","datePublished":"2019-03-27T01:52:49+00:00","dateModified":"2019-05-31T16:16:56+00:00","author":{"@id":"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/e06b9ebc82832ecd9f04e7dd59c65325"},"description":"Firefox 67 improves user control of extensions in private windows and adds user script capabilities.","breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#primaryimage","url":"https:\/\/blog.mozilla.org\/addons\/files\/2018\/01\/puzzle-1746563_640.png","contentUrl":"https:\/\/blog.mozilla.org\/addons\/files\/2018\/01\/puzzle-1746563_640.png","width":640,"height":640,"caption":"Firefox Extensions"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/addons\/2019\/03\/26\/extensions-in-firefox-67\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/addons\/"},{"@type":"ListItem","position":2,"name":"Extensions in Firefox 67"}]},{"@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\/e06b9ebc82832ecd9f04e7dd59c65325","name":"Mike Conca","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/04780e375a532aeb20ec1365ce163109?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/04780e375a532aeb20ec1365ce163109?s=96&d=mm&r=g","caption":"Mike Conca"},"description":"Mike Conca is the Group Product Manager for the Firefox Web Platform, leading the product team responsible for the core web technologies in Firefox including JavaScript, DOM Web API, WebAssembly, storage, layout, media, and graphics.","sameAs":["https:\/\/www.linkedin.com\/in\/mconca\/","https:\/\/x.com\/MikeConca"],"url":"https:\/\/blog.mozilla.org\/addons\/author\/mconcamozilla-com\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/8635"}],"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\/1526"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/comments?post=8635"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/8635\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/media\/8388"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/media?parent=8635"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/categories?post=8635"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/tags?post=8635"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}