diff options
Diffstat (limited to 'toolkit/components/extensions/test/xpcshell/test_ext_browser_style_deprecation.js')
-rw-r--r-- | toolkit/components/extensions/test/xpcshell/test_ext_browser_style_deprecation.js | 335 |
1 files changed, 335 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_browser_style_deprecation.js b/toolkit/components/extensions/test/xpcshell/test_ext_browser_style_deprecation.js new file mode 100644 index 0000000000..2046242865 --- /dev/null +++ b/toolkit/components/extensions/test/xpcshell/test_ext_browser_style_deprecation.js @@ -0,0 +1,335 @@ +"use strict"; + +AddonTestUtils.init(this); +// This test expects and checks deprecation warnings. +ExtensionTestUtils.failOnSchemaWarnings(false); + +const PREF_SUPPORTED = "extensions.browser_style_mv3.supported"; +const PREF_SAME_AS_MV2 = "extensions.browser_style_mv3.same_as_mv2"; + +// Set the prefs to the defaults at the end of the deprecation process. +// TODO bug 1830711: remove these two lines. +Services.prefs.setBoolPref(PREF_SUPPORTED, false); +Services.prefs.setBoolPref(PREF_SAME_AS_MV2, false); + +function checkBrowserStyleInManifestKey(extension, key, expected) { + let actual = extension.extension.manifest[key].browser_style; + Assert.strictEqual(actual, expected, `Expected browser_style of "${key}"`); +} + +const BROWSER_STYLE_MV2_DEFAULTS = "BROWSER_STYLE_MV2_DEFAULTS"; +async function checkBrowserStyle({ + manifest_version = 3, + browser_style_in_manifest = null, + expected_browser_style, + expected_warnings, +}) { + const actionKey = manifest_version === 2 ? "browser_action" : "action"; + // sidebar_action is implemented in browser/ and therefore only available to + // Firefox desktop and not other toolkit apps such as Firefox for Android, + // Thunderbird, etc. + const IS_SIDEBAR_SUPPORTED = AppConstants.MOZ_BUILD_APP === "browser"; + const extension = ExtensionTestUtils.loadExtension({ + manifest: { + manifest_version, + options_ui: { + page: "options.html", + browser_style: browser_style_in_manifest, + }, + [actionKey]: { + browser_style: browser_style_in_manifest, + }, + page_action: { + browser_style: browser_style_in_manifest, + }, + sidebar_action: { + default_panel: "sidebar.html", + browser_style: browser_style_in_manifest, + }, + }, + }); + await extension.startup(); + if (expected_browser_style === BROWSER_STYLE_MV2_DEFAULTS) { + checkBrowserStyleInManifestKey(extension, "options_ui", true); + checkBrowserStyleInManifestKey(extension, actionKey, false); + checkBrowserStyleInManifestKey(extension, "page_action", false); + if (IS_SIDEBAR_SUPPORTED) { + checkBrowserStyleInManifestKey(extension, "sidebar_action", true); + } + } else { + let value = expected_browser_style; + checkBrowserStyleInManifestKey(extension, "options_ui", value); + checkBrowserStyleInManifestKey(extension, actionKey, value); + checkBrowserStyleInManifestKey(extension, "page_action", value); + if (IS_SIDEBAR_SUPPORTED) { + checkBrowserStyleInManifestKey(extension, "sidebar_action", value); + } + } + if (!IS_SIDEBAR_SUPPORTED) { + expected_warnings = expected_warnings.filter( + msg => !msg.includes("sidebar_action") + ); + expected_warnings.unshift( + `Reading manifest: Warning processing sidebar_action: An unexpected property was found in the WebExtension manifest.` + ); + } + const warnings = extension.extension.warnings; + await extension.unload(); + Assert.deepEqual( + warnings, + expected_warnings, + `Got expected warnings for MV${manifest_version} extension with browser_style:${browser_style_in_manifest}.` + ); +} + +async function checkBrowserStyleWithOpenInTabTrue({ + manifest_version = 3, + browser_style_in_manifest = null, + expected_browser_style, +}) { + info( + `Testing options_ui.open_in_tab=true + browser_style=${browser_style_in_manifest} for MV${manifest_version} extension` + ); + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + manifest_version, + options_ui: { + page: "options.html", + browser_style: browser_style_in_manifest, + open_in_tab: true, + }, + }, + }); + await extension.startup(); + checkBrowserStyleInManifestKey( + extension, + "options_ui", + expected_browser_style + ); + const warnings = extension.extension.warnings; + await extension.unload(); + Assert.deepEqual( + warnings, + [], + "Expected no warnings on extension with options_ui.open_in_tab true" + ); +} + +async function repeatTestIndependentOfPref_browser_style_same_as_mv2(testFn) { + for (let same_as_mv2 of [true, false]) { + await runWithPrefs([[PREF_SAME_AS_MV2, same_as_mv2]], testFn); + } +} +async function repeatTestIndependentOf_browser_style_deprecation_prefs(testFn) { + for (let supported of [true, false]) { + for (let same_as_mv2 of [true, false]) { + await runWithPrefs( + [ + [PREF_SUPPORTED, supported], + [PREF_SAME_AS_MV2, same_as_mv2], + ], + testFn + ); + } + } +} + +add_task(async function browser_style_never_deprecated_in_MV2() { + async function check_browser_style_never_deprecated_in_MV2() { + await checkBrowserStyle({ + manifest_version: 2, + browser_style_in_manifest: true, + expected_browser_style: true, + expected_warnings: [], + }); + await checkBrowserStyle({ + manifest_version: 2, + browser_style_in_manifest: false, + expected_browser_style: false, + expected_warnings: [], + }); + await checkBrowserStyle({ + manifest_version: 2, + browser_style_in_manifest: null, + expected_browser_style: "BROWSER_STYLE_MV2_DEFAULTS", + expected_warnings: [], + }); + + // When open_in_tab is true, browser_style is not used and its value does + // not matter. Since we want the parsed value to be false in MV3, and the + // implementation is simpler if consistently applied to MV2, browser_style + // is false when open_in_tab is true (even if browser_style:true is set). + await checkBrowserStyleWithOpenInTabTrue({ + manifest_version: 2, + browser_style_in_manifest: null, + expected_browser_style: false, + }); + await checkBrowserStyleWithOpenInTabTrue({ + manifest_version: 2, + browser_style_in_manifest: true, + expected_browser_style: false, + }); + } + // Regardless of all potential test configurations, browser_style is never + // deprecated in MV2. + await repeatTestIndependentOf_browser_style_deprecation_prefs( + check_browser_style_never_deprecated_in_MV2 + ); +}); + +add_task(async function open_in_tab_implies_browser_style_false_MV3() { + // Regardless of all potential test configurations, when + // options_ui.open_in_tab is true, options_ui.browser_style should be false, + // because it being true would print deprecation warnings in MV3, and + // browser_style:true does not have any effect when open_in_tab is true. + await repeatTestIndependentOf_browser_style_deprecation_prefs(async () => { + await checkBrowserStyleWithOpenInTabTrue({ + manifest_version: 3, + browser_style_in_manifest: null, + expected_browser_style: false, + }); + await checkBrowserStyleWithOpenInTabTrue({ + manifest_version: 3, + browser_style_in_manifest: true, + expected_browser_style: false, + }); + }); +}); + +// Disable browser_style:true - bug 1830711. +add_task(async function unsupported_and_browser_style_true() { + await checkBrowserStyle({ + manifest_version: 3, + browser_style_in_manifest: true, + expected_browser_style: false, + expected_warnings: [ + // TODO bug 1830712: Update warnings when max_manifest_version:2 is used. + `Reading manifest: Warning processing options_ui.browser_style: "browser_style:true" is no longer supported in Manifest Version 3.`, + `Reading manifest: Warning processing action.browser_style: "browser_style:true" is no longer supported in Manifest Version 3.`, + `Reading manifest: Warning processing page_action.browser_style: "browser_style:true" is no longer supported in Manifest Version 3.`, + `Reading manifest: Warning processing sidebar_action.browser_style: "browser_style:true" is no longer supported in Manifest Version 3.`, + ], + }); +}); + +add_task(async function unsupported_and_browser_style_false() { + await checkBrowserStyle({ + manifest_version: 3, + browser_style_in_manifest: false, + expected_browser_style: false, + // TODO bug 1830712: Add warnings when max_manifest_version:2 is used. + expected_warnings: [], + }); +}); + +add_task(async function unsupported_and_browser_style_default() { + await checkBrowserStyle({ + manifest_version: 3, + browser_style_in_manifest: null, + expected_browser_style: false, + expected_warnings: [], + }); +}); + +add_task( + { pref_set: [[PREF_SUPPORTED, true]] }, + async function supported_with_browser_style_true() { + await repeatTestIndependentOfPref_browser_style_same_as_mv2(async () => { + await checkBrowserStyle({ + manifest_version: 3, + browser_style_in_manifest: true, + expected_browser_style: true, + expected_warnings: [ + `Reading manifest: Warning processing options_ui.browser_style: "browser_style:true" has been deprecated in Manifest Version 3 and will be unsupported in the near future.`, + `Reading manifest: Warning processing action.browser_style: "browser_style:true" has been deprecated in Manifest Version 3 and will be unsupported in the near future.`, + `Reading manifest: Warning processing page_action.browser_style: "browser_style:true" has been deprecated in Manifest Version 3 and will be unsupported in the near future.`, + `Reading manifest: Warning processing sidebar_action.browser_style: "browser_style:true" has been deprecated in Manifest Version 3 and will be unsupported in the near future.`, + ], + }); + }); + } +); + +add_task( + { pref_set: [[PREF_SUPPORTED, true]] }, + async function supported_with_browser_style_false() { + await repeatTestIndependentOfPref_browser_style_same_as_mv2(async () => { + await checkBrowserStyle({ + manifest_version: 3, + browser_style_in_manifest: false, + expected_browser_style: false, + expected_warnings: [], + }); + }); + } +); + +// Initial prefs - warn only - https://bugzilla.mozilla.org/show_bug.cgi?id=1827910#c1 +add_task( + { + pref_set: [ + [PREF_SUPPORTED, true], + [PREF_SAME_AS_MV2, true], + ], + }, + async function supported_with_mv2_defaults() { + const makeWarning = manifestKey => + `Reading manifest: Warning processing ${manifestKey}.browser_style: "browser_style:true" has been deprecated in Manifest Version 3 and will be unsupported in the near future. While "${manifestKey}.browser_style" was not explicitly specified in manifest.json, its default value was true. Its default will change to false in Manifest Version 3 starting from Firefox 115.`; + await checkBrowserStyle({ + manifest_version: 3, + browser_style_in_manifest: null, + expected_browser_style: "BROWSER_STYLE_MV2_DEFAULTS", + expected_warnings: [ + makeWarning("options_ui"), + makeWarning("sidebar_action"), + ], + }); + } +); + +// Deprecation + change defaults - bug 1830710. +add_task( + { + pref_set: [ + [PREF_SUPPORTED, true], + [PREF_SAME_AS_MV2, false], + ], + }, + async function supported_with_browser_style_default_false() { + const makeWarning = manifestKey => + `Reading manifest: Warning processing ${manifestKey}.browser_style: "browser_style:true" has been deprecated in Manifest Version 3 and will be unsupported in the near future. While "${manifestKey}.browser_style" was not explicitly specified in manifest.json, its default value was true. The default value of "${manifestKey}.browser_style" has changed from true to false in Manifest Version 3.`; + await checkBrowserStyle({ + manifest_version: 3, + browser_style_in_manifest: null, + expected_browser_style: false, + expected_warnings: [ + makeWarning("options_ui"), + makeWarning("sidebar_action"), + ], + }); + } +); + +// While we are not planning to set this pref combination, users can do so if +// they desire. +add_task( + { + pref_set: [ + [PREF_SUPPORTED, false], + [PREF_SAME_AS_MV2, true], + ], + }, + async function unsupported_with_mv2_defaults() { + const makeWarning = manifestKey => + `Reading manifest: Warning processing ${manifestKey}.browser_style: "browser_style:true" is no longer supported in Manifest Version 3. While "${manifestKey}.browser_style" was not explicitly specified in manifest.json, its default value was true. Its default will change to false in Manifest Version 3 starting from Firefox 115.`; + await checkBrowserStyle({ + manifest_version: 3, + browser_style_in_manifest: null, + expected_browser_style: false, + expected_warnings: [ + makeWarning("options_ui"), + makeWarning("sidebar_action"), + ], + }); + } +); |