summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/utils
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/test/browser/utils')
-rw-r--r--comm/mail/test/browser/utils/browser.ini13
-rw-r--r--comm/mail/test/browser/utils/browser_extensionSupport.js171
-rw-r--r--comm/mail/test/browser/utils/html/collections.html26
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>