tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit cd3a65e948081d6257042e0d703c40d674a90527
parent ea85f757c5cf5f9589ff51d9feb77015a3d3fbce
Author: Cosmin Sabou <csabou@mozilla.com>
Date:   Thu, 11 Dec 2025 20:40:33 +0200

Revert "Bug 1804921 - Remove the extensions.manifestV3.enabled pref. r=robwu,toolkit-telemetry-reviewers" for causing xpcshell failures on test_Chrome_extensions.

This reverts commit dfc58e117f8aebf596f2a2918c6df344709ce133.

Diffstat:
Mbrowser/components/extensions/test/browser/browser_ext_action_popup_allowed_urls.js | 6++++++
Mbrowser/components/extensions/test/browser/browser_ext_browserAction_click_types.js | 8++++++++
Mbrowser/components/extensions/test/browser/browser_ext_browserAction_context.js | 4++++
Mbrowser/components/extensions/test/browser/browser_ext_browserAction_simple.js | 6++++++
Mbrowser/components/extensions/test/browser/browser_ext_chrome_settings_overrides_home.js | 3+++
Mbrowser/components/extensions/test/browser/browser_ext_contextMenus_commands.js | 6++++++
Mbrowser/components/extensions/test/browser/browser_ext_menus_events.js | 4++++
Mbrowser/components/extensions/test/xpcshell/test_ext_manifest.js | 2++
Mbrowser/components/extensions/test/xpcshell/test_ext_manifest_permissions.js | 2++
Mbrowser/components/extensions/test/xpcshell/test_ext_settings_overrides_search.js | 1+
Mmodules/libpref/init/all.js | 2++
Mtoolkit/components/extensions/Schemas.sys.mjs | 13+++++++++++++
Mtoolkit/components/extensions/schemas/manifest.json | 3++-
Mtoolkit/components/extensions/test/mochitest/test_ext_action.html | 6++++++
Mtoolkit/components/extensions/test/mochitest/test_ext_all_apis.js | 4++++
Mtoolkit/components/extensions/test/mochitest/test_ext_contentscript_activeTab.html | 5++++-
Mtoolkit/components/extensions/test/mochitest/test_ext_dnr_other_extensions.html | 5++++-
Mtoolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html | 5++++-
Mtoolkit/components/extensions/test/mochitest/test_ext_dnr_upgradeScheme.html | 1+
Mtoolkit/components/extensions/test/mochitest/test_ext_scripting_executeScript.html | 6++++++
Mtoolkit/components/extensions/test/mochitest/test_ext_scripting_executeScript_activeTab.html | 5++++-
Mtoolkit/components/extensions/test/mochitest/test_ext_scripting_executeScript_injectImmediately.html | 6++++++
Mtoolkit/components/extensions/test/mochitest/test_ext_scripting_insertCSS.html | 6++++++
Mtoolkit/components/extensions/test/mochitest/test_ext_scripting_permissions.html | 5++++-
Mtoolkit/components/extensions/test/mochitest/test_ext_scripting_removeCSS.html | 6++++++
Mtoolkit/components/extensions/test/mochitest/test_ext_sendmessage_no_receiver.html | 5+++++
Mtoolkit/components/extensions/test/mochitest/test_ext_web_accessible_resources.html | 5+++++
Mtoolkit/components/extensions/test/xpcshell/test_csp_custom_policies.js | 4++++
Mtoolkit/components/extensions/test/xpcshell/test_ext_content_security_policy.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_contentscript_csp.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_contentscript_dynamic_registration.js | 45+++++++++++++++++++++++++--------------------
Mtoolkit/components/extensions/test/xpcshell/test_ext_contentscript_json_api.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_contentscript_permissions_change.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_contentscript_permissions_fetch.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_contentscript_triggeringPrincipal.js | 3+++
Mtoolkit/components/extensions/test/xpcshell/test_ext_csp_upgrade_requests.js | 4++++
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_allowAllRequests.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_api.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_dynamic_rules.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_modifyHeaders.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_private_browsing.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_redirect_transform.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_regexFilter.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_regexFilter_limits.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_session_rules.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_startup_cache.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_static_rules.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_static_rules_limits.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_system_restrictions.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_tabIds.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_testMatchOutcome.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_update_static_rules.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_urlFilter.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_webrequest.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_dnr_without_webrequest.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_eventpage_idle.js | 11++++++++---
Mtoolkit/components/extensions/test/xpcshell/test_ext_json_parser.js | 5++++-
Mtoolkit/components/extensions/test/xpcshell/test_ext_manifest.js | 46++++++++++++++++++++++++++++------------------
Mtoolkit/components/extensions/test/xpcshell/test_ext_manifest_content_security_policy.js | 1+
Mtoolkit/components/extensions/test/xpcshell/test_ext_permission_warnings.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_scripting_contentScripts.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_scripting_contentScripts_css.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_scripting_contentScripts_file.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_scripting_persistAcrossSessions.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_scripting_updateContentScripts.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_secfetch.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_simple.js | 17+++++++++++++----
Mtoolkit/components/extensions/test/xpcshell/test_ext_wasm.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_webRequest_eventPage_StreamFilter.js | 45+++++++++++++++++++++++++++++----------------
Mtoolkit/components/extensions/test/xpcshell/test_ext_webRequest_mergecsp.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_webRequest_restrictedHeaders.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_webSocket.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_web_accessible_resources_matches.js | 2++
Mtoolkit/components/extensions/test/xpcshell/test_ext_xhr_cors.js | 2++
Mtoolkit/components/telemetry/app/TelemetryEnvironment.sys.mjs | 1+
Mtoolkit/components/telemetry/docs/data/environment.rst | 2++
Mtoolkit/modules/Troubleshoot.sys.mjs | 1+
Mtoolkit/mozapps/extensions/content/aboutaddons.js | 26+++++++++++++++++---------
Mtoolkit/mozapps/extensions/test/browser/browser_html_detail_permissions.js | 29+++++++++++++++++++++++------
Mtoolkit/mozapps/extensions/test/xpcshell/test_hidden.js | 3+++
Mtoolkit/mozapps/extensions/test/xpcshell/test_installOrigins.js | 2++
81 files changed, 347 insertions(+), 83 deletions(-)

