diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /toolkit/mozapps/extensions/test/xpcshell/test_installtrigger_deprecation.js | |
parent | Initial commit. (diff) | |
download | thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.tar.xz thunderbird-6bf0a5cb5034a7e684dcc3500e841785237ce2dd.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_installtrigger_deprecation.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_installtrigger_deprecation.js | 346 |
1 files changed, 346 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_installtrigger_deprecation.js b/toolkit/mozapps/extensions/test/xpcshell/test_installtrigger_deprecation.js new file mode 100644 index 0000000000..dfaeaa44f2 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_installtrigger_deprecation.js @@ -0,0 +1,346 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "42", "42"); + +const testserver = createHttpServer({ hosts: ["example.com"] }); + +function createTestPage(body) { + return `<!DOCTYPE html> + <html> + <head> + <meta charset="utf-8"> + </head> + <body> + ${body} + </body> + </html> + `; +} + +testserver.registerPathHandler( + "/installtrigger_ua_detection.html", + (request, response) => { + response.write( + createTestPage(` + <button/> + <script> + document.querySelector("button").onclick = () => { + typeof InstallTrigger; + }; + </script> + `) + ); + } +); + +testserver.registerPathHandler( + "/installtrigger_install.html", + (request, response) => { + response.write( + createTestPage(` + <button/> + <script> + const install = InstallTrigger.install.bind(InstallTrigger); + document.querySelector("button").onclick = () => { + install({ fakeextensionurl: "http://example.com/fakeextensionurl.xpi" }); + }; + </script> + `) + ); + } +); + +async function testDeprecationWarning(testPageURL, expectedDeprecationWarning) { + const page = await ExtensionTestUtils.loadContentPage(testPageURL); + + const { message, messageInnerWindowID, pageInnerWindowID } = await page.spawn( + [expectedDeprecationWarning], + expectedWarning => { + return new Promise(resolve => { + const consoleListener = consoleMsg => { + if ( + consoleMsg instanceof Ci.nsIScriptError && + consoleMsg.message?.includes(expectedWarning) + ) { + Services.console.unregisterListener(consoleListener); + resolve({ + message: consoleMsg.message, + messageInnerWindowID: consoleMsg.innerWindowID, + pageInnerWindowID: this.content.windowGlobalChild.innerWindowId, + }); + } + }; + + Services.console.registerListener(consoleListener); + this.content.document.querySelector("button").click(); + }); + } + ); + + equal( + typeof messageInnerWindowID, + "number", + `Warning message should be associated to an innerWindowID` + ); + equal( + messageInnerWindowID, + pageInnerWindowID, + `Deprecation warning "${message}" has been logged and associated to the expected window` + ); + + await page.close(); + + return message; +} + +add_task( + { + pref_set: [ + ["extensions.InstallTrigger.enabled", true], + ["extensions.InstallTriggerImpl.enabled", true], + ], + }, + function testDeprecationWarningsOnUADetection() { + return testDeprecationWarning( + "http://example.com/installtrigger_ua_detection.html", + "InstallTrigger is deprecated and will be removed in the future." + ); + } +); + +add_task( + { + pref_set: [ + ["extensions.InstallTrigger.enabled", true], + ["extensions.InstallTriggerImpl.enabled", true], + ], + }, + async function testDeprecationWarningsOnInstallTriggerInstall() { + const message = await testDeprecationWarning( + "http://example.com/installtrigger_install.html", + "InstallTrigger.install() is deprecated and will be removed in the future." + ); + + const moreInfoURL = + "https://extensionworkshop.com/documentation/publish/self-distribution/"; + + ok( + message.includes(moreInfoURL), + "Deprecation warning should include an url to self-distribution documentation" + ); + } +); + +async function testInstallTriggerDeprecationPrefs(expectedResults) { + const page = await ExtensionTestUtils.loadContentPage("http://example.com"); + const promiseResults = page.spawn([], () => { + return { + uaDetectionResult: this.content.eval( + "typeof InstallTrigger !== 'undefined'" + ), + typeofInstallMethod: this.content.eval("typeof InstallTrigger?.install"), + }; + }); + if (expectedResults.error) { + await Assert.rejects( + promiseResults, + expectedResults.error, + "Got the expected error" + ); + } else { + Assert.deepEqual( + await promiseResults, + expectedResults, + "Got the expected results" + ); + } + await page.close(); +} + +add_task( + { + pref_set: [ + ["extensions.InstallTrigger.enabled", true], + ["extensions.InstallTriggerImpl.enabled", false], + ], + }, + function testInstallTriggerImplDisabled() { + return testInstallTriggerDeprecationPrefs({ + uaDetectionResult: true, + typeofInstallMethod: "undefined", + }); + } +); + +add_task( + { + pref_set: [["extensions.InstallTrigger.enabled", false]], + }, + function testInstallTriggerDisabled() { + return testInstallTriggerDeprecationPrefs({ + error: /ReferenceError: InstallTrigger is not defined/, + }); + } +); + +add_task( + { + pref_set: [ + ["extensions.remoteSettings.disabled", false], + ["extensions.InstallTrigger.enabled", true], + ["extensions.InstallTriggerImpl.enabled", true], + ], + }, + async function testInstallTriggerDeprecatedFromRemoteSettings() { + await AddonTestUtils.promiseStartupManager(); + + // InstallTrigger is expected to be initially enabled. + await testInstallTriggerDeprecationPrefs({ + uaDetectionResult: true, + typeofInstallMethod: "function", + }); + + info("Test remote settings update to hide InstallTrigger methods"); + + // InstallTrigger global is expected to still be enabled, the install method + // to have been hidden. + const unexpectedPrefsBranchName = "extensions.unexpectedPrefs"; + await setAndEmitFakeRemoteSettingsData([ + { + id: "AddonManagerSettings", + installTriggerDeprecation: { + "extensions.InstallTriggerImpl.enabled": false, + // Unexpected preferences names would be just ignored. + [`${unexpectedPrefsBranchName}.fromProcessedEntry`]: true, + }, + otherFakeFutureSetting: { + [`${unexpectedPrefsBranchName}.fromFakeFutureSetting`]: true, + }, + // This entry is expected to always be processed when running this + // xpcshell test, the appInfo platformVersion is always set to 42 + // by the call to AddonTestUtils's createAppInfo. + filter_expression: "env.appinfo.platformVersion >= 42", + }, + { + // Entries entirely unexpected should be ignored even if they may be + // including a property named as the ones that AMRemoteSettings (e.g. + // it may be a new type of entry introduced for a new Firefox version, + // which a previous version of Firefox shouldn't try to process avoid + // undefined behaviors). + id: "AddonManagerSettings-fxFutureVersion", + // This entry is expected to always be filtered out by RemoteSettings, + // while running this xpcshell test the platformInfo version is always set + // to 42 by the call to AddonTestUtils's createAppInfo. + filter_expression: "env.appinfo.platformVersion >= 200", + installTriggerDeprecation: { + // If processed, it would fail the assertion that follows + // because it does change the same pref that the previous entry did + // set to false. + "extensions.InstallTriggerImpl.enabled": true, + }, + }, + ]); + await testInstallTriggerDeprecationPrefs({ + uaDetectionResult: true, + typeofInstallMethod: "undefined", + }); + + const unexpectedPrefBranch = Services.prefs.getBranch( + unexpectedPrefsBranchName + ); + equal( + unexpectedPrefBranch.getPrefType("fromFakeFutureSetting"), + unexpectedPrefBranch.PREF_INVALID, + "Preferences included in an unexpected entry property should not be set" + ); + equal( + unexpectedPrefBranch.getPrefType("fromProcessedEntry"), + unexpectedPrefBranch.PREF_INVALID, + undefined, + "Unexpected pref included in the installTriggerDeprecation entry should not be set" + ); + + info("Test remote settings update to hide InstallTrigger global"); + // InstallTrigger global is expected to still be enabled, the install method + // to have been hidden. + await setAndEmitFakeRemoteSettingsData([ + { + id: "AddonManagerSettings", + installTriggerDeprecation: { + "extensions.InstallTrigger.enabled": false, + }, + }, + ]); + await testInstallTriggerDeprecationPrefs({ + error: /ReferenceError: InstallTrigger is not defined/, + }); + + info("Test remote settings update to re-enable InstallTrigger global"); + // InstallTrigger global is expected to still be enabled, the install method + // to have been hidden. + await setAndEmitFakeRemoteSettingsData([ + { + id: "AddonManagerSettings", + installTriggerDeprecation: { + "extensions.InstallTrigger.enabled": true, + "extensions.InstallTriggerImpl.enabled": false, + }, + }, + ]); + await testInstallTriggerDeprecationPrefs({ + uaDetectionResult: true, + typeofInstallMethod: "undefined", + }); + + info("Test remote settings update to re-enable InstallTrigger methods"); + // InstallTrigger global and method are both expected to be re-enabled. + await setAndEmitFakeRemoteSettingsData([ + { + id: "AddonManagerSettings", + installTriggerDeprecation: { + "extensions.InstallTrigger.enabled": true, + "extensions.InstallTriggerImpl.enabled": true, + }, + }, + ]); + await testInstallTriggerDeprecationPrefs({ + uaDetectionResult: true, + typeofInstallMethod: "function", + }); + + info("Test remote settings ignored when AMRemoteSettings is disabled"); + // RemoteSettings are expected to be ignored. + Services.prefs.setBoolPref("extensions.remoteSettings.disabled", true); + await setAndEmitFakeRemoteSettingsData( + [ + { + id: "AddonManagerSettings", + installTriggerDeprecation: { + "extensions.InstallTrigger.enabled": false, + "extensions.InstallTriggerImpl.enabled": false, + }, + }, + ], + false /* expectClientInitialized */ + ); + await testInstallTriggerDeprecationPrefs({ + uaDetectionResult: true, + typeofInstallMethod: "function", + }); + + info( + "Test previously synchronized are processed on AOM started when AMRemoteSettings are enabled" + ); + // RemoteSettings previously stored on disk are expected to disable InstallTrigger global and methods. + await AddonTestUtils.promiseShutdownManager(); + Services.prefs.setBoolPref("extensions.remoteSettings.disabled", false); + await AddonTestUtils.promiseStartupManager(); + await testInstallTriggerDeprecationPrefs({ + error: /ReferenceError: InstallTrigger is not defined/, + }); + + await AddonTestUtils.promiseShutdownManager(); + } +); |