{"id":9066,"date":"2022-10-31T14:59:34","date_gmt":"2022-10-31T21:59:34","guid":{"rendered":"https:\/\/blog.mozilla.org\/addons\/?p=9066"},"modified":"2023-01-12T10:55:10","modified_gmt":"2023-01-12T18:55:10","slug":"begin-your-mv3-migration-by-implementing-new-features-today","status":"publish","type":"post","link":"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/","title":{"rendered":"Begin your MV3 migration by implementing new features today"},"content":{"rendered":"<p>Early next year, Firefox will release Mozilla\u2019s Manifest V3 (MV3). Therefore, it\u2019s an ideal time to consider <a href=\"https:\/\/extensionworkshop.com\/documentation\/develop\/manifest-v3-migration-guide\/\" target=\"_blank\" rel=\"noopener\">migrating your Manifest V2 extensions<\/a>. One of our goals throughout our approach to MV3 has been to gradually release new WebExtensions features that enable you to begin implementing APIs that are compatible with MV3. To this end, we recently released some exciting new features you should know about\u2026<\/p>\n<p>&nbsp;<\/p>\n<h2>MV3 changes you can make to your extension right now<\/h2>\n<p>&nbsp;<\/p>\n<h3>Event Pages<\/h3>\n<p>In Firefox MV3, we\u2019re providing Event Pages as the background script. Event Pages retain several important features, including access to DOM and <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\" target=\"_blank\" rel=\"noopener\">WebAPIs<\/a> that are not available with the new service worker backgrounds used in Google Chrome.<\/p>\n<p>We enabled Event Pages for MV2 (aka non-persistent background pages that can be closed and respawned based on browser events) in Firefox 106. This update is a major step toward MV3 because all extensions must adopt Event Pages in MV3. But you can make this change today and use new Event Pages benefits such as:<\/p>\n<ul>\n<li aria-level=\"1\">Resiliency against unexpected system crashes. Now we can restart a corrupted background page without hindering the user.<\/li>\n<li aria-level=\"1\">No need for an extension reboot to reset a background page.<\/li>\n<li aria-level=\"1\">Save on memory resources by putting idle background pages to sleep.<\/li>\n<\/ul>\n<h4>How do I implement Event Pages?<\/h4>\n<p>To turn your background into an Event Page, set `persistent: false` on the background page in your manifest.json. Here\u2019s more <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/Background_scripts\" target=\"_blank\" rel=\"noopener\">info on background scripts<\/a> with <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/Background_scripts#specify_the_background_scripts\" target=\"_blank\" rel=\"noopener\">implementation details<\/a>.<\/p>\n<p>Now that your background script is non-persistent, you need to tell Firefox when to wake up the page if it\u2019s suspended. There are two methods available:<\/p>\n<ol>\n<li aria-level=\"1\"><b>Use an event listener like `browser.tabs.onCreated` in your background script<\/b>.\u00a0 Event listeners must be added at the top level execution of your script. This way, if your background is sleeping Firefox knows to wake the script whenever a new tab is spawned. This works with nearly all events in the WebExtensions API. Here\u2019s more <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/Background_scripts#add_listeners\" target=\"_blank\" rel=\"noopener\">info on adding listeners<\/a>. (Note that Firefox recognizes arguments passed to addListener and does not create multiple listeners for the same set of arguments.)<\/li>\n<li aria-level=\"1\"><b>Use `browser.runtime.getBackgroundPage` if you need a background page to run processes unrelated to events<\/b>. For instance, you may need a background script to run a process while the user is involved with a browser action or side panel. Use this API anytime you need direct access to a background page that may be suspended or closed. Here\u2019s more <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/Background_scripts#update_calls_for_background_script_functions\" target=\"_blank\" rel=\"noopener\">info on background script functions<\/a>.<\/li>\n<\/ol>\n<p><a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/menus\" target=\"_blank\" rel=\"noopener\">Menus<\/a> and <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/API\/scripting\" target=\"_blank\" rel=\"noopener\">Scripting<\/a> APIs also support persistent data:<\/p>\n<ul>\n<li aria-level=\"1\">Menu items created by an event page are available after they\u2019re registered \u2014 even if the event page is terminated. The event page respawns as necessary to menu events.<\/li>\n<li aria-level=\"1\">Registered scripts can be injected into matching web pages without the need for a running Event Page.<\/li>\n<\/ul>\n<h3>Scripting<\/h3>\n<p>You can take another big step toward MV3 by switching to the new Scripting API. This API consolidates several scripting related APIs \u2014 contentScripts.register(), tabs.insertCSS(), tabs.removeCSS(), and tabs.executeScript() \u2014 and adds capabilities to register, update, and unregister content scripts at runtime.<\/p>\n<p>Also, arbitrary strings can no longer be executed because the code parameter has been removed. So you\u2019ll need to move any arbitrary strings executed as scripts into files contained within the extension, or to the func property used with, if necessary, the args parameter.<\/p>\n<p>This API requires the<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/manifest.json\/permissions\" target=\"_blank\" rel=\"noopener\"> scripting permission<\/a>.<\/p>\n<h2>Preparing for MV3 restrictions<\/h2>\n<p>MV3 will impose enhanced restrictions on several features. Most of these restrictions are outlined in the <a href=\"https:\/\/extensionworkshop.com\/documentation\/develop\/manifest-v3-migration-guide\/\" target=\"_blank\" rel=\"noopener\">MV3 migration guide<\/a>. By following the steps detailed in the guide, there are some ways you can begin modifying your MV2 extension to make it comply more closely with MV3 requirements. A few noteworthy areas include\u2026<\/p>\n<h3>Conform to MV3\u2019s Content Security Policy<\/h3>\n<p>Mozilla\u2019s long-standing <a href=\"https:\/\/extensionworkshop.com\/documentation\/publish\/add-on-policies\/\" target=\"_blank\" rel=\"noopener\">add-on policies<\/a> prohibit remote code execution. In keeping with these policies, the <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/manifest.json\/content_security_policy\" target=\"_blank\" rel=\"noopener\">content_security_policy<\/a> field no longer supports sources permitting remote code in script-related directives, such as script-src or `\u2019unsafe-eval\u2019`. The only permitted values for the `script-src` directive is `\u2019self\u2019` and `\u2019wasm-unsafe-eval\u2019`. `\u2019wasm-unsafe-eval\u2019` must be specified in the CSP if an extension wants to use WebAssembly. In MV3, content scripts are subject to the same CSP as other parts of the extension.<\/p>\n<p>Historically, a custom extension CSP required object-src to be specified. This is not required in MV3 and was removed from MV2 in Firefox 106 (see <a href=\"https:\/\/developer.mozilla.org\/docs\/Mozilla\/Add-ons\/WebExtensions\/manifest.json\/content_security_policy#object-src_directive\" target=\"_blank\" rel=\"noopener\">object-src in content_security_policy on MDN<\/a>). This change makes it easier for extensions to customize the CSP with minimal boilerplate.<\/p>\n<p>The <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/HTTP\/CSP\" target=\"_blank\" rel=\"noopener\">Content Security Policy<\/a> (CSP) is more restrictive in MV3. If you are using a custom CSP in your MV2 add-on, you can validate the CSP by temporarily running it as an MV3 extension.\u00a0 See the <a href=\"https:\/\/extensionworkshop.com\/documentation\/develop\/manifest-v3-migration-guide\/\" target=\"_blank\" rel=\"noopener\">MV3 migration guide<\/a> for details.<\/p>\n<h3>Upgrade insecure requests &#8211; https by default<\/h3>\n<p>When communicating with external servers, extensions <a href=\"https:\/\/bugzilla.mozilla.org\/show_bug.cgi?id=1797086\" target=\"_blank\" rel=\"noopener\">will use https by default<\/a>. Extensions should replace the \u201chttp:\u201d and \u201dws:\u201d schemes in their source code with secure alternatives, \u201chttps:\u201d and \u201dwss:\u201d. The default MV3 CSP includes the upgrade-secure-requests directive, to enforce the use of secure schemes even if an insecure scheme was used.<\/p>\n<p>Extensions can opt out of this https requirement by overriding the content_security_policy and omitting the upgrade-secure-requests, provided that no user data is transmitted insecurely through the extension.<\/p>\n<h3>Opt-in permissions<\/h3>\n<p>All MV3 permissions, including host permissions, are opt-in for users. This necessitated a significant Firefox design change \u2014 the introduction of the extensions button \u2014 so users can easily grant or deny website specific permissions at any time (the button is enabled on Firefox Nightly for early testing and feedback).<\/p>\n<div id=\"attachment_9067\" style=\"width: 610px\" class=\"wp-caption aligncenter\"><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\" \/><p id=\"caption-attachment-9067\" class=\"wp-caption-text\">The extensions button gives Firefox users direct control over website specific extension permissions.<\/p><\/div>\n<p>Therefore, you must ensure your extension has permission whenever it accesses APIs covered by a permission, accesses a tab, or uses <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/Fetch_API\" target=\"_blank\" rel=\"noopener\">Fetch API<\/a>. MV2 already has APIs that enables you to check for permissions and watch for changes in permission. When necessary, you can get the current permission status. However, rather than always checking, use the permissions.onAdded and permissions.onRemoved event APIs to watch for changes.<\/p>\n<h3>Update content scripts<\/h3>\n<p>While content scripts continue to have access to the same extension APIs in MV3 as in MV2, most of the special exceptions and extension specific capabilities have been removed from the web platform APIs (DOM APIs). In particular, the extension\u2019s host permissions no longer apply to Fetch and XMLHttpRequest.<\/p>\n<h4>CSP for content scripts<\/h4>\n<p>With MV2 no CSP is applied to content scripts. In MV3, content scripts are subjected to the same CSP as other parts of the extension (see <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Mozilla\/Add-ons\/WebExtensions\/Content_Security_Policy#csp_for_content_scripts\" target=\"_blank\" rel=\"noopener\">CSP for content scripts on MDN<\/a>). Notably, this means that remote code cannot be executed from the content script. Some existing uses can be replaced with functionality from the Scripting API such as func and args (see the &#8220;Scripting&#8221; section above), which is available to MV2 extensions.<\/p>\n<h4>XHR and Fetch<\/h4>\n<p>With MV2 you also have access to some APIs, such as XMLHttpRequest and Fetch, from both extension and web page contexts. This allows for cross origin requests in a way that is not available in MV3. In MV3, XHR and Fetch operate as if the web page itself was using them, and are subject to cross origin controls.<\/p>\n<p>Content scripts can continue using XHR and Fetch by first making requests to background scripts. A background script can then use Fetch to get the data and return the necessary information to the content script. To avoid privacy issues, set the \u201ccredentials\u201d option to \u201comit\u201d and cache option to \u201cno-cache\u201d. In the future, we may offer an API to support the make-request-on-behalf-of-a-document-in-a-tab use case.<\/p>\n<h3>Will Chrome MV3 extensions work in Firefox MV2?<\/h3>\n<p>The release of MV3 in Firefox is distinct from Chrome. Add-ons intended to work across different browsers will, in most cases, require some level of adjustment to be compatible in both Firefox and Chrome. That said, we are committed to a high level of compatibility. We will be providing additional APIs and features in the near future. If you\u2019ve converted your Chrome extension to Google\u2019s MV3, you may be able to consolidate some of those changes into your Firefox MV2 extension. Here are a few areas to investigate:<\/p>\n<ul>\n<li aria-level=\"1\">Service Workers are not yet available in Firefox; however many scripts may work interchangeably between Service Workers and Event Pages, depending on functionality. To get things working, you may need to remove service worker specific APIs. See <a href=\"https:\/\/developer.mozilla.org\/docs\/Web\/API\/ServiceWorkerGlobalScope\" target=\"_blank\" rel=\"noopener\">Service Worker Global Scope fo<\/a>r more information.<\/li>\n<li aria-level=\"1\">DNR is not yet available in Firefox. Firefox retains WebRequest blocking in MV3, which can be used in place of DNR. When DNR is available, simple request modifications can be moved over to DNR.<\/li>\n<li aria-level=\"1\">The storage.session API is not yet available in Firefox. You can use other storage mechanisms in the meantime.<\/li>\n<\/ul>\n<p>Hopefully, we\u2019ve provided helpful information so you can use the new MV2 features to start your migration to MV3. As always, we appreciate your feedback and welcome questions. Here are the ways to get in touch:<\/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>Early next year, Firefox will release Mozilla\u2019s Manifest V3 (MV3). Therefore, it\u2019s an ideal time to consider migrating your Manifest V2 extensions. One of our goals throughout our approach to &hellip; <a class=\"go\" href=\"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/\">Read more<\/a><\/p>\n","protected":false},"author":472,"featured_media":8750,"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>Begin your MV3 migration by implementing new features today - 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\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Shane Caraveo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 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\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/\",\"name\":\"Begin your MV3 migration by implementing new features today - Mozilla Add-ons Community Blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/10\/Fx-Browser-icon-fullColor.png\",\"datePublished\":\"2022-10-31T21:59:34+00:00\",\"dateModified\":\"2023-01-12T18:55:10+00:00\",\"author\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/c5454cee2433f2f26b0fe210860f2898\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#primaryimage\",\"url\":\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/10\/Fx-Browser-icon-fullColor.png\",\"contentUrl\":\"https:\/\/blog.mozilla.org\/addons\/files\/2019\/10\/Fx-Browser-icon-fullColor.png\",\"width\":2048,\"height\":2048,\"caption\":\"Firefox logo\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.mozilla.org\/addons\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Begin your MV3 migration by implementing new features today\"}]},{\"@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\/c5454cee2433f2f26b0fe210860f2898\",\"name\":\"Shane Caraveo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ac7c1cddbca70fa76d4f01c5e6e9ec32?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ac7c1cddbca70fa76d4f01c5e6e9ec32?s=96&d=mm&r=g\",\"caption\":\"Shane Caraveo\"},\"url\":\"https:\/\/blog.mozilla.org\/addons\/author\/scaraveomozilla-com\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Begin your MV3 migration by implementing new features today - 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\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/","twitter_misc":{"Written by":"Shane Caraveo","Est. reading time":"7 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/","url":"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/","name":"Begin your MV3 migration by implementing new features today - Mozilla Add-ons Community Blog","isPartOf":{"@id":"https:\/\/blog.mozilla.org\/addons\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#primaryimage"},"image":{"@id":"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#primaryimage"},"thumbnailUrl":"https:\/\/blog.mozilla.org\/addons\/files\/2019\/10\/Fx-Browser-icon-fullColor.png","datePublished":"2022-10-31T21:59:34+00:00","dateModified":"2023-01-12T18:55:10+00:00","author":{"@id":"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/c5454cee2433f2f26b0fe210860f2898"},"breadcrumb":{"@id":"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#primaryimage","url":"https:\/\/blog.mozilla.org\/addons\/files\/2019\/10\/Fx-Browser-icon-fullColor.png","contentUrl":"https:\/\/blog.mozilla.org\/addons\/files\/2019\/10\/Fx-Browser-icon-fullColor.png","width":2048,"height":2048,"caption":"Firefox logo"},{"@type":"BreadcrumbList","@id":"https:\/\/blog.mozilla.org\/addons\/2022\/10\/31\/begin-your-mv3-migration-by-implementing-new-features-today\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.mozilla.org\/addons\/"},{"@type":"ListItem","position":2,"name":"Begin your MV3 migration by implementing new features today"}]},{"@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\/c5454cee2433f2f26b0fe210860f2898","name":"Shane Caraveo","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.mozilla.org\/addons\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ac7c1cddbca70fa76d4f01c5e6e9ec32?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ac7c1cddbca70fa76d4f01c5e6e9ec32?s=96&d=mm&r=g","caption":"Shane Caraveo"},"url":"https:\/\/blog.mozilla.org\/addons\/author\/scaraveomozilla-com\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/9066"}],"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\/472"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/comments?post=9066"}],"version-history":[{"count":0,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/posts\/9066\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/media\/8750"}],"wp:attachment":[{"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/media?parent=9066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/categories?post=9066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mozilla.org\/addons\/wp-json\/wp\/v2\/tags?post=9066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}