diff --git a/browser/components/extensions/test/browser/browser_ext_action_popup_allowed_urls.js b/browser/components/extensions/test/browser/browser_ext_action_popup_allowed_urls.js @@ -3,6 +3,12 @@ "use strict"; +add_setup(async () => { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); +}); + add_task(async function test_actions_setPopup_allowed_urls() { const otherExtension = ExtensionTestUtils.loadExtension({}); const extensionDefinition = { diff --git a/browser/components/extensions/test/browser/browser_ext_browserAction_click_types.js b/browser/components/extensions/test/browser/browser_ext_browserAction_click_types.js @@ -249,7 +249,11 @@ add_task(async function test_clickData_MV2_eventpage() { }); add_task(async function test_clickData_MV3() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); await test_clickData({ manifest_version: 3 }); + await SpecialPowers.popPrefEnv(); }); add_task(function test_clickData_reset_MV2() { @@ -257,5 +261,9 @@ add_task(function test_clickData_reset_MV2() { }); add_task(async function test_clickData_reset_MV3() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); await test_clickData_reset({ manifest_version: 3 }); + await SpecialPowers.popPrefEnv(); }); diff --git a/browser/components/extensions/test/browser/browser_ext_browserAction_context.js b/browser/components/extensions/test/browser/browser_ext_browserAction_context.js @@ -462,6 +462,10 @@ add_task(async function testTabSwitchContext() { }); add_task(async function testTabSwitchActionContext() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); + await runTests({ manifest: { manifest_version: 3, diff --git a/browser/components/extensions/test/browser/browser_ext_browserAction_simple.js b/browser/components/extensions/test/browser/browser_ext_browserAction_simple.js @@ -93,6 +93,12 @@ async function testAction(manifest_version) { await waitForConsole; } +add_setup(async function () { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); +}); + add_task(async function test_browserAction() { await testAction(2); }); diff --git a/browser/components/extensions/test/browser/browser_ext_chrome_settings_overrides_home.js b/browser/components/extensions/test/browser/browser_ext_chrome_settings_overrides_home.js @@ -854,5 +854,8 @@ add_task(async function test_overriding_home_page_open_mv2() { }); add_task(async function test_overriding_home_page_open_mv3() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); await _test_overriding_home_page_open(3); }); diff --git a/browser/components/extensions/test/browser/browser_ext_contextMenus_commands.js b/browser/components/extensions/test/browser/browser_ext_contextMenus_commands.js @@ -2,6 +2,12 @@ /* vim: set sts=2 sw=2 et tw=80: */ "use strict"; +add_task(async function testTabSwitchActionContext() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); +}); + add_task(async function test_actions_context_menu() { function background() { browser.contextMenus.create({ diff --git a/browser/components/extensions/test/browser/browser_ext_menus_events.js b/browser/components/extensions/test/browser/browser_ext_menus_events.js @@ -22,6 +22,10 @@ async function grantOptionalPermission(extension, permissions) { var someOtherTab, testTab; add_setup(async function () { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); + // To help diagnose an intermittent later. SimpleTest.requestCompleteLog(); diff --git a/browser/components/extensions/test/xpcshell/test_ext_manifest.js b/browser/components/extensions/test/xpcshell/test_ext_manifest.js @@ -2,6 +2,8 @@ /* vim: set sts=2 sw=2 et tw=80: */ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + async function testManifest(manifest, expectedError) { ExtensionTestUtils.failOnSchemaWarnings(false); let normalized = await ExtensionTestUtils.normalizeManifest(manifest); diff --git a/browser/components/extensions/test/xpcshell/test_ext_manifest_permissions.js b/browser/components/extensions/test/xpcshell/test_ext_manifest_permissions.js @@ -4,6 +4,8 @@ /* globals chrome */ +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + async function testPermission(options) { function background(bgOptions) { browser.test.sendMessage("typeof-namespace", { diff --git a/browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search.js b/browser/components/extensions/test/xpcshell/test_ext_settings_overrides_search.js @@ -562,6 +562,7 @@ add_task(async function test_extension_allow_http_for_localhost() { }); add_task(async function test_search_favicon_mv3() { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); let normalized = await ExtensionTestUtils.normalizeManifest({ manifest_version: 3, chrome_settings_overrides: { diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js @@ -1775,6 +1775,8 @@ pref("extensions.eventPages.enabled", true); // Whether MV3 restrictions for actions popup urls should be extended to MV2 extensions // (only allowing same extension urls to be used as action popup urls). pref("extensions.manifestV2.actionsPopupURLRestricted", false); +// Whether "manifest_version: 3" extensions should be allowed to install successfully. +pref("extensions.manifestV3.enabled", true); #ifndef MOZ_WEBEXT_WEBIDL_ENABLED // Defined in StaticPrefList.yaml but overridden here to lock it. pref("extensions.backgroundServiceWorker.enabled", false, locked); diff --git a/toolkit/components/extensions/Schemas.sys.mjs b/toolkit/components/extensions/Schemas.sys.mjs @@ -322,6 +322,19 @@ const POSTPROCESSORS = { return value; }, + manifestVersionCheck(value, context) { + if ( + value == 2 || + (value == 3 && + Services.prefs.getBoolPref("extensions.manifestV3.enabled", false)) + ) { + return value; + } + const msg = `Unsupported manifest version: ${value}`; + context.logError(context.makeError(msg)); + throw new Error(msg); + }, + webAccessibleMatching(value, context) { // Ensure each object has at least one of matches or extension_ids array. for (let obj of value) { diff --git a/toolkit/components/extensions/schemas/manifest.json b/toolkit/components/extensions/schemas/manifest.json @@ -11,7 +11,8 @@ "manifest_version": { "type": "integer", "minimum": 2, - "maximum": 3 + "maximum": 3, + "postprocess": "manifestVersionCheck" }, "applications": { diff --git a/toolkit/components/extensions/test/mochitest/test_ext_action.html b/toolkit/components/extensions/test/mochitest/test_ext_action.html @@ -13,6 +13,12 @@ <script type="text/javascript"> "use strict"; +add_task(async function setup() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); +}); + add_task(async function test_action_onClicked() { const extension = ExtensionTestUtils.loadExtension({ manifest: { diff --git a/toolkit/components/extensions/test/mochitest/test_ext_all_apis.js b/toolkit/components/extensions/test/mochitest/test_ext_all_apis.js @@ -225,6 +225,9 @@ add_task(async function test_enumerate_background_script_apis() { }); add_task(async function test_enumerate_background_script_apis_mv3() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); let extensionData = { background: sendAllApis, manifest: { @@ -246,4 +249,5 @@ add_task(async function test_enumerate_background_script_apis_mv3() { ok(sameness, "namespaces are same object"); await extension.unload(); + await SpecialPowers.popPrefEnv(); }); diff --git a/toolkit/components/extensions/test/mochitest/test_ext_contentscript_activeTab.html b/toolkit/components/extensions/test/mochitest/test_ext_contentscript_activeTab.html @@ -15,7 +15,10 @@ add_task(async function setup() { SimpleTest.requestCompleteLog(); await SpecialPowers.pushPrefEnv({ - set: [["extensions.originControls.grantByDefault", false]], + set: [ + ["extensions.manifestV3.enabled", true], + ["extensions.originControls.grantByDefault", false], + ], }); }); diff --git a/toolkit/components/extensions/test/mochitest/test_ext_dnr_other_extensions.html b/toolkit/components/extensions/test/mochitest/test_ext_dnr_other_extensions.html @@ -18,7 +18,10 @@ add_setup(async () => { await SpecialPowers.pushPrefEnv({ - set: [["extensions.dnr.enabled", true]], + set: [ + ["extensions.manifestV3.enabled", true], + ["extensions.dnr.enabled", true], + ], }); }); diff --git a/toolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html b/toolkit/components/extensions/test/mochitest/test_ext_dnr_tabIds.html @@ -22,7 +22,10 @@ add_setup(async () => { await SpecialPowers.pushPrefEnv({ - set: [["extensions.dnr.enabled", true]], + set: [ + ["extensions.manifestV3.enabled", true], + ["extensions.dnr.enabled", true], + ], }); }); diff --git a/toolkit/components/extensions/test/mochitest/test_ext_dnr_upgradeScheme.html b/toolkit/components/extensions/test/mochitest/test_ext_dnr_upgradeScheme.html @@ -18,6 +18,7 @@ add_setup(async () => { await SpecialPowers.pushPrefEnv({ set: [ + ["extensions.manifestV3.enabled", true], ["extensions.dnr.enabled", true], ["extensions.dnr.match_requests_from_other_extensions", true], ], diff --git a/toolkit/components/extensions/test/mochitest/test_ext_scripting_executeScript.html b/toolkit/components/extensions/test/mochitest/test_ext_scripting_executeScript.html @@ -41,6 +41,12 @@ const makeExtension = ({ manifest: manifestProps, ...otherProps }) => { }); }; +add_task(async function setup() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); +}); + add_task(async function test_executeScript_params_validation() { let extension = makeExtension({ async background() { diff --git a/toolkit/components/extensions/test/mochitest/test_ext_scripting_executeScript_activeTab.html b/toolkit/components/extensions/test/mochitest/test_ext_scripting_executeScript_activeTab.html @@ -27,7 +27,10 @@ const makeExtension = ({ manifest: manifestProps, ...otherProps }) => { add_task(async function setup() { await SpecialPowers.pushPrefEnv({ - set: [["extensions.originControls.grantByDefault", false]], + set: [ + ["extensions.manifestV3.enabled", true], + ["extensions.originControls.grantByDefault", false], + ], }); }); diff --git a/toolkit/components/extensions/test/mochitest/test_ext_scripting_executeScript_injectImmediately.html b/toolkit/components/extensions/test/mochitest/test_ext_scripting_executeScript_injectImmediately.html @@ -38,6 +38,12 @@ const makeExtension = ({ manifest: manifestProps, ...otherProps }) => { }); }; +add_task(async function setup() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); +}); + add_task(async function test_executeScript_injectImmediately() { let extension = makeExtension({ async background() { diff --git a/toolkit/components/extensions/test/mochitest/test_ext_scripting_insertCSS.html b/toolkit/components/extensions/test/mochitest/test_ext_scripting_insertCSS.html @@ -37,6 +37,12 @@ const makeExtension = ({ manifest: manifestProps, ...otherProps }) => { }); }; +add_task(async function setup() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); +}); + add_task(async function test_insertCSS_and_removeCSS_params_validation() { let extension = makeExtension({ async background() { diff --git a/toolkit/components/extensions/test/mochitest/test_ext_scripting_permissions.html b/toolkit/components/extensions/test/mochitest/test_ext_scripting_permissions.html @@ -128,7 +128,10 @@ const verifyRegisterContentScripts = async ({ manifest_version }) => { add_task(async function setup() { await SpecialPowers.pushPrefEnv({ - set: [["extensions.webextOptionalPermissionPrompts", false]], + set: [ + ["extensions.manifestV3.enabled", true], + ["extensions.webextOptionalPermissionPrompts", false], + ], }); }); diff --git a/toolkit/components/extensions/test/mochitest/test_ext_scripting_removeCSS.html b/toolkit/components/extensions/test/mochitest/test_ext_scripting_removeCSS.html @@ -33,6 +33,12 @@ const makeExtension = ({ manifest: manifestProps, ...otherProps }) => { }); }; +add_task(async function setup() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); +}); + add_task(async function test_removeCSS_with_invalid_tabId() { let extension = makeExtension({ async background() { diff --git a/toolkit/components/extensions/test/mochitest/test_ext_sendmessage_no_receiver.html b/toolkit/components/extensions/test/mochitest/test_ext_sendmessage_no_receiver.html @@ -90,6 +90,10 @@ add_task(async function test_content_script_chrome_sendMessage_without_listener( }); add_task(async function test_chrome_sendMessage_without_listener_v3() { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", true]], + }); + // We only test the background here because content script behavior // is independant of the manifest version. let extension = ExtensionTestUtils.loadExtension({ @@ -104,6 +108,7 @@ add_task(async function test_chrome_sendMessage_without_listener_v3() { await extension.awaitMessage("finished"); await extension.unload(); + await SpecialPowers.popPrefEnv(); }); </script> </body> diff --git a/toolkit/components/extensions/test/mochitest/test_ext_web_accessible_resources.html b/toolkit/components/extensions/test/mochitest/test_ext_web_accessible_resources.html @@ -12,6 +12,11 @@ <script type="text/javascript"> "use strict"; +// add_setup not available in mochitest +add_task(async function setup() { + await SpecialPowers.pushPrefEnv({set: [["extensions.manifestV3.enabled", true]]}); +}) + let image = atob( "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" + "ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=" diff --git a/toolkit/components/extensions/test/xpcshell/test_csp_custom_policies.js b/toolkit/components/extensions/test/xpcshell/test_csp_custom_policies.js @@ -166,6 +166,8 @@ add_task(async function test_policy_csp() { }); add_task(async function test_extension_csp() { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + ExtensionTestUtils.failOnSchemaWarnings(false); let extension_pages = "script-src 'self'; img-src 'none'"; @@ -364,4 +366,6 @@ add_task(async function test_extension_csp() { } ExtensionTestUtils.failOnSchemaWarnings(true); + + Services.prefs.clearUserPref("extensions.manifestV3.enabled"); }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_content_security_policy.js b/toolkit/components/extensions/test/xpcshell/test_ext_content_security_policy.js @@ -1,5 +1,7 @@ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const server = createHttpServer({ hosts: ["example.com"] }); server.registerPathHandler("/dummy", (request, response) => { diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_csp.js b/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_csp.js @@ -6,6 +6,8 @@ const { TestUtils } = ChromeUtils.importESModule( "resource://testing-common/TestUtils.sys.mjs" ); +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const server = createHttpServer({ hosts: ["example.com", "csplog.example.net"], }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_dynamic_registration.js b/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_dynamic_registration.js @@ -124,29 +124,34 @@ const verifyRegistrationWithNewProcess = async extension => { await secondContentPage.close(); }; -add_task(async function test_scripting_registerContentScripts() { - let extension = makeExtension({ - manifest: { - manifest_version: 3, - host_permissions: ["<all_urls>"], - granted_host_permissions: true, - }, - async background() { - const script = { - id: "a-script", - js: ["script.js"], - matches: ["http://*/*/*.html"], - persistAcrossSessions: false, - }; +add_task( + { + pref_set: [["extensions.manifestV3.enabled", true]], + }, + async function test_scripting_registerContentScripts() { + let extension = makeExtension({ + manifest: { + manifest_version: 3, + host_permissions: ["<all_urls>"], + granted_host_permissions: true, + }, + async background() { + const script = { + id: "a-script", + js: ["script.js"], + matches: ["http://*/*/*.html"], + persistAcrossSessions: false, + }; - await browser.scripting.registerContentScripts([script]); + await browser.scripting.registerContentScripts([script]); - browser.test.sendMessage("background-done"); - }, - }); + browser.test.sendMessage("background-done"); + }, + }); - await verifyRegistrationWithNewProcess(extension); -}); + await verifyRegistrationWithNewProcess(extension); + } +); add_task( { diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_json_api.js b/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_json_api.js @@ -1,5 +1,7 @@ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const server = createHttpServer({ hosts: ["example.com"] }); server.registerPathHandler("/dummy", (request, response) => { response.setStatusLine(request.httpVersion, 200, "OK"); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_permissions_change.js b/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_permissions_change.js @@ -1,5 +1,6 @@ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.originControls.grantByDefault", false); const server = createHttpServer({ hosts: ["example.com", "example.net"] }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_permissions_fetch.js b/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_permissions_fetch.js @@ -1,5 +1,7 @@ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const server = createHttpServer({ hosts: ["example.com", "example.net"] }); server.registerDirectory("/data/", do_get_file("data")); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_triggeringPrincipal.js b/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_triggeringPrincipal.js @@ -1361,6 +1361,8 @@ add_task(async function test_contentscript_csp() { * content page. */ add_task(async function test_extension_contentscript_csp() { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + gContentSecurityPolicy = `default-src 'none' 'report-sample'; script-src 'nonce-deadbeef' 'unsafe-eval' 'report-sample'; report-uri ${CSP_REPORT_PATH};`; let data = { @@ -1394,4 +1396,5 @@ add_task(async function test_extension_contentscript_csp() { await extension.unload(); await contentPage.close(); + Services.prefs.clearUserPref("extensions.manifestV3.enabled"); }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_csp_upgrade_requests.js b/toolkit/components/extensions/test/xpcshell/test_ext_csp_upgrade_requests.js @@ -5,6 +5,10 @@ server.registerPathHandler("/", (req, res) => { res.write("ok"); }); +add_setup(async () => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); +}); + add_task(async function test_csp_upgrade() { async function background() { browser.webRequest.onBeforeRequest.addListener( diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_allowAllRequests.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_allowAllRequests.js @@ -11,6 +11,7 @@ ChromeUtils.defineESModuleGetters(this, { }); add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_api.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_api.js @@ -83,6 +83,8 @@ async function testAvailability({ } add_setup(async () => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + // test_optional_declarativeNetRequestFeedback calls permission.request(). // We don't care about the UI, only about the effect of being granted. Services.prefs.setBoolPref( diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_dynamic_rules.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_dynamic_rules.js @@ -34,6 +34,7 @@ server.registerPathHandler("/", (req, res) => { }); add_setup(async () => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); Services.prefs.setBoolPref("extensions.dnr.feedback", true); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_modifyHeaders.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_modifyHeaders.js @@ -77,6 +77,7 @@ server.registerPathHandler("/setcookie", (req, res) => { server.registerPathHandler("/empty", () => {}); add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); // The restrictedDomains pref should be set early, because the pref is read diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_private_browsing.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_private_browsing.js @@ -7,6 +7,7 @@ server.registerPathHandler("/", (req, res) => { }); add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_redirect_transform.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_redirect_transform.js @@ -8,6 +8,7 @@ // reasonably well. add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); // We don't normally allow localhost channels to be proxied, but this diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_regexFilter.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_regexFilter.js @@ -11,6 +11,7 @@ // The quota on regexFilter is verified in test_ext_dnr_regexFilter_limits.js. add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); Services.prefs.setBoolPref("extensions.dnr.feedback", true); }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_regexFilter_limits.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_regexFilter_limits.js @@ -17,6 +17,7 @@ AddonTestUtils.init(this); AddonTestUtils.overrideCertDB(); add_setup(async () => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); Services.prefs.setBoolPref("extensions.dnr.feedback", true); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_session_rules.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_session_rules.js @@ -5,6 +5,7 @@ ChromeUtils.defineESModuleGetters(this, { }); add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_startup_cache.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_startup_cache.js @@ -94,6 +94,7 @@ function getDNRExtension({ } add_setup(async () => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); Services.prefs.setBoolPref("extensions.dnr.feedback", true); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_static_rules.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_static_rules.js @@ -29,6 +29,7 @@ server.registerPathHandler("/", (req, res) => { }); add_setup(async () => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); Services.prefs.setBoolPref("extensions.dnr.feedback", true); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_static_rules_limits.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_static_rules_limits.js @@ -27,6 +27,7 @@ server.registerPathHandler("/", (req, res) => { }); add_setup(async () => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); Services.prefs.setBoolPref("extensions.dnr.feedback", true); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_system_restrictions.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_system_restrictions.js @@ -17,6 +17,7 @@ server.registerPathHandler("/imported.css", (req, res) => { }); add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); // The restrictedDomains pref should be set early, because the pref is read // only once (on first use) by WebExtensionPolicy::IsRestrictedURI. diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_tabIds.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_tabIds.js @@ -17,6 +17,7 @@ server.registerPathHandler("/", (req, res) => { let gTabLookupSpy; add_setup(async () => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); // Install a spy on WebRequest.getTabIdForChannelWrapper. diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_testMatchOutcome.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_testMatchOutcome.js @@ -1,6 +1,7 @@ "use strict"; add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); Services.prefs.setBoolPref("extensions.dnr.feedback", true); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_update_static_rules.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_update_static_rules.js @@ -36,6 +36,7 @@ async function dropDNRStartupCache(dnrStore, extension) { } add_setup(async () => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); Services.prefs.setBoolPref("extensions.dnr.feedback", true); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_urlFilter.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_urlFilter.js @@ -1,6 +1,7 @@ "use strict"; add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); Services.prefs.setBoolPref("extensions.dnr.feedback", true); }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_webrequest.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_webrequest.js @@ -1,6 +1,7 @@ "use strict"; add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_dnr_without_webrequest.js b/toolkit/components/extensions/test/xpcshell/test_ext_dnr_without_webrequest.js @@ -5,6 +5,7 @@ // test_ext_dnr_webRequest.js for the interaction between webRequest and DNR. add_setup(() => { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); Services.prefs.setBoolPref("extensions.dnr.enabled", true); }); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_eventpage_idle.js b/toolkit/components/extensions/test/xpcshell/test_ext_eventpage_idle.js @@ -589,9 +589,14 @@ add_task(function test_mv2_suspend_shutdown_race() { return testSuspendShutdownRace({ manifest_version: 2 }); }); -add_task(function test_mv3_suspend_shutdown_race() { - return testSuspendShutdownRace({ manifest_version: 3 }); -}); +add_task( + { + pref_set: [["extensions.manifestV3.enabled", true]], + }, + function test_mv3_suspend_shutdown_race() { + return testSuspendShutdownRace({ manifest_version: 3 }); + } +); function createPendingListenerTestExtension() { return ExtensionTestUtils.loadExtension({ diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_json_parser.js b/toolkit/components/extensions/test/xpcshell/test_ext_json_parser.js @@ -123,7 +123,10 @@ add_task(async function test_getExtensionVersionWithoutValidation() { add_task( { - pref_set: [["extensions.webextensions.warnings-as-errors", false]], + pref_set: [ + ["extensions.manifestV3.enabled", true], + ["extensions.webextensions.warnings-as-errors", false], + ], }, async function test_applications_no_longer_valid_in_mv3() { let id = "some@id"; diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_manifest.js b/toolkit/components/extensions/test/xpcshell/test_ext_manifest.js @@ -142,14 +142,19 @@ add_task(async function test_mv2_scripting_permission_always_enabled() { Assert.deepEqual(warnings, [], "Got no warnings"); }); -add_task(async function test_mv3_scripting_permission_always_enabled() { - let warnings = await testManifest({ - manifest_version: 3, - permissions: ["scripting"], - }); +add_task( + { + pref_set: [["extensions.manifestV3.enabled", true]], + }, + async function test_mv3_scripting_permission_always_enabled() { + let warnings = await testManifest({ + manifest_version: 3, + permissions: ["scripting"], + }); - Assert.deepEqual(warnings, [], "Got no warnings"); -}); + Assert.deepEqual(warnings, [], "Got no warnings"); + } +); add_task(async function test_name_too_long() { let extension = ExtensionTestUtils.loadExtension({ @@ -276,18 +281,23 @@ add_task(async function test_applications() { await extension.unload(); }); -add_task(async function test_applications_key_mv3() { - let warnings = await testManifest({ - manifest_version: 3, - applications: {}, - }); +add_task( + { + pref_set: [["extensions.manifestV3.enabled", true]], + }, + async function test_applications_key_mv3() { + let warnings = await testManifest({ + manifest_version: 3, + applications: {}, + }); - Assert.deepEqual( - warnings, - [`Property "applications" is unsupported in Manifest Version 3`], - `Manifest v3 with "applications" key logs an error.` - ); -}); + Assert.deepEqual( + warnings, + [`Property "applications" is unsupported in Manifest Version 3`], + `Manifest v3 with "applications" key logs an error.` + ); + } +); add_task(async function test_bss_gecko_android() { const addonId = "some@id"; diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_manifest_content_security_policy.js b/toolkit/components/extensions/test/xpcshell/test_ext_manifest_content_security_policy.js @@ -2,6 +2,7 @@ /* vim: set sts=2 sw=2 et tw=80: */ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); AddonTestUtils.init(this); add_task(async function test_manifest_csp() { diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_permission_warnings.js b/toolkit/components/extensions/test/xpcshell/test_ext_permission_warnings.js @@ -33,6 +33,8 @@ AddonTestUtils.overrideCertDB(); AddonTestUtils.usePrivilegedSignatures = id => id.startsWith("privileged"); createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42"); +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + async function getManifestPermissions(extensionData) { let extension = ExtensionTestCommon.generate(extensionData); // Some tests contain invalid permissions; ignore the warnings about their invalidity. diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_scripting_contentScripts.js b/toolkit/components/extensions/test/xpcshell/test_ext_scripting_contentScripts.js @@ -9,6 +9,8 @@ const BASE_URL = `http://localhost:${server.identity.primaryPort}/data`; // the right timeout for content scripts executed at document_idle. ExtensionTestUtils.mockAppInfo(); +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const makeExtension = ({ manifest: manifestProps, ...otherProps }) => { return ExtensionTestUtils.loadExtension({ manifest: { diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_scripting_contentScripts_css.js b/toolkit/components/extensions/test/xpcshell/test_ext_scripting_contentScripts_css.js @@ -9,6 +9,8 @@ const BASE_URL = `http://localhost:${server.identity.primaryPort}/data`; // the right timeout for content scripts executed at document_idle. ExtensionTestUtils.mockAppInfo(); +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const makeExtension = ({ manifest: manifestProps, ...otherProps }) => { return ExtensionTestUtils.loadExtension({ manifest: { diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_scripting_contentScripts_file.js b/toolkit/components/extensions/test/xpcshell/test_ext_scripting_contentScripts_file.js @@ -8,6 +8,8 @@ const FILE_DUMMY_URL = Services.io.newFileURI( // the right timeout for content scripts executed at document_idle. ExtensionTestUtils.mockAppInfo(); +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const makeExtension = ({ manifest: manifestProps, ...otherProps }) => { return ExtensionTestUtils.loadExtension({ manifest: { diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_scripting_persistAcrossSessions.js b/toolkit/components/extensions/test/xpcshell/test_ext_scripting_persistAcrossSessions.js @@ -1,5 +1,7 @@ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + AddonTestUtils.init(this); AddonTestUtils.overrideCertDB(); AddonTestUtils.createAppInfo( diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_scripting_updateContentScripts.js b/toolkit/components/extensions/test/xpcshell/test_ext_scripting_updateContentScripts.js @@ -9,6 +9,8 @@ const BASE_URL = `http://localhost:${server.identity.primaryPort}/data`; // the right timeout for content scripts executed at document_idle. ExtensionTestUtils.mockAppInfo(); +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const makeExtension = ({ manifest: manifestProps, ...otherProps }) => { return ExtensionTestUtils.loadExtension({ manifest: { diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_secfetch.js b/toolkit/components/extensions/test/xpcshell/test_ext_secfetch.js @@ -2,6 +2,8 @@ /* vim: set sts=2 sw=2 et tw=80: */ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + // We don't normally allow localhost channels to be proxied, but this // is easier than updating all the certs and/or domains. Services.prefs.setBoolPref("network.proxy.allow_hijacking_localhost", true); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_simple.js b/toolkit/components/extensions/test/xpcshell/test_ext_simple.js @@ -30,22 +30,25 @@ add_task(async function test_simple() { await extension.unload(); }); -add_task(async function test_manifest_unsupported_version() { +add_task(async function test_manifest_V3_disabled() { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", false); let extensionData = { manifest: { - manifest_version: 1, + manifest_version: 3, }, }; let extension = ExtensionTestUtils.loadExtension(extensionData); await Assert.rejects( extension.startup(), - /Property "manifest_version" is unsupported in Manifest Version 1/, - "manifest version 1 is rejected" + /Unsupported manifest version: 3/, + "manifest V3 cannot be loaded" ); + Services.prefs.clearUserPref("extensions.manifestV3.enabled"); }); add_task(async function test_manifest_V3_enabled() { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); let extensionData = { manifest: { manifest_version: 3, @@ -56,6 +59,7 @@ add_task(async function test_manifest_V3_enabled() { await extension.startup(); equal(extension.extension.manifest.manifest_version, 3, "manifest V3 loads"); await extension.unload(); + Services.prefs.clearUserPref("extensions.manifestV3.enabled"); }); add_task(async function test_background() { @@ -148,6 +152,7 @@ add_task(async function test_policy_temporarilyInstalled() { }); add_task(async function test_manifest_allowInsecureRequests() { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); let extensionData = { allowInsecureRequests: true, manifest: { @@ -163,9 +168,11 @@ add_task(async function test_manifest_allowInsecureRequests() { "insecure allowed" ); await extension.unload(); + Services.prefs.clearUserPref("extensions.manifestV3.enabled"); }); add_task(async function test_manifest_allowInsecureRequests_throws() { + Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); let extensionData = { allowInsecureRequests: true, manifest: { @@ -181,6 +188,7 @@ add_task(async function test_manifest_allowInsecureRequests_throws() { /allowInsecureRequests cannot be used with manifest.content_security_policy/, "allowInsecureRequests with content_security_policy cannot be loaded" ); + Services.prefs.clearUserPref("extensions.manifestV3.enabled"); }); add_task(async function test_gecko_android_key_in_applications() { @@ -192,6 +200,7 @@ add_task(async function test_gecko_android_key_in_applications() { }, }, }); + ExtensionTestUtils.failOnSchemaWarnings(false); let { messages } = await promiseConsoleOutput(async () => { const { AddonManager } = ChromeUtils.importESModule( diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_wasm.js b/toolkit/components/extensions/test/xpcshell/test_ext_wasm.js @@ -2,6 +2,8 @@ /* vim: set sts=2 sw=2 et tw=80: */ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + // Common code snippet of background script in this test. function background() { globalThis.onsecuritypolicyviolation = event => { diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_webRequest_eventPage_StreamFilter.js b/toolkit/components/extensions/test/xpcshell/test_ext_webRequest_eventPage_StreamFilter.js @@ -204,14 +204,19 @@ add_task( } ); -add_task(async function test_idletimeout_on_active_streamfilter_mv3() { - await test_idletimeout_on_streamfilter({ - manifest_version: 3, - requestUrlPath: "pending_request", - expectStreamFilterStop: false, - expectResetIdle: true, - }); -}); +add_task( + { + pref_set: [["extensions.manifestV3.enabled", true]], + }, + async function test_idletimeout_on_active_streamfilter_mv3() { + await test_idletimeout_on_streamfilter({ + manifest_version: 3, + requestUrlPath: "pending_request", + expectStreamFilterStop: false, + expectResetIdle: true, + }); + } +); add_task( { @@ -227,14 +232,19 @@ add_task( } ); -add_task(async function test_idletimeout_on_inactive_streamfilter_mv3() { - await test_idletimeout_on_streamfilter({ - manifest_version: 3, - requestUrlPath: "completed_request", - expectStreamFilterStop: true, - expectResetIdle: false, - }); -}); +add_task( + { + pref_set: [["extensions.manifestV3.enabled", true]], + }, + async function test_idletimeout_on_inactive_streamfilter_mv3() { + await test_idletimeout_on_streamfilter({ + manifest_version: 3, + requestUrlPath: "completed_request", + expectStreamFilterStop: true, + expectResetIdle: false, + }); + } +); async function test_create_new_streamfilter_while_suspending({ manifest_version, @@ -340,6 +350,9 @@ add_task( ); add_task( + { + pref_set: [["extensions.manifestV3.enabled", true]], + }, async function test_error_creating_new_streamfilter_while_suspending_mv3() { await test_create_new_streamfilter_while_suspending({ manifest_version: 3, diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_webRequest_mergecsp.js b/toolkit/components/extensions/test/xpcshell/test_ext_webRequest_mergecsp.js @@ -2,6 +2,8 @@ /* vim: set sts=2 sw=2 et tw=80: */ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + AddonTestUtils.init(this); AddonTestUtils.createAppInfo( "xpcshell@tests.mozilla.org", diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_webRequest_restrictedHeaders.js b/toolkit/components/extensions/test/xpcshell/test_ext_webRequest_restrictedHeaders.js @@ -2,6 +2,8 @@ /* vim: set sts=2 sw=2 et tw=80: */ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + AddonTestUtils.init(this); AddonTestUtils.createAppInfo( "xpcshell@tests.mozilla.org", diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_webSocket.js b/toolkit/components/extensions/test/xpcshell/test_ext_webSocket.js @@ -2,6 +2,8 @@ const HOSTS = new Set(["example.com"]); +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const server = createHttpServer({ hosts: HOSTS }); const BASE_URL = `http://example.com`; diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_web_accessible_resources_matches.js b/toolkit/components/extensions/test/xpcshell/test_ext_web_accessible_resources_matches.js @@ -1,5 +1,7 @@ "use strict"; +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const server = createHttpServer({ hosts: ["example.com", "example.org"] }); server.registerDirectory("/data/", do_get_file("data")); diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_xhr_cors.js b/toolkit/components/extensions/test/xpcshell/test_ext_xhr_cors.js @@ -4,6 +4,8 @@ // similarly in MV2 and MV3, except for intentional differences related to // permission handling. +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); + const server = createHttpServer({ hosts: ["example.com", "example.net", "example.org"], }); diff --git a/toolkit/components/telemetry/app/TelemetryEnvironment.sys.mjs b/toolkit/components/telemetry/app/TelemetryEnvironment.sys.mjs @@ -281,6 +281,7 @@ const DEFAULT_ENVIRONMENT_PREFS = new Map([ { what: RECORD_PREF_VALUE }, ], ["extensions.formautofill.creditCards.enabled", { what: RECORD_PREF_VALUE }], + ["extensions.manifestV3.enabled", { what: RECORD_PREF_VALUE }], ["extensions.quarantinedDomains.enabled", { what: RECORD_PREF_VALUE }], ["extensions.strictCompatibility", { what: RECORD_PREF_VALUE }], ["extensions.update.enabled", { what: RECORD_PREF_VALUE }], diff --git a/toolkit/components/telemetry/docs/data/environment.rst b/toolkit/components/telemetry/docs/data/environment.rst @@ -423,6 +423,8 @@ The following is a partial list of `collected preferences <https://searchfox.org - ``extensions.quarantinedDomains.enabled``: Whether "Quarantined Domains" is enabled. +- ``extensions.manifestV3.enabled``: Whether `"manifest_version": 3` extensions should be allowed to install successfully. + - ``media.gmp-gmpopenh264.enabled``: Whether OpenH264 is enabled. - ``media.gmp-gmpopenh264.lastDownload``: When OpenH264 was last downloaded as seconds since Jan 1, 1970. diff --git a/toolkit/modules/Troubleshoot.sys.mjs b/toolkit/modules/Troubleshoot.sys.mjs @@ -65,6 +65,7 @@ const PREFS_FOR_DISPLAY = [ "extensions.eventPages.enabled", "extensions.formautofill.", "extensions.lastAppVersion", + "extensions.manifestV3.enabled", "extensions.quarantinedDomains.enabled", "extensions.InstallTrigger.enabled", "fission.autostart", diff --git a/toolkit/mozapps/extensions/content/aboutaddons.js b/toolkit/mozapps/extensions/content/aboutaddons.js @@ -31,6 +31,12 @@ ChromeUtils.defineESModuleGetters(this, { recordListItemManageTelemetry: "chrome://global/content/ml/Utils.sys.mjs", }); +XPCOMUtils.defineLazyPreferenceGetter( + this, + "manifestV3enabled", + "extensions.manifestV3.enabled" +); + const UPDATES_RECENT_TIMESPAN = 2 * 24 * 3600000; // 2 days (in milliseconds) XPCOMUtils.defineLazyPreferenceGetter( @@ -1988,21 +1994,23 @@ class AddonPermissionsList extends HTMLElement { let optionalPerms = { ...(this.addon.optionalPermissions ?? empty) }; let grantedPerms = await ExtensionPermissions.get(this.addon.id); - // If optional permissions include <all_urls>, extension can request and - // be granted permission for individual sites not listed in the manifest. - // Include them as well in the optional origins list. - let origins = [ - ...(this.addon.optionalOriginsNormalized ?? []), - ...grantedPerms.origins.filter(o => !requiredPerms.origins.includes(o)), - ]; - optionalPerms.origins = [...new Set(origins)]; + if (manifestV3enabled) { + // If optional permissions include <all_urls>, extension can request and + // be granted permission for individual sites not listed in the manifest. + // Include them as well in the optional origins list. + let origins = [ + ...(this.addon.optionalOriginsNormalized ?? []), + ...grantedPerms.origins.filter(o => !requiredPerms.origins.includes(o)), + ]; + optionalPerms.origins = [...new Set(origins)]; + } let permissions = Extension.formatPermissionStrings( { permissions: requiredPerms, optionalPermissions: optionalPerms, }, - { buildOptionalOrigins: true } + { buildOptionalOrigins: manifestV3enabled } ); let optionalEntries = [ ...Object.entries(permissions.optionalPermissions), diff --git a/toolkit/mozapps/extensions/test/browser/browser_html_detail_permissions.js b/toolkit/mozapps/extensions/test/browser/browser_html_detail_permissions.js @@ -523,7 +523,15 @@ async function runTest(options) { } } -async function testPermissionsView({ manifest_version, expectGranted }) { +async function testPermissionsView({ + manifestV3enabled, + manifest_version, + expectGranted, +}) { + await SpecialPowers.pushPrefEnv({ + set: [["extensions.manifestV3.enabled", manifestV3enabled]], + }); + // pre-set a permission prior to starting extensions. await ExtensionPermissions.add("addon4@mochi.test", { permissions: ["tabs"], @@ -561,7 +569,7 @@ async function testPermissionsView({ manifest_version, expectGranted }) { info("Check add-on with only one optional origin."); await runTest({ extension: extensions["addon2@mochi.test"], - optional_permissions: ["http://mochi.test/*"], + optional_permissions: manifestV3enabled ? ["http://mochi.test/*"] : [], optional_strings: { "http://mochi.test/*": "Access your data for http://mochi.test", }, @@ -588,7 +596,7 @@ async function testPermissionsView({ manifest_version, expectGranted }) { optional_permissions: [ "webNavigation", "<all_urls>", - "https://example.com/*", + ...(manifestV3enabled ? ["https://example.com/*"] : []), ], optional_enabled: ["https://example.com/*"], optional_strings: { @@ -612,7 +620,10 @@ async function testPermissionsView({ manifest_version, expectGranted }) { info("Check privileged add-on with non-web origin permissions"); await runTest({ extension: extensions["priv6@mochi.test"], - optional_permissions: ["<all_urls>", "*://*.mozilla.com/*"], + optional_permissions: [ + "<all_urls>", + ...(manifestV3enabled ? ["*://*.mozilla.com/*"] : []), + ], optional_overlapping: ["<all_urls>", "*://*/*"], optional_strings: { "*://*.mozilla.com/*": @@ -642,8 +653,12 @@ async function testPermissionsView({ manifest_version, expectGranted }) { await SpecialPowers.popPrefEnv(); } -add_task(async function testPermissionsView_MV2() { - await testPermissionsView({ manifest_version: 2 }); +add_task(async function testPermissionsView_MV2_manifestV3disabled() { + await testPermissionsView({ manifestV3enabled: false, manifest_version: 2 }); +}); + +add_task(async function testPermissionsView_MV2_manifestV3enabled() { + await testPermissionsView({ manifestV3enabled: true, manifest_version: 2 }); }); add_task(async function testPermissionsView_MV3_noInstallPrompt() { @@ -651,6 +666,7 @@ add_task(async function testPermissionsView_MV3_noInstallPrompt() { set: [["extensions.originControls.grantByDefault", false]], }); await testPermissionsView({ + manifestV3enabled: true, manifest_version: 3, expectGranted: false, }); @@ -662,6 +678,7 @@ add_task(async function testPermissionsView_MV3() { set: [["extensions.originControls.grantByDefault", true]], }); await testPermissionsView({ + manifestV3enabled: true, manifest_version: 3, expectGranted: true, }); diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_hidden.js b/toolkit/mozapps/extensions/test/xpcshell/test_hidden.js @@ -79,6 +79,9 @@ add_task(async function test_hidden() { }); add_task( + { + pref_set: [["extensions.manifestV3.enabled", true]], + }, async function test_hidden_and_browser_action_props_are_mutually_exclusive() { const TEST_CASES = [ { diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_installOrigins.js b/toolkit/mozapps/extensions/test/xpcshell/test_installOrigins.js @@ -17,8 +17,10 @@ AddonTestUtils.createAppInfo( "42" ); +Services.prefs.setBoolPref("extensions.manifestV3.enabled", true); // This pref is not set in Thunderbird, and needs to be true for the test to pass. Services.prefs.setBoolPref("extensions.postDownloadThirdPartyPrompt", true); + let server = AddonTestUtils.createHttpServer({ hosts: ["example.com", "example.org", "amo.example.com", "github.io"], });