diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/xpcshell/test_dictionary_webextension.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/xpcshell/test_dictionary_webextension.js | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_dictionary_webextension.js b/toolkit/mozapps/extensions/test/xpcshell/test_dictionary_webextension.js new file mode 100644 index 0000000000..847d519036 --- /dev/null +++ b/toolkit/mozapps/extensions/test/xpcshell/test_dictionary_webextension.js @@ -0,0 +1,233 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ +"use strict"; + +XPCOMUtils.defineLazyServiceGetter( + this, + "spellCheck", + "@mozilla.org/spellchecker/engine;1", + "mozISpellCheckingEngine" +); + +add_task(async function setup() { + createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "61", "61"); + + // Initialize the URLPreloader so that we can load the built-in + // add-ons list, which contains the list of built-in dictionaries. + AddonTestUtils.initializeURLPreloader(); + + await promiseStartupManager(); + + // Starts collecting the Addon Manager Telemetry events. + AddonTestUtils.hookAMTelemetryEvents(); +}); + +add_task( + { + // We need to enable this pref because some assertions verify that + // `installOrigins` is collected in some Telemetry events. + pref_set: [["extensions.install_origins.enabled", true]], + }, + async function test_validation() { + await Assert.rejects( + promiseInstallWebExtension({ + manifest: { + browser_specific_settings: { + gecko: { id: "en-US-no-dic@dictionaries.mozilla.org" }, + }, + dictionaries: { + "en-US": "en-US.dic", + }, + }, + }), + /Expected file to be downloaded for install/ + ); + + await Assert.rejects( + promiseInstallWebExtension({ + manifest: { + browser_specific_settings: { + gecko: { id: "en-US-no-aff@dictionaries.mozilla.org" }, + }, + dictionaries: { + "en-US": "en-US.dic", + }, + }, + + files: { + "en-US.dic": "", + }, + }), + /Expected file to be downloaded for install/ + ); + + let addon = await promiseInstallWebExtension({ + manifest: { + browser_specific_settings: { + gecko: { id: "en-US-1@dictionaries.mozilla.org" }, + }, + dictionaries: { + "en-US": "en-US.dic", + }, + }, + + files: { + "en-US.dic": "", + "en-US.aff": "", + }, + }); + + let addon2 = await promiseInstallWebExtension({ + manifest: { + browser_specific_settings: { + gecko: { id: "en-US-2@dictionaries.mozilla.org" }, + }, + dictionaries: { + "en-US": "dictionaries/en-US.dic", + }, + }, + + files: { + "dictionaries/en-US.dic": "", + "dictionaries/en-US.aff": "", + }, + }); + + await addon.uninstall(); + await addon2.uninstall(); + + let amEvents = AddonTestUtils.getAMTelemetryEvents(); + + let amInstallEvents = amEvents + .filter(evt => evt.method === "install") + .map(evt => { + const { object, extra } = evt; + return { object, extra }; + }); + + Assert.deepEqual( + amInstallEvents.filter(evt => evt.object === "unknown"), + [ + { + object: "unknown", + extra: { + step: "started", + error: "ERROR_CORRUPT_FILE", + install_origins: "0", + }, + }, + { + object: "unknown", + extra: { + step: "started", + error: "ERROR_CORRUPT_FILE", + install_origins: "0", + }, + }, + ], + "Got the expected install telemetry events for the corrupted dictionaries" + ); + + Assert.deepEqual( + amInstallEvents.filter(evt => evt.extra.addon_id === addon.id), + [ + { + object: "dictionary", + extra: { step: "started", addon_id: addon.id, install_origins: "0" }, + }, + { + object: "dictionary", + extra: { + step: "completed", + addon_id: addon.id, + install_origins: "0", + }, + }, + ], + "Got the expected install telemetry events for the first installed dictionary" + ); + + Assert.deepEqual( + amInstallEvents.filter(evt => evt.extra.addon_id === addon2.id), + [ + { + object: "dictionary", + extra: { step: "started", addon_id: addon2.id, install_origins: "0" }, + }, + { + object: "dictionary", + extra: { + step: "completed", + addon_id: addon2.id, + install_origins: "0", + }, + }, + ], + "Got the expected install telemetry events for the second installed dictionary" + ); + + let amUninstallEvents = amEvents + .filter(evt => evt.method === "uninstall") + .map(evt => { + const { object, value } = evt; + return { object, value }; + }); + + Assert.deepEqual( + amUninstallEvents, + [ + { object: "dictionary", value: addon.id }, + { object: "dictionary", value: addon2.id }, + ], + "Got the expected uninstall telemetry events" + ); + } +); + +const WORD = "Flehgragh"; + +add_task(async function test_registration() { + spellCheck.dictionaries = ["en-US"]; + + ok(!spellCheck.check(WORD), "Word should not pass check before add-on loads"); + + let addon = await promiseInstallWebExtension({ + manifest: { + browser_specific_settings: { + gecko: { id: "en-US@dictionaries.mozilla.org" }, + }, + dictionaries: { + "en-US": "en-US.dic", + }, + }, + + files: { + "en-US.dic": `2\n${WORD}\nnativ/A\n`, + "en-US.aff": ` +SFX A Y 1 +SFX A 0 en [^elr] + `, + }, + }); + + ok( + spellCheck.check(WORD), + "Word should pass check while add-on load is loaded" + ); + ok(spellCheck.check("nativen"), "Words should have correct affixes"); + + await addon.uninstall(); + + await new Promise(executeSoon); + + ok( + !spellCheck.check(WORD), + "Word should not pass check after add-on unloads" + ); +}); + +add_task(function teardown_telemetry_events() { + // Ignore any additional telemetry events collected in this file. + AddonTestUtils.getAMTelemetryEvents(); +}); |