diff options
Diffstat (limited to 'comm/mail/test/browser/utils')
-rw-r--r-- | comm/mail/test/browser/utils/browser.ini | 13 | ||||
-rw-r--r-- | comm/mail/test/browser/utils/browser_extensionSupport.js | 171 | ||||
-rw-r--r-- | comm/mail/test/browser/utils/html/collections.html | 26 |
3 files changed, 210 insertions, 0 deletions
diff --git a/comm/mail/test/browser/utils/browser.ini b/comm/mail/test/browser/utils/browser.ini new file mode 100644 index 0000000000..a3393b0c79 --- /dev/null +++ b/comm/mail/test/browser/utils/browser.ini @@ -0,0 +1,13 @@ +[DEFAULT] +prefs = + mail.addr_book.useNewAddressBook=false + mail.provider.suppress_dialog_on_startup=true + mail.spotlight.firstRunDone=true + mail.winsearch.firstRunDone=true + mailnews.start_page.override_url=about:blank + mailnews.start_page.url=about:blank + datareporting.policy.dataSubmissionPolicyBypassNotification=true +subsuite = thunderbird + +[browser_extensionSupport.js] +support-files = html/collections.html diff --git a/comm/mail/test/browser/utils/browser_extensionSupport.js b/comm/mail/test/browser/utils/browser_extensionSupport.js new file mode 100644 index 0000000000..2a64fedc27 --- /dev/null +++ b/comm/mail/test/browser/utils/browser_extensionSupport.js @@ -0,0 +1,171 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +/** + * Tests ExtensionSupport.jsm functions. + */ + +var { close_compose_window, open_compose_new_mail } = ChromeUtils.import( + "resource://testing-common/mozmill/ComposeHelpers.jsm" +); +var { + plan_for_new_window, + plan_for_window_close, + wait_for_new_window, + wait_for_window_close, +} = ChromeUtils.import("resource://testing-common/mozmill/WindowHelpers.jsm"); + +var { ExtensionSupport } = ChromeUtils.import( + "resource:///modules/ExtensionSupport.jsm" +); + +/** + * Bug 1450288 + * Test ExtensionSupport.registerWindowListener and ExtensionSupport.unregisterWindowListener. + */ +add_task(function test_windowListeners() { + // There may be some pre-existing listeners already set up, e.g. mozmill ones. + let originalListenerCount = ExtensionSupport.registeredWindowListenerCount; + + let addonRunCount = []; + addonRunCount.load = new Map(); + addonRunCount.unload = new Map(); + + function addonListener(aAddon, aEvent) { + if (!addonRunCount[aEvent].has(aAddon)) { + addonRunCount[aEvent].set(aAddon, 0); + } + addonRunCount[aEvent].set(aAddon, addonRunCount[aEvent].get(aAddon) + 1); + } + + function addonCount(aAddon, aEvent) { + if (!addonRunCount[aEvent].has(aAddon)) { + return 0; + } + + return addonRunCount[aEvent].get(aAddon); + } + + // Extension listening to all windows and all events. + Assert.ok( + ExtensionSupport.registerWindowListener("test-addon1", { + onLoadWindow() { + addonListener("test-addon1", "load"); + }, + onUnloadWindow() { + addonListener("test-addon1", "unload"); + }, + }) + ); + + Assert.equal(addonCount("test-addon1", "load"), 2); + + // Extension listening to compose window only. + Assert.ok( + ExtensionSupport.registerWindowListener("test-addon2", { + chromeURLs: [ + "chrome://messenger/content/messengercompose/messengercompose.xhtml", + ], + onLoadWindow() { + addonListener("test-addon2", "load"); + }, + onUnloadWindow() { + addonListener("test-addon2", "unload"); + }, + }) + ); + + let cwc = open_compose_new_mail(); + + Assert.equal(addonCount("test-addon1", "load"), 3); + Assert.equal(addonCount("test-addon2", "load"), 1); + + // Extension listening to compose window once while it is already open. + Assert.ok( + ExtensionSupport.registerWindowListener("test-addon3", { + chromeURLs: [ + "chrome://messenger/content/messengercompose/messengercompose.xhtml", + ], + onLoadWindow() { + addonListener("test-addon3", "load"); + ExtensionSupport.unregisterWindowListener("test-addon3"); + }, + }) + ); + + Assert.equal(addonCount("test-addon3", "load"), 1); + + // Extension listening to compose window while it is already open. + Assert.ok( + ExtensionSupport.registerWindowListener("test-addon4", { + chromeURLs: [ + "chrome://messenger/content/messengercompose/messengercompose.xhtml", + ], + onLoadWindow() { + addonListener("test-addon4", "load"); + }, + onUnloadWindow() { + addonListener("test-addon4", "unload"); + ExtensionSupport.unregisterWindowListener("test-addon4"); + }, + }) + ); + + Assert.equal(addonCount("test-addon4", "load"), 1); + + close_compose_window(cwc); + + Assert.equal(addonCount("test-addon1", "unload"), 1); + Assert.equal(addonCount("test-addon2", "unload"), 1); + Assert.equal(addonCount("test-addon3", "unload"), 0); + Assert.equal(addonCount("test-addon4", "unload"), 1); + + cwc = open_compose_new_mail(); + + Assert.equal(addonCount("test-addon1", "load"), 4); + // Addon3 didn't listen to the new compose window, addon2 did. + Assert.equal(addonCount("test-addon2", "load"), 2); + Assert.equal(addonCount("test-addon3", "load"), 1); + + close_compose_window(cwc); + + Assert.equal(addonCount("test-addon1", "unload"), 2); + Assert.equal(addonCount("test-addon2", "unload"), 2); + Assert.equal(addonCount("test-addon3", "unload"), 0); + + plan_for_new_window("Activity:Manager"); + window.openActivityMgr(); + let amController = wait_for_new_window("Activity:Manager"); + + // Only Addon1 listens to any window. + Assert.equal(addonCount("test-addon1", "load"), 5); + Assert.equal(addonCount("test-addon2", "load"), 2); + Assert.equal(addonCount("test-addon3", "load"), 1); + Assert.equal(addonCount("test-addon4", "load"), 1); + + plan_for_window_close(amController); + amController.window.close(); + wait_for_window_close(amController); + + Assert.equal(addonCount("test-addon1", "unload"), 3); + Assert.equal(addonCount("test-addon2", "unload"), 2); + Assert.equal(addonCount("test-addon3", "unload"), 0); + Assert.equal(addonCount("test-addon4", "unload"), 1); + + // Registering with some invalid data should fail. + Assert.ok(!ExtensionSupport.registerWindowListener("", {})); + Assert.ok(!ExtensionSupport.registerWindowListener("test-addon1", {})); + Assert.ok(!ExtensionSupport.registerWindowListener("test-addon5", {})); + Assert.ok(!ExtensionSupport.unregisterWindowListener("")); + Assert.ok(!ExtensionSupport.unregisterWindowListener("test-addon5")); + + // Clean up addon registrations. addon3 unregistered itself already. + Assert.ok(ExtensionSupport.unregisterWindowListener("test-addon1")); + Assert.ok(ExtensionSupport.unregisterWindowListener("test-addon2")); + Assert.ok(!ExtensionSupport.unregisterWindowListener("test-addon3")); + Assert.equal( + ExtensionSupport.registeredWindowListenerCount, + originalListenerCount + ); +}); diff --git a/comm/mail/test/browser/utils/html/collections.html b/comm/mail/test/browser/utils/html/collections.html new file mode 100644 index 0000000000..e51ee98216 --- /dev/null +++ b/comm/mail/test/browser/utils/html/collections.html @@ -0,0 +1,26 @@ +<html> + <head> + <title>Collections</title> + <script> + const JS_HAS_SYMBOLS = typeof Symbol === "function"; + const ITERATOR_SYMBOL = JS_HAS_SYMBOLS ? Symbol.iterator : "@@iterator"; + var gIterator = (function* () { + yield 1; yield 2; yield 3; yield 4; yield 5; + })(); + + var gCustomIterator = { + _array: [6, 7, 8, 9], + *[ITERATOR_SYMBOL]() { + for (var i = 0; i < this._array.length; ++i) { + yield this._array[i]; + } + }, + }; + </script> + </head> + <body> + I have two collections defined - gIterator is an iterator, and contains + [1, 2, 3, 4, 5], and gCustomIterator is an object with an @@iterator + method that contains [6, 7, 8, 9]. + </body> +</html> |