aboutsummaryrefslogtreecommitdiff
path: root/tools/addon-sdk-1.7/packages/addon-kit/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tools/addon-sdk-1.7/packages/addon-kit/tests')
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/helpers.js23
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/pagemod-test-helpers.js67
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-addon-page.js51
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-clipboard.js64
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-context-menu.html45
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-context-menu.js2067
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-hotkeys.js160
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-l10n.js97
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-module.js37
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-notifications.js46
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-page-mod.js526
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-page-worker.js366
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-panel.js466
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-passwords.js281
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-private-browsing.js204
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-request.js340
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-selection.js458
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-simple-prefs.js175
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-simple-storage.js311
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-tabs.js900
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-timers.js12
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-widget.js1010
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/tests/test-windows.js309
23 files changed, 0 insertions, 8015 deletions
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/helpers.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/helpers.js
deleted file mode 100644
index 399046f..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/helpers.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-const { Loader } = require("@loader");
-
-exports.Loader = function(module, globals) {
- var options = JSON.parse(JSON.stringify(require("@packaging")));
- options.globals = globals;
- let loader = Loader.new(options);
- return Object.create(loader, {
- require: { value: Loader.require.bind(loader, module.path) },
- sandbox: { value: function sandbox(id) {
- let path = options.manifest[module.path].requirements[id].path;
- return loader.sandboxes[path].sandbox;
- }},
- unload: { value: function unload(reason, callback) {
- loader.unload(reason, callback);
- }}
- })
-};
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/pagemod-test-helpers.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/pagemod-test-helpers.js
deleted file mode 100644
index 7c741eb..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/pagemod-test-helpers.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-const {Cc,Ci} = require("chrome");
-const timer = require("timer");
-const xulApp = require("xul-app");
-const { Loader } = require('./helpers');
-
-/**
- * A helper function that creates a PageMod, then opens the specified URL
- * and checks the effect of the page mod on 'onload' event via testCallback.
- */
-exports.testPageMod = function testPageMod(test, testURL, pageModOptions,
- testCallback, timeout) {
- if (!xulApp.versionInRange(xulApp.platformVersion, "1.9.3a3", "*") &&
- !xulApp.versionInRange(xulApp.platformVersion, "1.9.2.7", "1.9.2.*")) {
- test.pass("Note: not testing PageMod, as it doesn't work on this platform version");
- return null;
- }
-
- var wm = Cc['@mozilla.org/appshell/window-mediator;1']
- .getService(Ci.nsIWindowMediator);
- var browserWindow = wm.getMostRecentWindow("navigator:browser");
- if (!browserWindow) {
- test.pass("page-mod tests: could not find the browser window, so " +
- "will not run. Use -a firefox to run the pagemod tests.")
- return null;
- }
-
- if (timeout !== undefined)
- test.waitUntilDone(timeout);
- else
- test.waitUntilDone();
-
- let loader = Loader(module);
- let pageMod = loader.require("page-mod");
-
- var pageMods = [new pageMod.PageMod(opts) for each(opts in pageModOptions)];
-
- var tabBrowser = browserWindow.gBrowser;
- var newTab = tabBrowser.addTab(testURL);
- tabBrowser.selectedTab = newTab;
- var b = tabBrowser.getBrowserForTab(newTab);
-
- function onPageLoad() {
- b.removeEventListener("load", onPageLoad, true);
- // Delay callback execute as page-mod content scripts may be executed on
- // load event. So page-mod actions may not be already done.
- // If we delay even more contentScriptWhen:'end', we may want to modify
- // this code again.
- timer.setTimeout(testCallback, 0,
- b.contentWindow.wrappedJSObject,
- function done() {
- pageMods.forEach(function(mod) mod.destroy());
- // XXX leaks reported if we don't close the tab?
- tabBrowser.removeTab(newTab);
- loader.unload();
- test.done();
- });
- }
- b.addEventListener("load", onPageLoad, true);
-
- return pageMods;
-}
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-addon-page.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-addon-page.js
deleted file mode 100644
index c0ee35d..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-addon-page.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* 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/. */
-
-'use strict';
-
-const { isTabOpen, activateTab, openTab, closeTab } = require('api-utils/tabs/utils');
-const windows = require('api-utils/window-utils');
-const { Loader } = require('./helpers');
-const { setTimeout } = require('api-utils/timer');
-
-let uri = require('self').data.url('index.html');
-
-function isChromeVisible(window)
- window.document.documentElement.getAttribute('disablechrome') !== 'true'
-
-exports['test that add-on page has no chrome'] = function(assert, done) {
- let loader = Loader(module);
- loader.require('addon-kit/addon-page');
-
- let window = windows.activeBrowserWindow;
- let tab = openTab(window, uri);
-
- assert.ok(isChromeVisible(window), 'chrome is visible for non addon page');
-
- // need to do this in another turn to make sure event listener
- // that sets property has time to do that.
- setTimeout(function() {
- activateTab(tab);
-
- assert.ok(!isChromeVisible(window), 'chrome is not visible for addon page');
-
- closeTab(tab);
- assert.ok(isChromeVisible(window), 'chrome is visible again');
- loader.unload();
- done();
- });
-};
-
-exports['test that add-on pages is closed on unload'] = function(assert) {
- let loader = Loader(module);
- loader.require('addon-kit/addon-page');
-
- let tab = openTab(windows.activeBrowserWindow, uri);
- loader.unload();
-
- assert.ok(isTabOpen(tab), 'add-on page tabs are closed on unload');
-};
-
-
-require('test').run(exports);
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-clipboard.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-clipboard.js
deleted file mode 100644
index 1819d68..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-clipboard.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/* 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/. */
-
-
-// Test the typical use case, setting & getting with no flavors specified
-exports.testWithNoFlavor = function(test) {
- var contents = "hello there";
- var flavor = "text";
- var fullFlavor = "text/unicode";
- var clip = require("clipboard");
- // Confirm we set the clipboard
- test.assert(clip.set(contents));
- // Confirm flavor is set
- test.assertEqual(clip.currentFlavors[0], flavor);
- // Confirm we set the clipboard
- test.assertEqual(clip.get(), contents);
- // Confirm we can get the clipboard using the flavor
- test.assertEqual(clip.get(flavor), contents);
- // Confirm we can still get the clipboard using the full flavor
- test.assertEqual(clip.get(fullFlavor), contents);
-};
-
-// Test the slightly less common case where we specify the flavor
-exports.testWithFlavor = function(test) {
- var contents = "<b>hello there</b>";
- var contentsText = "hello there";
- var flavor = "html";
- var fullFlavor = "text/html";
- var unicodeFlavor = "text";
- var unicodeFullFlavor = "text/unicode";
- var clip = require("clipboard");
- test.assert(clip.set(contents, flavor));
- test.assertEqual(clip.currentFlavors[0], unicodeFlavor);
- test.assertEqual(clip.currentFlavors[1], flavor);
- test.assertEqual(clip.get(), contentsText);
- test.assertEqual(clip.get(flavor), contents);
- test.assertEqual(clip.get(fullFlavor), contents);
- test.assertEqual(clip.get(unicodeFlavor), contentsText);
- test.assertEqual(clip.get(unicodeFullFlavor), contentsText);
-};
-
-// Test that the typical case still works when we specify the flavor to set
-exports.testWithRedundantFlavor = function(test) {
- var contents = "<b>hello there</b>";
- var flavor = "text";
- var fullFlavor = "text/unicode";
- var clip = require("clipboard");
- test.assert(clip.set(contents, flavor));
- test.assertEqual(clip.currentFlavors[0], flavor);
- test.assertEqual(clip.get(), contents);
- test.assertEqual(clip.get(flavor), contents);
- test.assertEqual(clip.get(fullFlavor), contents);
-};
-
-exports.testNotInFlavor = function(test) {
- var contents = "hello there";
- var flavor = "html";
- var clip = require("clipboard");
- test.assert(clip.set(contents));
- // If there's nothing on the clipboard with this flavor, should return null
- test.assertEqual(clip.get(flavor), null);
-};
-// TODO: Test error cases.
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-context-menu.html b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-context-menu.html
deleted file mode 100644
index 4196d5f..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-context-menu.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<!-- 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/. -->
-
-<html>
- <head>
- <title>Context menu test</title>
- </head>
- <body>
- <p>
- <img id="image" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg==">
- </p>
-
- <p>
- <a id="link" href="">
- A simple link.
- </a>
- </p>
-
- <p>
- <a href="">
- <span id="span-link">
- A span inside a link.
- </span>
- </a>
- </p>
-
- <p id="text">
- Some text.
- </p>
-
- <p>
- <textarea id="textfield">
- A text field,
- with some text.
- </textarea>
- </p>
-
- <p>
- <iframe id="iframe" src="data:text/html,An iframe."
- width="200" height="100">
- </iframe>
- </p>
- </body>
-</html>
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-context-menu.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-context-menu.js
deleted file mode 100644
index c398933..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-context-menu.js
+++ /dev/null
@@ -1,2067 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* vim:set ts=2 sw=2 sts=2 et: */
-/* 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/. */
-
-let {Cc,Ci} = require("chrome");
-const { Loader } = require('./helpers');
-
-// These should match the same constants in the module.
-const ITEM_CLASS = "jetpack-context-menu-item";
-const SEPARATOR_ID = "jetpack-context-menu-separator";
-const OVERFLOW_THRESH_DEFAULT = 10;
-const OVERFLOW_THRESH_PREF =
- "extensions.addon-sdk.context-menu.overflowThreshold";
-const OVERFLOW_MENU_ID = "jetpack-content-menu-overflow-menu";
-const OVERFLOW_POPUP_ID = "jetpack-content-menu-overflow-popup";
-
-const TEST_DOC_URL = module.uri.replace(/\.js$/, ".html");
-
-// Destroying items that were previously created should cause them to be absent
-// from the menu.
-exports.testConstructDestroy = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- // Create an item.
- let item = new loader.cm.Item({ label: "item" });
- test.assertEqual(item.parentMenu, null, "item's parent menu should be null");
-
- test.showMenu(null, function (popup) {
-
- // It should be present when the menu is shown.
- test.checkMenu([item], [], []);
- popup.hidePopup();
-
- // Destroy the item. Multiple destroys should be harmless.
- item.destroy();
- item.destroy();
- test.showMenu(null, function (popup) {
-
- // It should be removed from the menu.
- test.checkMenu([], [], [item]);
- test.done();
- });
- });
-};
-
-
-// Destroying an item twice should not cause an error.
-exports.testDestroyTwice = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({ label: "item" });
- item.destroy();
- item.destroy();
-
- test.pass("Destroying an item twice should not cause an error.");
- test.done();
-};
-
-
-// CSS selector contexts should cause their items to be present in the menu
-// when the menu is invoked on nodes that match the selectors.
-exports.testSelectorContextMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "item",
- data: "item",
- context: loader.cm.SelectorContext("img")
- });
-
- test.withTestDoc(function (window, doc) {
- test.showMenu(doc.getElementById("image"), function (popup) {
- test.checkMenu([item], [], []);
- test.done();
- });
- });
-};
-
-
-// CSS selector contexts should cause their items to be present in the menu
-// when the menu is invoked on nodes that have ancestors that match the
-// selectors.
-exports.testSelectorAncestorContextMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "item",
- data: "item",
- context: loader.cm.SelectorContext("a[href]")
- });
-
- test.withTestDoc(function (window, doc) {
- test.showMenu(doc.getElementById("span-link"), function (popup) {
- test.checkMenu([item], [], []);
- test.done();
- });
- });
-};
-
-
-// CSS selector contexts should cause their items to be absent from the menu
-// when the menu is not invoked on nodes that match or have ancestors that
-// match the selectors.
-exports.testSelectorContextNoMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "item",
- data: "item",
- context: loader.cm.SelectorContext("img")
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([], [item], []);
- test.done();
- });
-};
-
-
-// Page contexts should cause their items to be present in the menu when the
-// menu is not invoked on an active element.
-exports.testPageContextMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let items = [
- new loader.cm.Item({
- label: "item 0"
- }),
- new loader.cm.Item({
- label: "item 1",
- context: undefined
- }),
- new loader.cm.Item({
- label: "item 2",
- context: loader.cm.PageContext()
- }),
- new loader.cm.Item({
- label: "item 3",
- context: [loader.cm.PageContext()]
- })
- ];
-
- test.showMenu(null, function (popup) {
- test.checkMenu(items, [], []);
- test.done();
- });
-};
-
-
-// Page contexts should cause their items to be absent from the menu when the
-// menu is invoked on an active element.
-exports.testPageContextNoMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let items = [
- new loader.cm.Item({
- label: "item 0"
- }),
- new loader.cm.Item({
- label: "item 1",
- context: undefined
- }),
- new loader.cm.Item({
- label: "item 2",
- context: loader.cm.PageContext()
- }),
- new loader.cm.Item({
- label: "item 3",
- context: [loader.cm.PageContext()]
- })
- ];
-
- test.withTestDoc(function (window, doc) {
- test.showMenu(doc.getElementById("image"), function (popup) {
- test.checkMenu([], items, []);
- test.done();
- });
- });
-};
-
-
-// Selection contexts should cause items to appear when a selection exists.
-exports.testSelectionContextMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = loader.cm.Item({
- label: "item",
- context: loader.cm.SelectionContext()
- });
-
- test.withTestDoc(function (window, doc) {
- window.getSelection().selectAllChildren(doc.body);
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- test.done();
- });
- });
-};
-
-
-// Selection contexts should cause items to appear when a selection exists in
-// a text field.
-exports.testSelectionContextMatchInTextField = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = loader.cm.Item({
- label: "item",
- context: loader.cm.SelectionContext()
- });
-
- test.withTestDoc(function (window, doc) {
- let textfield = doc.getElementById("textfield");
- textfield.setSelectionRange(0, textfield.value.length);
- test.showMenu(textfield, function (popup) {
- test.checkMenu([item], [], []);
- test.done();
- });
- });
-};
-
-
-// Selection contexts should not cause items to appear when a selection does
-// not exist in a text field.
-exports.testSelectionContextNoMatchInTextField = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = loader.cm.Item({
- label: "item",
- context: loader.cm.SelectionContext()
- });
-
- test.withTestDoc(function (window, doc) {
- let textfield = doc.getElementById("textfield");
- textfield.setSelectionRange(0, 0);
- test.showMenu(textfield, function (popup) {
- test.checkMenu([], [item], []);
- test.done();
- });
- });
-};
-
-
-// Selection contexts should not cause items to appear when a selection does
-// not exist.
-exports.testSelectionContextNoMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = loader.cm.Item({
- label: "item",
- context: loader.cm.SelectionContext()
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([], [item], []);
- test.done();
- });
-};
-
-
-// URL contexts should cause items to appear on pages that match.
-exports.testURLContextMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let items = [
- loader.cm.Item({
- label: "item 0",
- context: loader.cm.URLContext(TEST_DOC_URL)
- }),
- loader.cm.Item({
- label: "item 1",
- context: loader.cm.URLContext([TEST_DOC_URL, "*.bogus.com"])
- })
- ];
-
- test.withTestDoc(function (window, doc) {
- test.showMenu(null, function (popup) {
- test.checkMenu(items, [], []);
- test.done();
- });
- });
-};
-
-
-// URL contexts should not cause items to appear on pages that do not match.
-exports.testURLContextNoMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let items = [
- loader.cm.Item({
- label: "item 0",
- context: loader.cm.URLContext("*.bogus.com")
- }),
- loader.cm.Item({
- label: "item 1",
- context: loader.cm.URLContext(["*.bogus.com", "*.gnarly.com"])
- })
- ];
-
- test.withTestDoc(function (window, doc) {
- test.showMenu(null, function (popup) {
- test.checkMenu([], items, []);
- test.done();
- });
- });
-};
-
-
-// Removing a non-matching URL context after its item is created and the page is
-// loaded should cause the item's content script to be evaluated.
-exports.testURLContextRemove = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let shouldBeEvaled = false;
- let context = loader.cm.URLContext("*.bogus.com");
- let item = loader.cm.Item({
- label: "item",
- context: context,
- contentScript: 'self.postMessage("ok");',
- onMessage: function (msg) {
- test.assert(shouldBeEvaled,
- "content script should be evaluated when expected");
- shouldBeEvaled = false;
- test.done();
- }
- });
-
- test.withTestDoc(function (window, doc) {
- shouldBeEvaled = true;
- item.context.remove(context);
- });
-};
-
-
-// Adding a non-matching URL context after its item is created and the page is
-// loaded should cause the item's worker to be destroyed.
-exports.testURLContextAdd = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = loader.cm.Item({ label: "item" });
-
- test.withTestDoc(function (window, doc) {
- let privatePropsKey = loader.globalScope.PRIVATE_PROPS_KEY;
- let workerReg = item.valueOf(privatePropsKey)._workerReg;
-
- let found = false;
- for each (let winWorker in workerReg.winWorkers) {
- if (winWorker.win === window) {
- found = true;
- break;
- }
- }
- this.test.assert(found, "window should be present in worker registry");
-
- item.context.add(loader.cm.URLContext("*.bogus.com"));
-
- for each (let winWorker in workerReg.winWorkers)
- this.test.assertNotEqual(winWorker.win, window,
- "window should not be present in worker registry");
-
- test.done();
- });
-};
-
-
-// Content contexts that return true should cause their items to be present
-// in the menu.
-exports.testContentContextMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "item",
- contentScript: 'self.on("context", function () true);'
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- test.done();
- });
-};
-
-
-// Content contexts that return false should cause their items to be absent
-// from the menu.
-exports.testContentContextNoMatch = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "item",
- contentScript: 'self.on("context", function () false);'
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([], [item], []);
- test.done();
- });
-};
-
-
-// Content contexts that return a string should cause their items to be present
-// in the menu and the items' labels to be updated.
-exports.testContentContextMatchString = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "first label",
- contentScript: 'self.on("context", function () "second label");'
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- test.assertEqual(item.label, "second label",
- "item's label should be updated");
- test.done();
- });
-};
-
-
-// Ensure that contentScripFile is working correctly
-exports.testContentScriptFile = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- // Reject remote files
- test.assertRaises(function() {
- new loader.cm.Item({
- label: "item",
- contentScriptFile: "http://mozilla.com/context-menu.js"
- });
- },
- "The 'contentScriptFile' option must be a local file URL " +
- "or an array of local file URLs.",
- "Item throws when contentScriptFile is a remote URL");
-
- // But accept files from data folder
- let item = new loader.cm.Item({
- label: "item",
- contentScriptFile: require("self").data.url("test-context-menu.js")
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- test.done();
- });
-};
-
-
-// The args passed to context listeners should be correct.
-exports.testContentContextArgs = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
- let callbacks = 0;
-
- let item = new loader.cm.Item({
- label: "item",
- contentScript: 'self.on("context", function (node) {' +
- ' let Ci = Components.interfaces;' +
- ' self.postMessage(node instanceof Ci.nsIDOMHTMLElement);' +
- ' return false;' +
- '});',
- onMessage: function (isElt) {
- test.assert(isElt, "node should be an HTML element");
- if (++callbacks == 2) test.done();
- }
- });
-
- test.showMenu(null, function () {
- if (++callbacks == 2) test.done();
- });
-};
-
-// Multiple contexts imply intersection, not union, and content context
-// listeners should not be called if all declarative contexts are not current.
-exports.testMultipleContexts = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "item",
- context: [loader.cm.SelectorContext("a[href]"), loader.cm.PageContext()],
- contentScript: 'self.on("context", function () self.postMessage());',
- onMessage: function () {
- test.fail("Context listener should not be called");
- }
- });
-
- test.withTestDoc(function (window, doc) {
- test.showMenu(doc.getElementById("span-link"), function (popup) {
- test.checkMenu([], [item], []);
- test.done();
- });
- });
-};
-
-// Once a context is removed, it should no longer cause its item to appear.
-exports.testRemoveContext = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let ctxt = loader.cm.SelectorContext("img");
- let item = new loader.cm.Item({
- label: "item",
- context: ctxt
- });
-
- test.withTestDoc(function (window, doc) {
- test.showMenu(doc.getElementById("image"), function (popup) {
-
- // The item should be present at first.
- test.checkMenu([item], [], []);
- popup.hidePopup();
-
- // Remove the img context and check again.
- item.context.remove(ctxt);
- test.showMenu(doc.getElementById("image"), function (popup) {
- test.checkMenu([], [item], []);
- test.done();
- });
- });
- });
-};
-
-
-// Lots of items should overflow into the overflow submenu.
-exports.testOverflow = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let items = [];
- for (let i = 0; i < OVERFLOW_THRESH_DEFAULT + 1; i++) {
- let item = new loader.cm.Item({ label: "item " + i });
- items.push(item);
- }
-
- test.showMenu(null, function (popup) {
- test.checkMenu(items, [], []);
- test.done();
- });
-};
-
-
-// Module unload should cause all items to be removed.
-exports.testUnload = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({ label: "item" });
-
- test.showMenu(null, function (popup) {
-
- // The menu should contain the item.
- test.checkMenu([item], [], []);
- popup.hidePopup();
-
- // Unload the module.
- loader.unload();
- test.showMenu(null, function (popup) {
-
- // The item should be removed from the menu.
- test.checkMenu([], [], [item]);
- test.done();
- });
- });
-};
-
-
-// Using multiple module instances to add items without causing overflow should
-// work OK. Assumes OVERFLOW_THRESH_DEFAULT <= 2.
-exports.testMultipleModulesAdd = function (test) {
- test = new TestHelper(test);
- let loader0 = test.newLoader();
- let loader1 = test.newLoader();
-
- // Use each module to add an item, then unload each module in turn.
- let item0 = new loader0.cm.Item({ label: "item 0" });
- let item1 = new loader1.cm.Item({ label: "item 1" });
-
- test.showMenu(null, function (popup) {
-
- // The menu should contain both items.
- test.checkMenu([item0, item1], [], []);
- popup.hidePopup();
-
- // Unload the first module.
- loader0.unload();
- test.showMenu(null, function (popup) {
-
- // The first item should be removed from the menu.
- test.checkMenu([item1], [], [item0]);
- popup.hidePopup();
-
- // Unload the second module.
- loader1.unload();
- test.showMenu(null, function (popup) {
-
- // Both items should be removed from the menu.
- test.checkMenu([], [], [item0, item1]);
- test.done();
- });
- });
- });
-};
-
-
-// Using multiple module instances to add items causing overflow should work OK.
-exports.testMultipleModulesAddOverflow = function (test) {
- test = new TestHelper(test);
- let loader0 = test.newLoader();
- let loader1 = test.newLoader();
-
- // Use module 0 to add OVERFLOW_THRESH_DEFAULT items.
- let items0 = [];
- for (let i = 0; i < OVERFLOW_THRESH_DEFAULT; i++) {
- let item = new loader0.cm.Item({ label: "item 0 " + i });
- items0.push(item);
- }
-
- // Use module 1 to add one item.
- let item1 = new loader1.cm.Item({ label: "item 1" });
-
- let allItems = items0.concat(item1);
-
- test.showMenu(null, function (popup) {
-
- // The menu should contain all items in overflow.
- test.checkMenu(allItems, [], []);
- popup.hidePopup();
-
- // Unload the first module.
- loader0.unload();
- test.showMenu(null, function (popup) {
-
- // The first items should be removed from the menu, which should not
- // overflow.
- test.checkMenu([item1], [], items0);
- popup.hidePopup();
-
- // Unload the second module.
- loader1.unload();
- test.showMenu(null, function (popup) {
-
- // All items should be removed from the menu.
- test.checkMenu([], [], allItems);
- test.done();
- });
- });
- });
-};
-
-
-// Using multiple module instances to modify the menu without causing overflow
-// should work OK. This test creates two loaders and:
-// loader0 create item -> loader1 create item -> loader0.unload ->
-// loader1.unload
-exports.testMultipleModulesDiffContexts1 = function (test) {
- test = new TestHelper(test);
- let loader0 = test.newLoader();
- let loader1 = test.newLoader();
-
- let item0 = new loader0.cm.Item({
- label: "item 0",
- context: loader0.cm.SelectorContext("img")
- });
-
- let item1 = new loader1.cm.Item({ label: "item 1" });
-
- test.showMenu(null, function (popup) {
-
- // The menu should contain item1.
- test.checkMenu([item1], [item0], []);
- popup.hidePopup();
-
- // Unload module 0.
- loader0.unload();
- test.showMenu(null, function (popup) {
-
- // item0 should be removed from the menu.
- test.checkMenu([item1], [], [item0]);
- popup.hidePopup();
-
- // Unload module 1.
- loader1.unload();
- test.showMenu(null, function (popup) {
-
- // Both items should be removed from the menu.
- test.checkMenu([], [], [item0, item1]);
- test.done();
- });
- });
- });
-};
-
-
-// Using multiple module instances to modify the menu without causing overflow
-// should work OK. This test creates two loaders and:
-// loader1 create item -> loader0 create item -> loader0.unload ->
-// loader1.unload
-exports.testMultipleModulesDiffContexts2 = function (test) {
- test = new TestHelper(test);
- let loader0 = test.newLoader();
- let loader1 = test.newLoader();
-
- let item1 = new loader1.cm.Item({ label: "item 1" });
-
- let item0 = new loader0.cm.Item({
- label: "item 0",
- context: loader0.cm.SelectorContext("img")
- });
-
- test.showMenu(null, function (popup) {
-
- // The menu should contain item1.
- test.checkMenu([item1], [item0], []);
- popup.hidePopup();
-
- // Unload module 0.
- loader0.unload();
- test.showMenu(null, function (popup) {
-
- // item0 should be removed from the menu.
- test.checkMenu([item1], [], [item0]);
- popup.hidePopup();
-
- // Unload module 1.
- loader1.unload();
- test.showMenu(null, function (popup) {
-
- // Both items should be removed from the menu.
- test.checkMenu([], [], [item0, item1]);
- test.done();
- });
- });
- });
-};
-
-
-// Using multiple module instances to modify the menu without causing overflow
-// should work OK. This test creates two loaders and:
-// loader0 create item -> loader1 create item -> loader1.unload ->
-// loader0.unload
-exports.testMultipleModulesDiffContexts3 = function (test) {
- test = new TestHelper(test);
- let loader0 = test.newLoader();
- let loader1 = test.newLoader();
-
- let item0 = new loader0.cm.Item({
- label: "item 0",
- context: loader0.cm.SelectorContext("img")
- });
-
- let item1 = new loader1.cm.Item({ label: "item 1" });
-
- test.showMenu(null, function (popup) {
-
- // The menu should contain item1.
- test.checkMenu([item1], [item0], []);
- popup.hidePopup();
-
- // Unload module 1.
- loader1.unload();
- test.showMenu(null, function (popup) {
-
- // item1 should be removed from the menu.
- test.checkMenu([], [item0], [item1]);
- popup.hidePopup();
-
- // Unload module 0.
- loader0.unload();
- test.showMenu(null, function (popup) {
-
- // Both items should be removed from the menu.
- test.checkMenu([], [], [item0, item1]);
- test.done();
- });
- });
- });
-};
-
-
-// Using multiple module instances to modify the menu without causing overflow
-// should work OK. This test creates two loaders and:
-// loader1 create item -> loader0 create item -> loader1.unload ->
-// loader0.unload
-exports.testMultipleModulesDiffContexts4 = function (test) {
- test = new TestHelper(test);
- let loader0 = test.newLoader();
- let loader1 = test.newLoader();
-
- let item1 = new loader1.cm.Item({ label: "item 1" });
-
- let item0 = new loader0.cm.Item({
- label: "item 0",
- context: loader0.cm.SelectorContext("img")
- });
-
- test.showMenu(null, function (popup) {
-
- // The menu should contain item1.
- test.checkMenu([item1], [item0], []);
- popup.hidePopup();
-
- // Unload module 1.
- loader1.unload();
- test.showMenu(null, function (popup) {
-
- // item1 should be removed from the menu.
- test.checkMenu([], [item0], [item1]);
- popup.hidePopup();
-
- // Unload module 0.
- loader0.unload();
- test.showMenu(null, function (popup) {
-
- // Both items should be removed from the menu.
- test.checkMenu([], [], [item0, item1]);
- test.done();
- });
- });
- });
-};
-
-
-// Test interactions between a loaded module, unloading another module, and the
-// menu separator and overflow submenu.
-exports.testMultipleModulesAddRemove = function (test) {
- test = new TestHelper(test);
- let loader0 = test.newLoader();
- let loader1 = test.newLoader();
-
- let item = new loader0.cm.Item({ label: "item" });
-
- test.showMenu(null, function (popup) {
-
- // The menu should contain the item.
- test.checkMenu([item], [], []);
- popup.hidePopup();
-
- // Remove the item.
- item.destroy();
- test.showMenu(null, function (popup) {
-
- // The item should be removed from the menu.
- test.checkMenu([], [], [item]);
- popup.hidePopup();
-
- // Unload module 1.
- loader1.unload();
- test.showMenu(null, function (popup) {
-
- // There shouldn't be any errors involving the menu separator or
- // overflow submenu.
- test.checkMenu([], [], [item]);
- test.done();
- });
- });
- });
-};
-
-
-// An item's click listener should work.
-exports.testItemClick = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "item",
- data: "item data",
- contentScript: 'self.on("click", function (node, data) {' +
- ' let Ci = Components.interfaces;' +
- ' self.postMessage({' +
- ' isElt: node instanceof Ci.nsIDOMHTMLElement,' +
- ' data: data' +
- ' });' +
- '});',
- onMessage: function (data) {
- test.assertEqual(this, item, "`this` inside onMessage should be item");
- test.assert(data.isElt, "node should be an HTML element");
- test.assertEqual(data.data, item.data, "data should be item data");
- test.done();
- }
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- let elt = test.getItemElt(popup, item);
- elt.click();
- });
-};
-
-
-// A menu's click listener should work and receive bubbling clicks from
-// sub-items appropriately. This also tests menus and ensures that when a CSS
-// selector context matches the clicked node's ancestor, the matching ancestor
-// is passed to listeners as the clicked node.
-exports.testMenuClick = function (test) {
- // Create a top-level menu, submenu, and item, like this:
- // topMenu -> submenu -> item
- // Click the item and make sure the click bubbles.
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "submenu item",
- data: "submenu item data"
- });
-
- let submenu = new loader.cm.Menu({
- label: "submenu",
- items: [item]
- });
-
- let topMenu = new loader.cm.Menu({
- label: "top menu",
- contentScript: 'self.on("click", function (node, data) {' +
- ' let Ci = Components.interfaces;' +
- ' self.postMessage({' +
- ' isAnchor: node instanceof Ci.nsIDOMHTMLAnchorElement,' +
- ' data: data' +
- ' });' +
- '});',
- onMessage: function (data) {
- test.assertEqual(this, topMenu, "`this` inside top menu should be menu");
- test.assert(data.isAnchor, "Clicked node should be anchor");
- test.assertEqual(data.data, item.data,
- "Clicked item data should be correct");
- test.done();
- },
- items: [submenu],
- context: loader.cm.SelectorContext("a")
- });
-
- test.withTestDoc(function (window, doc) {
- test.showMenu(doc.getElementById("span-link"), function (popup) {
- test.checkMenu([topMenu], [], []);
- let topMenuElt = test.getItemElt(popup, topMenu);
- let topMenuPopup = topMenuElt.firstChild;
- let submenuElt = test.getItemElt(topMenuPopup, submenu);
- let submenuPopup = submenuElt.firstChild;
- let itemElt = test.getItemElt(submenuPopup, item);
- itemElt.click();
- });
- });
-};
-
-// Click listeners should work when multiple modules are loaded.
-exports.testItemClickMultipleModules = function (test) {
- test = new TestHelper(test);
- let loader0 = test.newLoader();
- let loader1 = test.newLoader();
-
- let item0 = loader0.cm.Item({
- label: "loader 0 item",
- contentScript: 'self.on("click", self.postMessage);',
- onMessage: function () {
- test.fail("loader 0 item should not emit click event");
- }
- });
- let item1 = loader1.cm.Item({
- label: "loader 1 item",
- contentScript: 'self.on("click", self.postMessage);',
- onMessage: function () {
- test.pass("loader 1 item clicked as expected");
- test.done();
- }
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([item0, item1], [], []);
- let item1Elt = test.getItemElt(popup, item1);
- item1Elt.click();
- });
-};
-
-
-// Adding a separator to a submenu should work OK.
-exports.testSeparator = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let menu = new loader.cm.Menu({
- label: "submenu",
- items: [new loader.cm.Separator()]
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([menu], [], []);
- test.done();
- });
-};
-
-
-// Existing context menu modifications should apply to new windows.
-exports.testNewWindow = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({ label: "item" });
-
- test.withNewWindow(function () {
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- test.done();
- });
- });
-};
-
-
-// When a new window is opened, items added by an unloaded module should not
-// be present in the menu.
-exports.testNewWindowMultipleModules = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
- let item = new loader.cm.Item({ label: "item" });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- popup.hidePopup();
- loader.unload();
- test.withNewWindow(function () {
- test.showMenu(null, function (popup) {
- test.checkMenu([], [], []);
- test.done();
- });
- });
- });
-};
-
-
-// Items in the context menu should be sorted according to locale.
-exports.testSorting = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- // Make an unsorted items list. It'll look like this:
- // item 1, item 0, item 3, item 2, item 5, item 4, ...
- let items = [];
- for (let i = 0; i < OVERFLOW_THRESH_DEFAULT; i += 2) {
- items.push(new loader.cm.Item({ label: "item " + (i + 1) }));
- items.push(new loader.cm.Item({ label: "item " + i }));
- }
-
- test.showMenu(null, function (popup) {
- test.checkMenu(items, [], []);
- test.done();
- });
-};
-
-
-// Items in the overflow menu should be sorted according to locale.
-exports.testSortingOverflow = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- // Make an unsorted items list. It'll look like this:
- // item 1, item 0, item 3, item 2, item 5, item 4, ...
- let items = [];
- for (let i = 0; i < OVERFLOW_THRESH_DEFAULT * 2; i += 2) {
- items.push(new loader.cm.Item({ label: "item " + (i + 1) }));
- items.push(new loader.cm.Item({ label: "item " + i }));
- }
-
- test.showMenu(null, function (popup) {
- test.checkMenu(items, [], []);
- test.done();
- });
-};
-
-
-// Multiple modules shouldn't interfere with sorting.
-exports.testSortingMultipleModules = function (test) {
- test = new TestHelper(test);
- let loader0 = test.newLoader();
- let loader1 = test.newLoader();
-
- let items0 = [];
- let items1 = [];
- for (let i = 0; i < OVERFLOW_THRESH_DEFAULT; i++) {
- if (i % 2) {
- let item = new loader0.cm.Item({ label: "item " + i });
- items0.push(item);
- }
- else {
- let item = new loader1.cm.Item({ label: "item " + i });
- items1.push(item);
- }
- }
- let allItems = items0.concat(items1);
-
- test.showMenu(null, function (popup) {
-
- // All items should be present and sorted.
- test.checkMenu(allItems, [], []);
- popup.hidePopup();
- loader0.unload();
- loader1.unload();
- test.showMenu(null, function (popup) {
-
- // All items should be removed.
- test.checkMenu([], [], allItems);
- test.done();
- });
- });
-};
-
-
-// The binary search of insertionPoint should work OK.
-exports.testInsertionPoint = function (test) {
- function mockElts(labels) {
- return labels.map(function (label) {
- return { label: label, getAttribute: function (l) label };
- });
- }
-
- test = new TestHelper(test);
- let loader = test.newLoader();
- let insertionPoint = loader.globalScope.insertionPoint;
-
- let ip = insertionPoint("a", []);
- test.assertStrictEqual(ip, null, "Insertion point should be null");
-
- ip = insertionPoint("a", mockElts(["b"]));
- test.assertEqual(ip.label, "b", "Insertion point should be 'b'");
-
- ip = insertionPoint("c", mockElts(["b"]));
- test.assertStrictEqual(ip, null, "Insertion point should be null");
-
- ip = insertionPoint("b", mockElts(["a", "c"]));
- test.assertEqual(ip.label, "c", "Insertion point should be 'c'");
-
- ip = insertionPoint("c", mockElts(["a", "b", "d"]));
- test.assertEqual(ip.label, "d", "Insertion point should be 'd'");
-
- ip = insertionPoint("a", mockElts(["b", "c", "d"]));
- test.assertEqual(ip.label, "b", "Insertion point should be 'b'");
-
- ip = insertionPoint("d", mockElts(["a", "b", "c"]));
- test.assertStrictEqual(ip, null, "Insertion point should be null");
-
- test.done();
-};
-
-
-// Content click handlers and context handlers should be able to communicate,
-// i.e., they're eval'ed in the same worker and sandbox.
-exports.testContentCommunication = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = new loader.cm.Item({
- label: "item",
- contentScript: 'var potato;' +
- 'self.on("context", function () {' +
- ' potato = "potato";' +
- ' return true;' +
- '});' +
- 'self.on("click", function () {' +
- ' self.postMessage(potato);' +
- '});',
- });
-
- item.on("message", function (data) {
- test.assertEqual(data, "potato", "That's a lot of potatoes!");
- test.done();
- });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- let elt = test.getItemElt(popup, item);
- elt.click();
- });
-};
-
-
-// When the context menu is invoked on a tab that was already open when the
-// module was loaded, it should contain the expected items and content workers
-// should function as expected.
-exports.testLoadWithOpenTab = function (test) {
- test = new TestHelper(test);
- test.withTestDoc(function (window, doc) {
- let loader = test.newLoader();
- let item = new loader.cm.Item({
- label: "item",
- contentScript:
- 'self.on("click", function () self.postMessage("click"));',
- onMessage: function (msg) {
- if (msg === "click")
- test.done();
- }
- });
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- test.getItemElt(popup, item).click();
- });
- });
-};
-
-
-// Setting an item's label before the menu is ever shown should correctly change
-// its label and, if necessary, its order within the menu.
-exports.testSetLabelBeforeShow = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let items = [
- new loader.cm.Item({ label: "a" }),
- new loader.cm.Item({ label: "b" })
- ]
- items[0].label = "z";
- test.assertEqual(items[0].label, "z");
-
- test.showMenu(null, function (popup) {
- test.checkMenu([items[1], items[0]], [], []);
- test.done();
- });
-};
-
-
-// Setting an item's label after the menu is shown should correctly change its
-// label and, if necessary, its order within the menu.
-exports.testSetLabelAfterShow = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let items = [
- new loader.cm.Item({ label: "a" }),
- new loader.cm.Item({ label: "b" })
- ];
-
- test.showMenu(null, function (popup) {
- test.checkMenu(items, [], []);
- popup.hidePopup();
-
- items[0].label = "z";
- test.assertEqual(items[0].label, "z");
- test.showMenu(null, function (popup) {
- test.checkMenu([items[1], items[0]], [], []);
- test.done();
- });
- });
-};
-
-
-// Setting an item's label before the menu is ever shown should correctly change
-// its label and, if necessary, its order within the menu if the item is in the
-// overflow submenu.
-exports.testSetLabelBeforeShowOverflow = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let prefs = loader.loader.require("preferences-service");
- prefs.set(OVERFLOW_THRESH_PREF, 0);
-
- let items = [
- new loader.cm.Item({ label: "a" }),
- new loader.cm.Item({ label: "b" })
- ]
- items[0].label = "z";
- test.assertEqual(items[0].label, "z");
-
- test.showMenu(null, function (popup) {
- test.checkMenu([items[1], items[0]], [], []);
- prefs.set(OVERFLOW_THRESH_PREF, OVERFLOW_THRESH_DEFAULT);
- test.done();
- });
-};
-
-
-// Setting an item's label after the menu is shown should correctly change its
-// label and, if necessary, its order within the menu if the item is in the
-// overflow submenu.
-exports.testSetLabelAfterShowOverflow = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let prefs = loader.loader.require("preferences-service");
- prefs.set(OVERFLOW_THRESH_PREF, 0);
-
- let items = [
- new loader.cm.Item({ label: "a" }),
- new loader.cm.Item({ label: "b" })
- ];
-
- test.showMenu(null, function (popup) {
- test.checkMenu(items, [], []);
- popup.hidePopup();
-
- items[0].label = "z";
- test.assertEqual(items[0].label, "z");
- test.showMenu(null, function (popup) {
- test.checkMenu([items[1], items[0]], [], []);
- prefs.set(OVERFLOW_THRESH_PREF, OVERFLOW_THRESH_DEFAULT);
- test.done();
- });
- });
-};
-
-
-// Setting the label of an item in a Menu should work.
-exports.testSetLabelMenuItem = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let menu = loader.cm.Menu({
- label: "menu",
- items: [loader.cm.Item({ label: "a" })]
- });
- menu.items[0].label = "z";
-
- test.assertEqual(menu.items[0].label, "z");
-
- test.showMenu(null, function (popup) {
- test.checkMenu([menu], [], []);
- test.done();
- });
-};
-
-
-// Menu.addItem() should work.
-exports.testMenuAddItem = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let menu = loader.cm.Menu({
- label: "menu",
- items: [
- loader.cm.Item({ label: "item 0" })
- ]
- });
- menu.addItem(loader.cm.Item({ label: "item 1" }));
- menu.addItem(loader.cm.Item({ label: "item 2" }));
-
- test.assertEqual(menu.items.length, 3,
- "menu should have correct number of items");
- for (let i = 0; i < 3; i++) {
- test.assertEqual(menu.items[i].label, "item " + i,
- "item label should be correct");
- test.assertEqual(menu.items[i].parentMenu, menu,
- "item's parent menu should be correct");
- }
-
- test.showMenu(null, function (popup) {
- test.checkMenu([menu], [], []);
- test.done();
- });
-};
-
-
-// Adding the same item twice to a menu should work as expected.
-exports.testMenuAddItemTwice = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let menu = loader.cm.Menu({
- label: "menu",
- items: []
- });
- let subitem = loader.cm.Item({ label: "item 1" })
- menu.addItem(subitem);
- menu.addItem(loader.cm.Item({ label: "item 0" }));
- menu.addItem(subitem);
-
- test.assertEqual(menu.items.length, 2,
- "menu should have correct number of items");
- for (let i = 0; i < 2; i++) {
- test.assertEqual(menu.items[i].label, "item " + i,
- "item label should be correct");
- }
-
- test.showMenu(null, function (popup) {
- test.checkMenu([menu], [], []);
- test.done();
- });
-};
-
-
-// Menu.removeItem() should work.
-exports.testMenuRemoveItem = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let subitem = loader.cm.Item({ label: "item 1" });
- let menu = loader.cm.Menu({
- label: "menu",
- items: [
- loader.cm.Item({ label: "item 0" }),
- subitem,
- loader.cm.Item({ label: "item 2" })
- ]
- });
-
- // Removing twice should be harmless.
- menu.removeItem(subitem);
- menu.removeItem(subitem);
-
- test.assertEqual(subitem.parentMenu, null,
- "item's parent menu should be correct");
-
- test.assertEqual(menu.items.length, 2,
- "menu should have correct number of items");
- test.assertEqual(menu.items[0].label, "item 0",
- "item label should be correct");
- test.assertEqual(menu.items[1].label, "item 2",
- "item label should be correct");
-
- test.showMenu(null, function (popup) {
- test.checkMenu([menu], [], []);
- test.done();
- });
-};
-
-
-// Adding an item currently contained in one menu to another menu should work.
-exports.testMenuItemSwap = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let subitem = loader.cm.Item({ label: "item" });
- let menu0 = loader.cm.Menu({
- label: "menu 0",
- items: [subitem]
- });
- let menu1 = loader.cm.Menu({
- label: "menu 1",
- items: []
- });
- menu1.addItem(subitem);
-
- test.assertEqual(menu0.items.length, 0,
- "menu should have correct number of items");
-
- test.assertEqual(menu1.items.length, 1,
- "menu should have correct number of items");
- test.assertEqual(menu1.items[0].label, "item",
- "item label should be correct");
-
- test.assertEqual(subitem.parentMenu, menu1,
- "item's parent menu should be correct");
-
- test.showMenu(null, function (popup) {
- test.checkMenu([menu0, menu1], [], []);
- test.done();
- });
-};
-
-
-// Destroying an item should remove it from its parent menu.
-exports.testMenuItemDestroy = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let subitem = loader.cm.Item({ label: "item" });
- let menu = loader.cm.Menu({
- label: "menu",
- items: [subitem]
- });
- subitem.destroy();
-
- test.assertEqual(menu.items.length, 0,
- "menu should have correct number of items");
- test.assertEqual(subitem.parentMenu, null,
- "item's parent menu should be correct");
-
- test.showMenu(null, function (popup) {
- test.checkMenu([menu], [], []);
- test.done();
- });
-};
-
-
-// Setting Menu.items should work.
-exports.testMenuItemsSetter = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let menu = loader.cm.Menu({
- label: "menu",
- items: [
- loader.cm.Item({ label: "old item 0" }),
- loader.cm.Item({ label: "old item 1" })
- ]
- });
- menu.items = [
- loader.cm.Item({ label: "new item 0" }),
- loader.cm.Item({ label: "new item 1" }),
- loader.cm.Item({ label: "new item 2" })
- ];
-
- test.assertEqual(menu.items.length, 3,
- "menu should have correct number of items");
- for (let i = 0; i < 3; i++) {
- test.assertEqual(menu.items[i].label, "new item " + i,
- "item label should be correct");
- test.assertEqual(menu.items[i].parentMenu, menu,
- "item's parent menu should be correct");
- }
-
- test.showMenu(null, function (popup) {
- test.checkMenu([menu], [], []);
- test.done();
- });
-};
-
-
-// Setting Item.data should work.
-exports.testItemDataSetter = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let item = loader.cm.Item({ label: "old item 0", data: "old" });
- item.data = "new";
-
- test.assertEqual(item.data, "new", "item should have correct data");
-
- test.showMenu(null, function (popup) {
- test.checkMenu([item], [], []);
- test.done();
- });
-};
-
-
-// Open the test doc, load the module, make sure items appear when context-
-// clicking the iframe.
-exports.testAlreadyOpenIframe = function (test) {
- test = new TestHelper(test);
- test.withTestDoc(function (window, doc) {
- let loader = test.newLoader();
- let item = new loader.cm.Item({
- label: "item"
- });
- test.showMenu(doc.getElementById("iframe"), function (popup) {
- test.checkMenu([item], [], []);
- test.done();
- });
- });
-};
-
-
-// Test image support.
-exports.testItemImage = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let imageURL = require("self").data.url("moz_favicon.ico");
- let item = new loader.cm.Item({ label: "item", image: imageURL });
- let menu = new loader.cm.Menu({ label: "menu", image: imageURL, items: [] });
-
- test.showMenu(null, function (popup) {
- test.checkMenu([item, menu], [], []);
-
- let imageURL2 = require("self").data.url("dummy.ico");
- item.image = imageURL2;
- menu.image = imageURL2;
- test.checkMenu([item, menu], [], []);
-
- item.image = null;
- menu.image = null;
- test.checkMenu([item, menu], [], []);
-
- test.done();
- });
-};
-
-
-// Menu.destroy should destroy the item tree rooted at that menu.
-exports.testMenuDestroy = function (test) {
- test = new TestHelper(test);
- let loader = test.newLoader();
-
- let menu = loader.cm.Menu({
- label: "menu",
- items: [
- loader.cm.Item({ label: "item 0" }),
- loader.cm.Menu({
- label: "item 1",
- items: [
- loader.cm.Item({ label: "subitem 0" }),
- loader.cm.Item({ label: "subitem 1" }),
- loader.cm.Item({ label: "subitem 2" })
- ]
- }),
- loader.cm.Item({ label: "item 2" })
- ]
- });
- menu.destroy();
-
- let numRegistryEntries = 0;
- loader.globalScope.browserManager.browserWins.forEach(function (bwin) {
- for (let itemID in bwin.items)
- numRegistryEntries++;
- });
- test.assertEqual(numRegistryEntries, 0, "All items should be unregistered.");
-
- test.showMenu(null, function (popup) {
- test.checkMenu([], [], [menu]);
- test.done();
- });
-};
-
-
-// NO TESTS BELOW THIS LINE! ///////////////////////////////////////////////////
-
-// Run only a dummy test if context-menu doesn't support the host app.
-if (!require("xul-app").is("Firefox")) {
- for (let [prop, val] in Iterator(exports))
- if (/^test/.test(prop) && typeof(val) === "function")
- delete exports[prop];
- exports.testAppNotSupported = function (test) {
- test.pass("context-menu does not support this application.");
- };
-}
-
-
-// This makes it easier to run tests by handling things like opening the menu,
-// opening new windows, making assertions, etc. Methods on |test| can be called
-// on instances of this class. Don't forget to call done() to end the test!
-// WARNING: This looks up items in popups by comparing labels, so don't give two
-// items the same label.
-function TestHelper(test) {
- // default waitUntilDone timeout is 10s, which is too short on the win7
- // buildslave
- test.waitUntilDone(30*1000);
- this.test = test;
- this.loaders = [];
- this.browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator).
- getMostRecentWindow("navigator:browser");
-}
-
-TestHelper.prototype = {
- get contextMenuPopup() {
- return this.browserWindow.document.getElementById("contentAreaContextMenu");
- },
-
- get contextMenuSeparator() {
- return this.browserWindow.document.getElementById(SEPARATOR_ID);
- },
-
- get overflowPopup() {
- return this.browserWindow.document.getElementById(OVERFLOW_POPUP_ID);
- },
-
- get overflowSubmenu() {
- return this.browserWindow.document.getElementById(OVERFLOW_MENU_ID);
- },
-
- get tabBrowser() {
- return this.browserWindow.gBrowser;
- },
-
- // Methods on the wrapped test can be called on this object.
- __noSuchMethod__: function (methodName, args) {
- this.test[methodName].apply(this.test, args);
- },
-
- // Asserts that absentItems -- an array of items that should not match the
- // current context -- aren't present in the menu.
- checkAbsentItems: function (presentItems, absentItems) {
- for (let i = 0; i < absentItems.length; i++) {
- let item = absentItems[i];
- let elt = this.getItemElt(this.contextMenuPopup, item);
-
- // The implementation actually hides items rather than removing or not
- // adding them in the first place, but that's an implementation detail.
- this.test.assert(!elt || elt.hidden,
- "Item should not be present in top-level menu");
-
- if (this.shouldOverflow(presentItems)) {
- elt = getItemElt(this.overflowPopup, item);
- this.test.assert(!elt || elt.hidden,
- "Item should not be present in overflow submenu");
- }
- }
- },
-
- // Asserts that elt, a DOM element representing item, looks OK.
- checkItemElt: function (elt, item) {
- let itemType = this.getItemType(item);
-
- switch (itemType) {
- case "Item":
- this.test.assertEqual(elt.localName, "menuitem",
- "Item DOM element should be a xul:menuitem");
- if (typeof(item.data) === "string") {
- this.test.assertEqual(elt.getAttribute("value"), item.data,
- "Item should have correct data");
- }
- break
- case "Menu":
- this.test.assertEqual(elt.localName, "menu",
- "Menu DOM element should be a xul:menu");
- let subPopup = elt.firstChild;
- this.test.assert(subPopup, "xul:menu should have a child");
- this.test.assertEqual(subPopup.localName, "menupopup",
- "xul:menu's first child should be a menupopup");
- break;
- case "Separator":
- this.test.assertEqual(elt.localName, "menuseparator",
- "Separator DOM element should be a xul:menuseparator");
- break;
- }
-
- if (itemType === "Item" || itemType === "Menu") {
- this.test.assertEqual(elt.getAttribute("label"), item.label,
- "Item should have correct title");
- if (typeof(item.image) === "string")
- this.test.assertEqual(elt.getAttribute("image"), item.image,
- "Item should have correct image");
- else
- this.test.assert(!elt.hasAttribute("image"),
- "Item should not have image");
- }
- },
-
- // Asserts that the context menu looks OK given the arguments. presentItems
- // are items that should match the current context. absentItems are items
- // that shouldn't. removedItems are items that have been removed from the
- // menu.
- checkMenu: function (presentItems, absentItems, removedItems) {
- this.checkSeparator(presentItems);
- this.checkOverflow(presentItems);
- this.checkPresentItems(presentItems);
- this.checkAbsentItems(presentItems, absentItems);
- this.checkRemovedItems(removedItems);
- this.checkSort(presentItems);
- },
-
- // Asserts that the overflow submenu is present or absent as appropriate for
- // presentItems.
- checkOverflow: function (presentItems) {
- let submenu = this.overflowSubmenu;
- if (this.shouldOverflow(presentItems)) {
- this.test.assert(submenu && !submenu.hidden,
- "Overflow submenu should be present");
- this.test.assert(submenu.localName, "menu",
- "Overflow submenu should be a <menu>");
- let overflowPopup = this.overflowPopup;
- this.test.assert(overflowPopup,
- "Overflow submenu popup should be present");
- this.test.assert(overflowPopup.localName, "menupopup",
- "Overflow submenu popup should be a <menupopup>");
- }
- else {
- this.test.assert(!submenu || submenu.hidden,
- "Overflow submenu should be absent");
- }
- },
-
- // Asserts that the items that are present in the menu because they match the
- // current context look OK.
- checkPresentItems: function (presentItems) {
- function recurse(popup, items, isTopLevel) {
- items.forEach(function (item) {
- let elt = this.getItemElt(popup, item);
-
- if (isTopLevel) {
- if (this.shouldOverflow(items)) {
- this.test.assert(!elt || elt.hidden,
- "Item should not be present in top-level menu");
-
- let overflowPopup = this.overflowPopup;
- this.test.assert(overflowPopup,
- "Overflow submenu should be present");
-
- elt = this.getItemElt(overflowPopup, item);
- this.test.assert(elt && !elt.hidden,
- "Item should be present in overflow submenu");
- }
- else {
- this.test.assert(elt && !elt.hidden,
- "Item should be present in top-level menu");
- }
- }
- else {
- this.test.assert(elt && !elt.hidden,
- "Item should be present in menu");
- }
-
- this.checkItemElt(elt, item);
- if (this.getItemType(item) === "Menu")
- recurse.call(this, elt.firstChild, item.items, false);
- }, this);
- }
-
- recurse.call(this, this.contextMenuPopup, presentItems, true);
- },
-
- // Asserts that items that have been removed from the menu are really removed.
- checkRemovedItems: function (removedItems) {
- for (let i = 0; i < removedItems.length; i++) {
- let item = removedItems[i];
-
- let elt = this.getItemElt(this.contextMenuPopup, item);
- this.test.assert(!elt, "Item should be removed from top-level menu");
-
- let overflowPopup = this.overflowPopup;
- if (overflowPopup) {
- elt = this.getItemElt(overflowPopup, item);
- this.test.assert(!elt, "Item should be removed from overflow submenu");
- }
- }
- },
-
- // Asserts that the menu separator separating standard items from our items
- // looks OK.
- checkSeparator: function (presentItems) {
- let sep = this.contextMenuSeparator;
- if (presentItems.length) {
- this.test.assert(sep && !sep.hidden, "Menu separator should be present");
- this.test.assertEqual(sep.localName, "menuseparator",
- "Menu separator should be a <menuseparator>");
- }
- else {
- this.test.assert(!sep || sep.hidden, "Menu separator should be absent");
- }
- },
-
- // Asserts that our items are sorted.
- checkSort: function (presentItems) {
- // Get the first item in sorted order, get its elt, walk the nextSibling
- // chain, making sure each is greater than the previous.
- if (presentItems.length) {
- let sorted = presentItems.slice(0).
- sort(function (a, b) a.label.localeCompare(b.label));
- let elt = this.shouldOverflow(presentItems) ?
- this.getItemElt(this.overflowPopup, sorted[0]) :
- this.getItemElt(this.contextMenuPopup, sorted[0]);
- let numElts = 1;
- while (elt.nextSibling &&
- elt.nextSibling.className.split(/\s+/).indexOf(ITEM_CLASS) >= 0) {
- let eltLabel = elt.getAttribute("label");
- let nextLabel = elt.nextSibling.getAttribute("label");
- this.test.assert(eltLabel.localeCompare(nextLabel) < 0,
- "Item label should be < next item's label");
- elt = elt.nextSibling;
- numElts++;
- }
- this.test.assertEqual(numElts, presentItems.length,
- "The first item in sorted order should have the " +
- "first element in sorted order");
- }
- },
-
- // Attaches an event listener to node. The listener is automatically removed
- // when it's fired (so it's assumed it will fire), and callback is called
- // after a short delay. Since the module we're testing relies on the same
- // event listeners to do its work, this is to give them a little breathing
- // room before callback runs. Inside callback |this| is this object.
- delayedEventListener: function (node, event, callback, useCapture) {
- const self = this;
- node.addEventListener(event, function handler(evt) {
- node.removeEventListener(event, handler, useCapture);
- require("timer").setTimeout(function () {
- try {
- callback.call(self, evt);
- }
- catch (err) {
- self.test.exception(err);
- self.test.done();
- }
- }, 20);
- }, useCapture);
- },
-
- // Call to finish the test.
- done: function () {
- function commonDone() {
- if (this.tab) {
- this.tabBrowser.removeTab(this.tab);
- this.tabBrowser.selectedTab = this.oldSelectedTab;
- }
- while (this.loaders.length) {
- let browserManager = this.loaders[0].globalScope.browserManager;
- let topLevelItems = browserManager.topLevelItems.slice();
- let privatePropsKey = this.loaders[0].globalScope.PRIVATE_PROPS_KEY;
- let workerRegs = topLevelItems.map(function (item) {
- return item.valueOf(privatePropsKey)._workerReg;
- });
-
- this.loaders[0].unload();
-
- // Make sure the browser manager is cleaned up.
- this.test.assertEqual(browserManager.browserWins.length, 0,
- "browserManager should have no windows left");
- this.test.assertEqual(browserManager.topLevelItems.length, 0,
- "browserManager should have no items left");
- this.test.assert(!("contentWins" in browserManager),
- "browserManager should have no content windows left");
-
- // Make sure the items' worker registries are cleaned up.
- topLevelItems.forEach(function (item) {
- this.test.assert(!("_workerReg" in item.valueOf(privatePropsKey)),
- "item's worker registry should be removed");
- }, this);
- workerRegs.forEach(function (workerReg) {
- this.test.assertEqual(Object.keys(workerReg.winWorkers).length, 0,
- "worker registry should be empty");
- this.test.assertEqual(
- Object.keys(workerReg.winsWithoutWorkers).length, 0,
- "worker registry list of windows without workers should be empty");
- }, this);
- }
- this.test.done();
- }
-
- function closeBrowserWindow() {
- if (this.oldBrowserWindow) {
- this.delayedEventListener(this.browserWindow, "unload", commonDone,
- false);
- this.browserWindow.close();
- this.browserWindow = this.oldBrowserWindow;
- delete this.oldBrowserWindow;
- }
- else {
- commonDone.call(this);
- }
- };
-
- if (this.contextMenuPopup.state == "closed") {
- closeBrowserWindow.call(this);
- }
- else {
- this.delayedEventListener(this.contextMenuPopup, "popuphidden",
- function () closeBrowserWindow.call(this),
- false);
- this.contextMenuPopup.hidePopup();
- }
- },
-
- // Returns the DOM element in popup corresponding to item.
- // WARNING: The element is found by comparing labels, so don't give two items
- // the same label.
- getItemElt: function (popup, item) {
- let nodes = popup.childNodes;
- for (let i = nodes.length - 1; i >= 0; i--) {
- if (this.getItemType(item) === "Separator") {
- if (nodes[i].localName === "menuseparator")
- return nodes[i];
- }
- else if (nodes[i].getAttribute("label") === item.label)
- return nodes[i];
- }
- return null;
- },
-
- // Returns "Item", "Menu", or "Separator".
- getItemType: function (item) {
- // Could use instanceof here, but that would require accessing the loader
- // that created the item, and I don't want to A) somehow search through the
- // this.loaders list to find it, and B) assume there are any live loaders at
- // all.
- return /^\[object (Item|Menu|Separator)/.exec(item.toString())[1];
- },
-
- // Returns a wrapper around a new loader: { loader, cm, unload, globalScope }.
- // loader is a Cuddlefish sandboxed loader, cm is the context menu module,
- // globalScope is the context menu module's global scope, and unload is a
- // function that unloads the loader and associated resources.
- newLoader: function () {
- const self = this;
- let loader = Loader(module);
- let wrapper = {
- loader: loader,
- cm: loader.require("context-menu"),
- globalScope: loader.sandbox("context-menu"),
- unload: function () {
- loader.unload();
- let idx = self.loaders.indexOf(wrapper);
- if (idx < 0)
- throw new Error("Test error: tried to unload nonexistent loader");
- self.loaders.splice(idx, 1);
- }
- };
- this.loaders.push(wrapper);
- return wrapper;
- },
-
- // Returns true if the number of presentItems crosses the overflow threshold.
- shouldOverflow: function (presentItems) {
- return presentItems.length >
- (this.loaders.length ?
- this.loaders[0].loader.require("preferences-service").
- get(OVERFLOW_THRESH_PREF, OVERFLOW_THRESH_DEFAULT) :
- OVERFLOW_THRESH_DEFAULT);
- },
-
- // Opens the context menu on the current page. If targetNode is null, the
- // menu is opened in the top-left corner. onShowncallback is passed the
- // popup.
- showMenu: function(targetNode, onshownCallback) {
- function sendEvent() {
- this.delayedEventListener(this.browserWindow, "popupshowing",
- function (e) {
- let popup = e.target;
- onshownCallback.call(this, popup);
- }, false);
-
- let rect = targetNode ?
- targetNode.getBoundingClientRect() :
- { left: 0, top: 0, width: 0, height: 0 };
- let contentWin = this.browserWindow.content;
- contentWin.
- QueryInterface(Ci.nsIInterfaceRequestor).
- getInterface(Ci.nsIDOMWindowUtils).
- sendMouseEvent("contextmenu",
- rect.left + (rect.width / 2),
- rect.top + (rect.height / 2),
- 2, 1, 0);
- }
-
- // If a new tab or window has not yet been opened, open a new tab now. For
- // some reason using the tab already opened when the test starts causes
- // leaks. See bug 566351 for details.
- if (!targetNode && !this.oldSelectedTab && !this.oldBrowserWindow) {
- this.oldSelectedTab = this.tabBrowser.selectedTab;
- this.tab = this.tabBrowser.addTab("about:blank");
- let browser = this.tabBrowser.getBrowserForTab(this.tab);
-
- this.delayedEventListener(browser, "load", function () {
- this.tabBrowser.selectedTab = this.tab;
- sendEvent.call(this);
- }, true);
- }
- else
- sendEvent.call(this);
- },
-
- // Opens a new browser window. The window will be closed automatically when
- // done() is called.
- withNewWindow: function (onloadCallback) {
- let win = this.browserWindow.OpenBrowserWindow();
- this.delayedEventListener(win, "load", onloadCallback, true);
- this.oldBrowserWindow = this.browserWindow;
- this.browserWindow = win;
- },
-
- // Opens a new tab with our test page in the current window. The tab will
- // be closed automatically when done() is called.
- withTestDoc: function (onloadCallback) {
- this.oldSelectedTab = this.tabBrowser.selectedTab;
- this.tab = this.tabBrowser.addTab(TEST_DOC_URL);
- let browser = this.tabBrowser.getBrowserForTab(this.tab);
-
- this.delayedEventListener(browser, "load", function () {
- this.tabBrowser.selectedTab = this.tab;
- onloadCallback.call(this, browser.contentWindow, browser.contentDocument);
- }, true);
- }
-};
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-hotkeys.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-hotkeys.js
deleted file mode 100644
index 0e0ecd6..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-hotkeys.js
+++ /dev/null
@@ -1,160 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-const { Hotkey } = require("hotkeys");
-const { keyDown } = require("dom/events/keys");
-const { Loader } = require('./helpers');
-
-exports["test hotkey: function key"] = function(assert, done) {
- var element = require("window-utils").activeBrowserWindow.document.documentElement;
- var showHotKey = Hotkey({
- combo: "f1",
- onPress: function() {
- assert.pass("first callback is called");
- keyDown(element, "f2");
- showHotKey.destroy();
- }
- });
-
- var hideHotKey = Hotkey({
- combo: "f2",
- onPress: function() {
- assert.pass("second callback is called");
- hideHotKey.destroy();
- done();
- }
- });
-
- keyDown(element, "f1");
-};
-
-exports["test hotkey: accel alt shift"] = function(assert, done) {
- var element = require("window-utils").activeBrowserWindow.document.documentElement;
- var showHotKey = Hotkey({
- combo: "accel-shift-6",
- onPress: function() {
- assert.pass("first callback is called");
- keyDown(element, "accel-alt-shift-6");
- showHotKey.destroy();
- }
- });
-
- var hideHotKey = Hotkey({
- combo: "accel-alt-shift-6",
- onPress: function() {
- assert.pass("second callback is called");
- hideHotKey.destroy();
- done();
- }
- });
-
- keyDown(element, "accel-shift-6");
-};
-
-exports["test hotkey meta & control"] = function(assert, done) {
- var element = require("window-utils").activeBrowserWindow.document.documentElement;
- var showHotKey = Hotkey({
- combo: "meta-3",
- onPress: function() {
- assert.pass("first callback is called");
- keyDown(element, "alt-control-shift-b");
- showHotKey.destroy();
- }
- });
-
- var hideHotKey = Hotkey({
- combo: "Ctrl-Alt-Shift-B",
- onPress: function() {
- assert.pass("second callback is called");
- hideHotKey.destroy();
- done();
- }
- });
-
- keyDown(element, "meta-3");
-};
-
-exports["test hotkey: control-1 / meta--"] = function(assert, done) {
- var element = require("window-utils").activeBrowserWindow.document.documentElement;
- var showHotKey = Hotkey({
- combo: "control-1",
- onPress: function() {
- assert.pass("first callback is called");
- keyDown(element, "meta--");
- showHotKey.destroy();
- }
- });
-
- var hideHotKey = Hotkey({
- combo: "meta--",
- onPress: function() {
- assert.pass("second callback is called");
- hideHotKey.destroy();
- done();
- }
- });
-
- keyDown(element, "control-1");
-};
-
-exports["test invalid combos"] = function(assert) {
- assert.throws(function() {
- Hotkey({
- combo: "d",
- onPress: function() {}
- });
- }, "throws if no modifier is present");
- assert.throws(function() {
- Hotkey({
- combo: "alt",
- onPress: function() {}
- });
- }, "throws if no key is present");
- assert.throws(function() {
- Hotkey({
- combo: "alt p b",
- onPress: function() {}
- });
- }, "throws if more then one key is present");
-};
-
-exports["test no exception on unmodified keypress"] = function(assert) {
- var element = require("window-utils").activeBrowserWindow.document.documentElement;
- var someHotkey = Hotkey({
- combo: "control-alt-1",
- onPress: function() {
- }
- });
- keyDown(element, "a");
- assert.pass("No exception throw, unmodified keypress passed");
-};
-
-exports["test hotkey: automatic destroy"] = function(assert, done) {
- // Hacky way to be able to create unloadable modules via makeSandboxedLoader.
- let loader = Loader(module);
-
- var called = false;
- var element = loader.require("window-utils").activeBrowserWindow.document.documentElement;
- var hotkey = loader.require("hotkeys").Hotkey({
- combo: "accel-shift-x",
- onPress: function() {
- called = true;
- }
- });
-
- // Unload the module so that previous hotkey is automatically destroyed
- loader.unload();
-
- // Ensure that the hotkey is really destroyed
- keyDown(element, "accel-shift-x");
-
- require("timer").setTimeout(function () {
- assert.ok(!called, "Hotkey is destroyed and not called.");
- done();
- }, 0);
-};
-
-require("test").run(exports);
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-l10n.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-l10n.js
deleted file mode 100644
index 259b160..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-l10n.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/* 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/. */
-
-const prefs = require("preferences-service");
-const { Loader } = require('./helpers');
-
-const PREF_MATCH_OS_LOCALE = "intl.locale.matchOS";
-const PREF_SELECTED_LOCALE = "general.useragent.locale";
-
-function setLocale(locale) {
- prefs.set(PREF_MATCH_OS_LOCALE, false);
- prefs.set(PREF_SELECTED_LOCALE, locale);
-}
-
-function resetLocale() {
- prefs.reset(PREF_MATCH_OS_LOCALE);
- prefs.reset(PREF_SELECTED_LOCALE);
-}
-
-exports.testExactMatching = function(test) {
- let loader = Loader(module);
- setLocale("fr-FR");
-
- let _ = loader.require("l10n").get;
- test.assertEqual(_("Not translated"), "Not translated",
- "Key not translated");
- test.assertEqual(_("Translated"), "Oui",
- "Simple key translated");
-
- // Placeholders
- test.assertEqual(_("placeholderString", "works"), "Placeholder works",
- "Value with placeholder");
- test.assertEqual(_("Placeholder %s", "works"), "Placeholder works",
- "Key without value but with placeholder");
- test.assertEqual(_("Placeholders %2s %1s %s.", "working", "are", "correctly"),
- "Placeholders are working correctly.",
- "Multiple placeholders");
-
- // Plurals
- test.assertEqual(_("downloadsCount", 0),
- "0 téléchargement",
- "PluralForm form 'one' for 0 in french");
- test.assertEqual(_("downloadsCount", 1),
- "1 téléchargement",
- "PluralForm form 'one' for 1 in french");
- test.assertEqual(_("downloadsCount", 2),
- "2 téléchargements",
- "PluralForm form 'other' for n > 1 in french");
-
- loader.unload();
- resetLocale();
-}
-
-exports.testEnUsLocaleName = function(test) {
- let loader = Loader(module);
- setLocale("en-US");
-
- let _ = loader.require("l10n").get;
- test.assertEqual(_("Not translated"), "Not translated");
- test.assertEqual(_("Translated"), "Yes");
-
- // Check plural forms regular matching
- test.assertEqual(_("downloadsCount", 0),
- "0 downloads",
- "PluralForm form 'other' for 0 in english");
- test.assertEqual(_("downloadsCount", 1),
- "one download",
- "PluralForm form 'one' for 1 in english");
- test.assertEqual(_("downloadsCount", 2),
- "2 downloads",
- "PluralForm form 'other' for n != 1 in english");
-
- // Check optional plural forms
- test.assertEqual(_("pluralTest", 0),
- "optional zero form",
- "PluralForm form 'zero' can be optionaly specified. (Isn't mandatory in english)");
- test.assertEqual(_("pluralTest", 1),
- "fallback to other",
- "If the specific plural form is missing, we fallback to 'other'");
-
- loader.unload();
- resetLocale();
-}
-
-exports.testShortLocaleName = function(test) {
- let loader = Loader(module);
- setLocale("eo");
-
- let _ = loader.require("l10n").get;
- test.assertEqual(_("Not translated"), "Not translated");
- test.assertEqual(_("Translated"), "jes");
-
- loader.unload();
- resetLocale();
-}
-
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-module.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-module.js
deleted file mode 100644
index 957d075..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-module.js
+++ /dev/null
@@ -1,37 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-/** Disabled because of Bug 672199
-exports["test module exports are frozen"] = function(assert) {
- assert.ok(Object.isFrozen(require("addon-kit/hotkeys")),
- "module exports are frozen");
-};
-
-exports["test redefine exported property"] = function(assert) {
- let hotkeys = require("addon-kit/hotkeys");
- let { Hotkey } = hotkeys;
- try { Object.defineProperty(hotkeys, 'Hotkey', { value: {} }); } catch(e) {}
- assert.equal(hotkeys.Hotkey, Hotkey, "exports can't be redefined");
-};
-*/
-
-exports["test can't delete exported property"] = function(assert) {
- let hotkeys = require("addon-kit/hotkeys");
- let { Hotkey } = hotkeys;
-
- try { delete hotkeys.Hotkey; } catch(e) {}
- assert.equal(hotkeys.Hotkey, Hotkey, "exports can't be deleted");
-};
-
-exports["test can't override exported property"] = function(assert) {
- let hotkeys = require("addon-kit/hotkeys");
- let { Hotkey } = hotkeys;
-
- try { hotkeys.Hotkey = Object } catch(e) {}
- assert.equal(hotkeys.Hotkey, Hotkey, "exports can't be overriden");
-};
-
-require("test").run(exports);
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-notifications.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-notifications.js
deleted file mode 100644
index b0e1f37..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-notifications.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim:set ts=2 sw=2 sts=2 et filetype=javascript
- * 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/. */
-
-const { Loader } = require('./helpers');
-
-exports.testOnClick = function (test) {
- let [loader, mockAlertServ] = makeLoader(module);
- let notifs = loader.require("notifications");
- let data = "test data";
- let opts = {
- onClick: function (clickedData) {
- test.assertEqual(this, notifs, "|this| should be notifications module");
- test.assertEqual(clickedData, data,
- "data passed to onClick should be correct");
- },
- data: data,
- title: "test title",
- text: "test text",
- iconURL: "test icon URL"
- };
- notifs.notify(opts);
- mockAlertServ.click();
- loader.unload();
-};
-
-// Returns [loader, mockAlertService].
-function makeLoader(test) {
- let loader = Loader(module);
- let mockAlertServ = {
- showAlertNotification: function (imageUrl, title, text, textClickable,
- cookie, alertListener, name) {
- this._cookie = cookie;
- this._alertListener = alertListener;
- },
- click: function () {
- this._alertListener.observe(null, "alertclickcallback", this._cookie);
- }
- };
- loader.require("notifications");
- let scope = loader.sandbox("notifications");
- scope.notify = mockAlertServ.showAlertNotification.bind(mockAlertServ);
- return [loader, mockAlertServ];
-};
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-page-mod.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-page-mod.js
deleted file mode 100644
index 14a3ef9..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-page-mod.js
+++ /dev/null
@@ -1,526 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-var pageMod = require("page-mod");
-var testPageMod = require("pagemod-test-helpers").testPageMod;
-const { Loader } = require('./helpers');
-const tabs = require("tabs");
-
-/* XXX This can be used to delay closing the test Firefox instance for interactive
- * testing or visual inspection. This test is registered first so that it runs
- * the last. */
-exports.delay = function(test) {
- if (false) {
- test.waitUntilDone(60000);
- require("timer").setTimeout(function() {test.done();}, 4000);
- } else
- test.pass();
-}
-
-/* Tests for the PageMod APIs */
-
-exports.testPageMod1 = function(test) {
- let mods = testPageMod(test, "about:", [{
- include: /about:/,
- contentScriptWhen: 'end',
- contentScript: 'new ' + function WorkerScope() {
- window.document.body.setAttribute("JEP-107", "worked");
- },
- onAttach: function() {
- test.assertEqual(this, mods[0], "The 'this' object is the page mod.");
- }
- }],
- function(win, done) {
- test.assertEqual(
- win.document.body.getAttribute("JEP-107"),
- "worked",
- "PageMod.onReady test"
- );
- done();
- }
- );
-};
-
-exports.testPageMod2 = function(test) {
- testPageMod(test, "about:", [{
- include: "about:*",
- contentScript: [
- 'new ' + function contentScript() {
- window.AUQLUE = function() { return 42; }
- try {
- window.AUQLUE()
- }
- catch(e) {
- throw new Error("PageMod scripts executed in order");
- }
- document.documentElement.setAttribute("first", "true");
- },
- 'new ' + function contentScript() {
- document.documentElement.setAttribute("second", "true");
- }
- ]
- }], function(win, done) {
- test.assertEqual(win.document.documentElement.getAttribute("first"),
- "true",
- "PageMod test #2: first script has run");
- test.assertEqual(win.document.documentElement.getAttribute("second"),
- "true",
- "PageMod test #2: second script has run");
- test.assertEqual("AUQLUE" in win, false,
- "PageMod test #2: scripts get a wrapped window");
- done();
- });
-};
-
-exports.testPageModIncludes = function(test) {
- var asserts = [];
- function createPageModTest(include, expectedMatch) {
- // Create an 'onload' test function...
- asserts.push(function(test, win) {
- var matches = include in win.localStorage;
- test.assert(expectedMatch ? matches : !matches,
- "'" + include + "' match test, expected: " + expectedMatch);
- });
- // ...and corresponding PageMod options
- return {
- include: include,
- contentScript: 'new ' + function() {
- self.on("message", function(msg) {
- window.localStorage[msg] = true;
- });
- },
- // The testPageMod callback with test assertions is called on 'end',
- // and we want this page mod to be attached before it gets called,
- // so we attach it on 'start'.
- contentScriptWhen: 'start',
- onAttach: function(worker) {
- worker.postMessage(this.include[0]);
- }
- };
- }
-
- testPageMod(test, "about:buildconfig", [
- createPageModTest("*", false),
- createPageModTest("*.google.com", false),
- createPageModTest("about:*", true),
- createPageModTest("about:", false),
- createPageModTest("about:buildconfig", true)
- ],
- function (win, done) {
- test.waitUntil(function () win.localStorage["about:buildconfig"],
- "about:buildconfig page-mod to be executed")
- .then(function () {
- asserts.forEach(function(fn) {
- fn(test, win);
- });
- done();
- });
- }
- );
-};
-
-exports.testPageModErrorHandling = function(test) {
- test.assertRaises(function() {
- new pageMod.PageMod();
- },
- 'pattern is undefined',
- "PageMod() throws when 'include' option is not specified.");
-};
-
-/* Tests for internal functions. */
-exports.testCommunication1 = function(test) {
- let workerDone = false,
- callbackDone = null;
-
- testPageMod(test, "about:", [{
- include: "about:*",
- contentScriptWhen: 'end',
- contentScript: 'new ' + function WorkerScope() {
- self.on('message', function(msg) {
- document.body.setAttribute('JEP-107', 'worked');
- self.postMessage(document.body.getAttribute('JEP-107'));
- })
- },
- onAttach: function(worker) {
- worker.on('error', function(e) {
- test.fail('Errors where reported');
- });
- worker.on('message', function(value) {
- test.assertEqual(
- "worked",
- value,
- "test comunication"
- );
- workerDone = true;
- if (callbackDone)
- callbackDone();
- });
- worker.postMessage('do it!')
- }
- }],
- function(win, done) {
- (callbackDone = function() {
- if (workerDone) {
- test.assertEqual(
- 'worked',
- win.document.body.getAttribute('JEP-107'),
- 'attribute should be modified'
- );
- done();
- }
- })();
- }
- );
-};
-
-exports.testCommunication2 = function(test) {
- let callbackDone = null,
- window;
-
- testPageMod(test, "about:credits", [{
- include: "about:*",
- contentScriptWhen: 'start',
- contentScript: 'new ' + function WorkerScope() {
- document.documentElement.setAttribute('AUQLUE', 42);
- window.addEventListener('load', function listener() {
- self.postMessage('onload');
- }, false);
- self.on("message", function() {
- self.postMessage(document.documentElement.getAttribute("test"))
- });
- },
- onAttach: function(worker) {
- worker.on('error', function(e) {
- test.fail('Errors where reported');
- });
- worker.on('message', function(msg) {
- if ('onload' == msg) {
- test.assertEqual(
- '42',
- window.document.documentElement.getAttribute('AUQLUE'),
- 'PageMod scripts executed in order'
- );
- window.document.documentElement.setAttribute('test', 'changes in window');
- worker.postMessage('get window.test')
- } else {
- test.assertEqual(
- 'changes in window',
- msg,
- 'PageMod test #2: second script has run'
- )
- callbackDone();
- }
- });
- }
- }],
- function(win, done) {
- window = win;
- callbackDone = done;
- }
- );
-};
-
-exports.testEventEmitter = function(test) {
- let workerDone = false,
- callbackDone = null;
-
- testPageMod(test, "about:", [{
- include: "about:*",
- contentScript: 'new ' + function WorkerScope() {
- self.port.on('addon-to-content', function(data) {
- self.port.emit('content-to-addon', data);
- });
- },
- onAttach: function(worker) {
- worker.on('error', function(e) {
- test.fail('Errors were reported : '+e);
- });
- worker.port.on('content-to-addon', function(value) {
- test.assertEqual(
- "worked",
- value,
- "EventEmitter API works!"
- );
- if (callbackDone)
- callbackDone();
- else
- workerDone = true;
- });
- worker.port.emit('addon-to-content', 'worked');
- }
- }],
- function(win, done) {
- if (workerDone)
- done();
- else
- callbackDone = done;
- }
- );
-};
-
-// Execute two concurrent page mods on same document to ensure that their
-// JS contexts are different
-exports.testMixedContext = function(test) {
- let doneCallback = null;
- let messages = 0;
- let modObject = {
- include: "data:text/html,",
- contentScript: 'new ' + function WorkerScope() {
- // Both scripts will execute this,
- // context is shared if one script see the other one modification.
- let isContextShared = "sharedAttribute" in document;
- self.postMessage(isContextShared);
- document.sharedAttribute = true;
- },
- onAttach: function(w) {
- w.on("message", function (isContextShared) {
- if (isContextShared) {
- test.fail("Page mod contexts are mixed.");
- doneCallback();
- }
- else if (++messages == 2) {
- test.pass("Page mod contexts are different.");
- doneCallback();
- }
- });
- }
- };
- testPageMod(test, "data:text/html,", [modObject, modObject],
- function(win, done) {
- doneCallback = done;
- }
- );
-};
-
-exports.testHistory = function(test) {
- // We need a valid url in order to have a working History API.
- // (i.e do not work on data: or about: pages)
- // Test bug 679054.
- let url = require("self").data.url("test-page-mod.html");
- let callbackDone = null;
- testPageMod(test, url, [{
- include: url,
- contentScriptWhen: 'end',
- contentScript: 'new ' + function WorkerScope() {
- history.pushState({}, "", "#");
- history.replaceState({foo: "bar"}, "", "#");
- self.postMessage(history.state);
- },
- onAttach: function(worker) {
- worker.on('message', function (data) {
- test.assertEqual(JSON.stringify(data), JSON.stringify({foo: "bar"}),
- "History API works!");
- callbackDone();
- });
- }
- }],
- function(win, done) {
- callbackDone = done;
- }
- );
-};
-
-exports.testRelatedTab = function(test) {
- test.waitUntilDone();
-
- let tab;
- let { PageMod } = require("page-mod");
- let pageMod = new PageMod({
- include: "about:*",
- onAttach: function(worker) {
- test.assertEqual(tab, worker.tab, "Worker.tab is valid");
- pageMod.destroy();
- tab.close();
- test.done();
- }
- });
-
- tabs.open({
- url: "about:",
- onOpen: function onOpen(t) {
- tab = t;
- }
- });
-
-};
-
-exports['test tab worker on message'] = function(test) {
- test.waitUntilDone();
-
- let { browserWindows } = require("windows");
- let tabs = require("tabs");
- let { PageMod } = require("page-mod");
-
- let url1 = "data:text/html,<title>tab1</title><h1>worker1.tab</h1>";
- let url2 = "data:text/html,<title>tab2</title><h1>worker2.tab</h1>";
- let worker1 = null;
-
- let mod = PageMod({
- include: "data:text/html,*",
- contentScriptWhen: "ready",
- contentScript: "self.postMessage('#1');",
- onAttach: function onAttach(worker) {
- worker.on("message", function onMessage() {
- this.tab.attach({
- contentScriptWhen: "ready",
- contentScript: "self.postMessage({ url: window.location.href, title: document.title });",
- onMessage: function onMessage(data) {
- test.assertEqual(this.tab.url, data.url, "location is correct");
- test.assertEqual(this.tab.title, data.title, "title is correct");
- if (this.tab.url === url1) {
- worker1 = this;
- tabs.open({ url: url2, inBackground: true });
- }
- else if (this.tab.url === url2) {
- mod.destroy();
- worker1.tab.close();
- worker1.destroy();
- worker.tab.close();
- worker.destroy();
- test.done();
- }
- }
- });
- });
- }
- });
-
- tabs.open(url1);
-};
-
-exports.testAutomaticDestroy = function(test) {
- test.waitUntilDone();
- let loader = Loader(module);
-
- let pageMod = loader.require("page-mod").PageMod({
- include: "about:*",
- contentScriptWhen: "start",
- onAttach: function(w) {
- test.fail("Page-mod should have been detroyed during module unload");
- }
- });
-
- // Unload the page-mod module so that our page mod is destroyed
- loader.unload();
-
- // Then create a second tab to ensure that it is correctly destroyed
- let tabs = require("tabs");
- tabs.open({
- url: "about:",
- onReady: function onReady(tab) {
- test.pass("check automatic destroy");
- tab.close();
- test.done();
- }
- });
-
-}
-
-exports.testPageModCss = function(test) {
- let [pageMod] = testPageMod(test,
- 'data:text/html,<div style="background: silver">css test</div>', [{
- include: "data:*",
- contentStyle: "div { height: 100px; }",
- contentStyleFile:
- require("self").data.url("pagemod-css-include-file.css")
- }],
- function(win, done) {
- let div = win.document.querySelector("div");
- test.assertEqual(
- div.clientHeight,
- 100,
- "PageMod contentStyle worked"
- );
- test.assertEqual(
- div.offsetHeight,
- 120,
- "PageMod contentStyleFile worked"
- );
- done();
- }
- );
-};
-
-exports.testPageModCssList = function(test) {
- let [pageMod] = testPageMod(test,
- 'data:text/html,<div style="width:320px; max-width: 480px!important">css test</div>', [{
- include: "data:*",
- contentStyleFile: [
- // Highlight evaluation order in this list
- "data:text/css,div { border: 1px solid black; }",
- "data:text/css,div { border: 10px solid black; }",
- // Highlight evaluation order between contentStylesheet & contentStylesheetFile
- "data:text/css,div { height: 1000px; }",
- // Highlight precedence between the author and user style sheet
- "data:text/css,div { width: 200px; max-width: 640px!important}",
- ],
- contentStyle: [
- "div { height: 10px; }",
- "div { height: 100px; }"
- ]
- }],
- function(win, done) {
- let div = win.document.querySelector("div"),
- style = win.getComputedStyle(div);
-
- test.assertEqual(
- div.clientHeight,
- 100,
- "PageMod contentStyle list works and is evaluated after contentStyleFile"
- );
-
- test.assertEqual(
- div.offsetHeight,
- 120,
- "PageMod contentStyleFile list works"
- );
-
- test.assertEqual(
- style.width,
- "320px",
- "PageMod author/user style sheet precedence works"
- );
-
- test.assertEqual(
- style.maxWidth,
- "640px",
- "PageMod author/user style sheet precedence with !important works"
- );
-
- done();
- }
- );
-};
-
-exports.testPageModCssDestroy = function(test) {
- let [pageMod] = testPageMod(test,
- 'data:text/html,<div style="width:200px">css test</div>', [{
- include: "data:*",
- contentStyle: "div { width: 100px!important; }"
- }],
-
- function(win, done) {
- let div = win.document.querySelector("div"),
- style = win.getComputedStyle(div);
-
- test.assertEqual(
- style.width,
- "100px",
- "PageMod contentStyle worked"
- );
-
- pageMod.destroy();
- test.assertEqual(
- style.width,
- "200px",
- "PageMod contentStyle is removed after destroy"
- );
-
- done();
-
- }
- );
-};
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-page-worker.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-page-worker.js
deleted file mode 100644
index 5fc3bec..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-page-worker.js
+++ /dev/null
@@ -1,366 +0,0 @@
-/* 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/. */
-
-let tests = {}, Pages, Page;
-const { Loader } = require('./helpers');
-
-const ERR_DESTROYED =
- "The page has been destroyed and can no longer be used.";
-
-tests.testSimplePageCreation = function(test) {
- test.waitUntilDone();
-
- let page = new Page({
- contentScript: "self.postMessage(window.location.href)",
- contentScriptWhen: "end",
- onMessage: function (message) {
- test.assertEqual(message, "about:blank",
- "Page Worker should start with a blank page by default");
- test.assertEqual(this, page, "The 'this' object is the page itself.");
- test.done();
- }
- });
-}
-
-/*
- * Tests that we can't be tricked by document overloads as we have access
- * to wrapped nodes
- */
-tests.testWrappedDOM = function(test) {
- test.waitUntilDone();
-
- let page = Page({
- allow: { script: true },
- contentURL: "data:text/html,<script>document.getElementById=3;window.scrollTo=3;</script>",
- contentScript: "window.addEventListener('load', function () " +
- "self.postMessage([typeof(document.getElementById), " +
- "typeof(window.scrollTo)]), true)",
- onMessage: function (message) {
- test.assertEqual(message[0],
- "function",
- "getElementById from content script is the native one");
-
- test.assertEqual(message[1],
- "function",
- "scrollTo from content script is the native one");
-
- test.done();
- }
- });
-}
-
-/*
-// We do not offer unwrapped access to DOM since bug 601295 landed
-// See 660780 to track progress of unwrap feature
-tests.testUnwrappedDOM = function(test) {
- test.waitUntilDone();
-
- let page = Page({
- allow: { script: true },
- contentURL: "data:text/html,<script>document.getElementById=3;window.scrollTo=3;</script>",
- contentScript: "window.addEventListener('load', function () " +
- "self.postMessage([typeof(unsafeWindow.document.getElementById), " +
- "typeof(unsafeWindow.scrollTo)]), true)",
- onMessage: function (message) {
- test.assertEqual(message[0],
- "number",
- "document inside page is free to be changed");
-
- test.assertEqual(message[1],
- "number",
- "window inside page is free to be changed");
-
- test.done();
- }
- });
-}
-*/
-
-tests.testPageProperties = function(test) {
- let page = new Page();
-
- for each (let prop in ['contentURL', 'allow', 'contentScriptFile',
- 'contentScript', 'contentScriptWhen', 'on',
- 'postMessage', 'removeListener']) {
- test.assert(prop in page, prop + " property is defined on page.");
- }
-
- test.assert(function () page.postMessage("foo") || true,
- "postMessage doesn't throw exception on page.");
-}
-
-tests.testConstructorAndDestructor = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let Pages = loader.require("page-worker");
- let global = loader.sandbox("page-worker");
-
- let pagesReady = 0;
-
- let page1 = Pages.Page({
- contentScript: "self.postMessage('')",
- contentScriptWhen: "end",
- onMessage: pageReady
- });
- let page2 = Pages.Page({
- contentScript: "self.postMessage('')",
- contentScriptWhen: "end",
- onMessage: pageReady
- });
-
- test.assertNotEqual(page1, page2,
- "Page 1 and page 2 should be different objects.");
-
- function pageReady() {
- if (++pagesReady == 2) {
- page1.destroy();
- page2.destroy();
-
- test.assert(isDestroyed(page1), "page1 correctly unloaded.");
- test.assert(isDestroyed(page2), "page2 correctly unloaded.");
-
- loader.unload();
- test.done();
- }
- }
-}
-
-tests.testAutoDestructor = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let Pages = loader.require("page-worker");
-
- let page = Pages.Page({
- contentScript: "self.postMessage('')",
- contentScriptWhen: "end",
- onMessage: function() {
- loader.unload();
- test.assert(isDestroyed(page), "Page correctly unloaded.");
- test.done();
- }
- });
-}
-
-tests.testValidateOptions = function(test) {
- test.assertRaises(
- function () Page({ contentURL: 'home' }),
- "The `contentURL` option must be a valid URL.",
- "Validation correctly denied a non-URL contentURL"
- );
-
- test.assertRaises(
- function () Page({ onMessage: "This is not a function."}),
- "The event listener must be a function.",
- "Validation correctly denied a non-function onMessage."
- );
-
- test.pass("Options validation is working.");
-}
-
-tests.testContentAndAllowGettersAndSetters = function(test) {
- test.waitUntilDone();
- let content = "data:text/html,<script>window.localStorage.allowScript=3;</script>";
- let page = Page({
- contentURL: content,
- contentScript: "self.postMessage(window.localStorage.allowScript)",
- contentScriptWhen: "end",
- onMessage: step0
- });
-
- function step0(message) {
- test.assertEqual(message, "3",
- "Correct value expected for allowScript - 3");
- test.assertEqual(page.contentURL, content,
- "Correct content expected");
- page.removeListener('message', step0);
- page.on('message', step1);
- page.allow = { script: false };
- page.contentURL = content =
- "data:text/html,<script>window.localStorage.allowScript='f'</script>";
- }
-
- function step1(message) {
- test.assertEqual(message, "3",
- "Correct value expected for allowScript - 3");
- test.assertEqual(page.contentURL, content, "Correct content expected");
- page.removeListener('message', step1);
- page.on('message', step2);
- page.allow = { script: true };
- page.contentURL = content =
- "data:text/html,<script>window.localStorage.allowScript='g'</script>";
- }
-
- function step2(message) {
- test.assertEqual(message, "g",
- "Correct value expected for allowScript - g");
- test.assertEqual(page.contentURL, content, "Correct content expected");
- page.removeListener('message', step2);
- page.on('message', step3);
- page.allow.script = false;
- page.contentURL = content =
- "data:text/html,<script>window.localStorage.allowScript=3</script>";
- }
-
- function step3(message) {
- test.assertEqual(message, "g",
- "Correct value expected for allowScript - g");
- test.assertEqual(page.contentURL, content, "Correct content expected");
- page.removeListener('message', step3);
- page.on('message', step4);
- page.allow.script = true;
- page.contentURL = content =
- "data:text/html,<script>window.localStorage.allowScript=4</script>";
- }
-
- function step4(message) {
- test.assertEqual(message, "4",
- "Correct value expected for allowScript - 4");
- test.assertEqual(page.contentURL, content, "Correct content expected");
- test.done();
- }
-
-}
-
-tests.testOnMessageCallback = function(test) {
- test.waitUntilDone();
-
- Page({
- contentScript: "self.postMessage('')",
- contentScriptWhen: "end",
- onMessage: function() {
- test.pass("onMessage callback called");
- test.done();
- }
- });
-}
-
-tests.testMultipleOnMessageCallbacks = function(test) {
- test.waitUntilDone();
-
- let count = 0;
- let page = Page({
- contentScript: "self.postMessage('')",
- contentScriptWhen: "end",
- onMessage: function() count += 1
- });
- page.on('message', function() count += 2);
- page.on('message', function() count *= 3);
- page.on('message', function()
- test.assertEqual(count, 9, "All callbacks were called, in order."));
- page.on('message', function() test.done());
-
-}
-
-tests.testLoadContentPage = function(test) {
-
- test.waitUntilDone();
-
- let page = Page({
- onMessage: function(message) {
- // The message is an array whose first item is the test method to call
- // and the rest of whose items are arguments to pass it.
- test[message.shift()].apply(test, message);
- },
- contentURL: require("self").data.url("test-page-worker.html"),
- contentScriptFile: require("self").data.url("test-page-worker.js"),
- contentScriptWhen: "ready"
- });
-
-}
-
-tests.testAllowScriptDefault = function(test) {
-
- test.waitUntilDone();
-
- let page = Page({
- onMessage: function(message) {
- test.assert(message, "Script is allowed to run by default.");
- test.done();
- },
- contentURL: "data:text/html,<script>document.documentElement.setAttribute('foo', 3);</script>",
- contentScript: "self.postMessage(document.documentElement.getAttribute('foo'))",
- contentScriptWhen: "ready"
- });
-}
-
-tests.testAllowScript = function(test) {
-
- test.waitUntilDone();
-
- let page = Page({
- onMessage: function(message) {
- test.assert(message, "Script runs when allowed to do so.");
- test.done();
- },
- allow: { script: true },
- contentURL: "data:text/html,<script>document.documentElement.setAttribute('foo', 3);</script>",
- contentScript: "self.postMessage(document.documentElement.hasAttribute('foo') && " +
- " document.documentElement.getAttribute('foo') == 3)",
- contentScriptWhen: "ready"
- });
-}
-
-tests.testPingPong = function(test) {
- test.waitUntilDone();
- let page = Page({
- contentURL: 'data:text/html,ping-pong',
- contentScript: 'self.on("message", function(message) self.postMessage("pong"));'
- + 'self.postMessage("ready");',
- onMessage: function(message) {
- if ('ready' == message) {
- page.postMessage('ping');
- }
- else {
- test.assert(message, 'pong', 'Callback from contentScript');
- test.done();
- }
- }
- });
-};
-
-tests.testMultipleDestroys = function(test) {
- let page = Page();
- page.destroy();
- page.destroy();
- test.pass("Multiple destroys should not cause an error");
-};
-
-
-function isDestroyed(page) {
- try {
- page.postMessage("foo");
- }
- catch (err if err.message == ERR_DESTROYED) {
- return true;
- }
- return false;
-}
-
-
-let pageWorkerSupported = true;
-
-try {
- Pages = require("page-worker");
- Page = Pages.Page;
-}
-catch (ex if ex.message == [
- "The page-worker module currently supports only Firefox and Thunderbird. ",
- "In the future, we would like it to support other applications, however. ",
- "Please see https://bugzilla.mozilla.org/show_bug.cgi?id=546740 for more ",
- "information."
- ].join("")) {
- pageWorkerSupported = false;
-}
-
-if (pageWorkerSupported) {
- for (let test in tests) {
- exports[test] = tests[test];
- }
-} else {
- exports.testPageWorkerNotSupported = function(test) {
- test.pass("The page-worker module is not supported on this app.");
- }
-}
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-panel.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-panel.js
deleted file mode 100644
index e05400e..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-panel.js
+++ /dev/null
@@ -1,466 +0,0 @@
-/* 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/. */
-
-let { Cc, Ci } = require("chrome");
-let panels = require('panel');
-let tests = {}, panels, Panel;
-const { Loader } = require('./helpers');
-
-tests.testPanel = function(test) {
- test.waitUntilDone();
- let panel = Panel({
- contentURL: "about:buildconfig",
- contentScript: "self.postMessage(1); self.on('message', function() self.postMessage(2));",
- onMessage: function (message) {
- test.assertEqual(this, panel, "The 'this' object is the panel.");
- switch(message) {
- case 1:
- test.pass("The panel was loaded.");
- panel.postMessage('');
- break;
- case 2:
- test.pass("The panel posted a message and received a response.");
- panel.destroy();
- test.done();
- break;
- }
- }
- });
-};
-
-tests.testPanelEmit = function(test) {
- test.waitUntilDone();
- let panel = Panel({
- contentURL: "about:buildconfig",
- contentScript: "self.port.emit('loaded');" +
- "self.port.on('addon-to-content', " +
- " function() self.port.emit('received'));",
- });
- panel.port.on("loaded", function () {
- test.pass("The panel was loaded and sent a first event.");
- panel.port.emit("addon-to-content");
- });
- panel.port.on("received", function () {
- test.pass("The panel posted a message and received a response.");
- panel.destroy();
- test.done();
- });
-};
-
-tests.testPanelEmitEarly = function(test) {
- test.waitUntilDone();
- let panel = Panel({
- contentURL: "about:buildconfig",
- contentScript: "self.port.on('addon-to-content', " +
- " function() self.port.emit('received'));",
- });
- panel.port.on("received", function () {
- test.pass("The panel posted a message early and received a response.");
- panel.destroy();
- test.done();
- });
- panel.port.emit("addon-to-content");
-};
-
-tests.testShowHidePanel = function(test) {
- test.waitUntilDone();
- let panel = Panel({
- contentScript: "self.postMessage('')",
- contentScriptWhen: "end",
- onMessage: function (message) {
- panel.show();
- },
- onShow: function () {
- test.pass("The panel was shown.");
- test.assertEqual(this, panel, "The 'this' object is the panel.");
- test.assertEqual(this.isShowing, true, "panel.isShowing == true.");
- panel.hide();
- },
- onHide: function () {
- test.pass("The panel was hidden.");
- test.assertEqual(this, panel, "The 'this' object is the panel.");
- test.assertEqual(this.isShowing, false, "panel.isShowing == false.");
- panel.destroy();
- test.done();
- }
- });
-};
-
-tests.testDocumentReload = function(test) {
- test.waitUntilDone();
- let content =
- "<script>" +
- "setTimeout(function () {" +
- " window.location = 'about:blank';" +
- "}, 250);" +
- "</script>";
- let messageCount = 0;
- let panel = Panel({
- contentURL: "data:text/html," + encodeURIComponent(content),
- contentScript: "self.postMessage(window.location.href)",
- onMessage: function (message) {
- messageCount++;
- if (messageCount == 1) {
- test.assertMatches(message, /data:text\/html,/, "First document had a content script");
- }
- else if (messageCount == 2) {
- test.assertEqual(message, "about:blank", "Second document too");
- panel.destroy();
- test.done();
- }
- }
- });
-};
-
-tests.testParentResizeHack = function(test) {
- let browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator).
- getMostRecentWindow("navigator:browser");
- let docShell = browserWindow.QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIWebNavigation)
- .QueryInterface(Ci.nsIDocShell);
- if (!("allowWindowControl" in docShell)) {
- // bug 635673 is not fixed in this firefox build
- test.pass("allowWindowControl attribute that allow to fix browser window " +
- "resize is not available on this build.");
- return;
- }
-
- test.waitUntilDone(30000);
-
- let previousWidth = browserWindow.outerWidth, previousHeight = browserWindow.outerHeight;
-
- let content = "<script>" +
- "function contentResize() {" +
- " resizeTo(200,200);" +
- " resizeBy(200,200);" +
- "}" +
- "</script>" +
- "Try to resize browser window";
- let panel = Panel({
- contentURL: "data:text/html," + encodeURIComponent(content),
- contentScript: "self.on('message', function(message){" +
- " if (message=='resize') " +
- " unsafeWindow.contentResize();" +
- "});",
- contentScriptWhen: "ready",
- onMessage: function (message) {
-
- },
- onShow: function () {
- panel.postMessage('resize');
- require("timer").setTimeout(function () {
- test.assertEqual(previousWidth,browserWindow.outerWidth,"Size doesn't change by calling resizeTo/By/...");
- test.assertEqual(previousHeight,browserWindow.outerHeight,"Size doesn't change by calling resizeTo/By/...");
- panel.destroy();
- test.done();
- },0);
- }
- });
- panel.show();
-}
-
-tests.testResizePanel = function(test) {
- test.waitUntilDone();
-
- // These tests fail on Linux if the browser window in which the panel
- // is displayed is not active. And depending on what other tests have run
- // before this one, it might not be (the untitled window in which the test
- // runner executes is often active). So we make sure the browser window
- // is focused by focusing it before running the tests. Then, to be the best
- // possible test citizen, we refocus whatever window was focused before we
- // started running these tests.
-
- let activeWindow = Cc["@mozilla.org/embedcomp/window-watcher;1"].
- getService(Ci.nsIWindowWatcher).
- activeWindow;
- let browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator).
- getMostRecentWindow("navigator:browser");
-
-
- function onFocus() {
- browserWindow.removeEventListener("focus", onFocus, true);
-
- let panel = Panel({
- contentScript: "self.postMessage('')",
- contentScriptWhen: "end",
- height: 10,
- width: 10,
- onMessage: function (message) {
- panel.show();
- },
- onShow: function () {
- panel.resize(100,100);
- panel.hide();
- },
- onHide: function () {
- test.assert((panel.width == 100) && (panel.height == 100),
- "The panel was resized.");
- if (activeWindow)
- activeWindow.focus();
- test.done();
- }
- });
- }
-
- if (browserWindow === activeWindow) {
- onFocus();
- }
- else {
- browserWindow.addEventListener("focus", onFocus, true);
- browserWindow.focus();
- }
-};
-
-tests.testHideBeforeShow = function(test) {
- test.waitUntilDone();
- let showCalled = false;
- let panel = Panel({
- onShow: function () {
- showCalled = true;
- },
- onHide: function () {
- test.assert(!showCalled, 'must not emit show if was hidden before');
- test.done();
- }
- });
- panel.show();
- panel.hide();
-};
-
-tests.testSeveralShowHides = function(test) {
- test.waitUntilDone();
- let hideCalled = 0;
- let panel = panels.Panel({
- contentURL: "about:buildconfig",
- onShow: function () {
- panel.hide();
- },
- onHide: function () {
- hideCalled++;
- if (hideCalled < 3)
- panel.show();
- else {
- test.pass("onHide called three times as expected");
- test.done();
- }
- }
- });
- panel.on('error', function(e) {
- test.fail('error was emitted:' + e.message + '\n' + e.stack);
- });
- panel.show();
-};
-
-tests.testAnchorAndArrow = function(test) {
- test.waitUntilDone(20000);
- let count = 0;
- function newPanel(tab, anchor) {
- let panel = panels.Panel({
- contentURL: "data:text/html,<html><body style='padding: 0; margin: 0; " +
- "background: gray; text-align: center;'>Anchor: " +
- anchor.id + "</body></html>",
- width: 200,
- height: 100,
- onShow: function () {
- count++;
- panel.destroy();
- if (count==5) {
- test.pass("All anchored panel test displayed");
- tab.close(function () {
- test.done();
- });
- }
- }
- });
- panel.show(anchor);
- }
-
- let tabs= require("tabs");
- let url = 'data:text/html,' +
- '<html><head><title>foo</title></head><body>' +
- '<style>div {background: gray; position: absolute; width: 300px; ' +
- 'border: 2px solid black;}</style>' +
- '<div id="tl" style="top: 0px; left: 0px;">Top Left</div>' +
- '<div id="tr" style="top: 0px; right: 0px;">Top Right</div>' +
- '<div id="bl" style="bottom: 0px; left: 0px;">Bottom Left</div>' +
- '<div id="br" style="bottom: 0px; right: 0px;">Bottom right</div>' +
- '</body></html>';
-
- tabs.open({
- url: url,
- onReady: function(tab) {
- let browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator).
- getMostRecentWindow("navigator:browser");
- let window = browserWindow.content;
- newPanel(tab, window.document.getElementById('tl'));
- newPanel(tab, window.document.getElementById('tr'));
- newPanel(tab, window.document.getElementById('bl'));
- newPanel(tab, window.document.getElementById('br'));
- let anchor = browserWindow.document.getElementById("identity-box");
- newPanel(tab, anchor);
- }
- });
-
-
-
-};
-
-tests.testPanelTextColor = function(test) {
- test.waitUntilDone();
- let html = "<html><head><style>body {color: yellow}</style></head>" +
- "<body><p>Foo</p></body></html>";
- let panel = Panel({
- contentURL: "data:text/html," + encodeURI(html),
- contentScript: "self.port.emit('color', " +
- "window.getComputedStyle(document.body.firstChild, null). " +
- " getPropertyValue('color'));"
- });
- panel.port.on("color", function (color) {
- test.assertEqual(color, "rgb(255, 255, 0)",
- "The panel text color style is preserved when a style exists.");
- panel.destroy();
- test.done();
- });
-};
-
-// Bug 696552: Ensure panel.contentURL modification support
-tests.testChangeContentURL = function(test) {
- test.waitUntilDone();
-
- let panel = Panel({
- contentURL: "about:blank",
- contentScript: "self.port.emit('ready', document.location.href);"
- });
- let count = 0;
- panel.port.on("ready", function (location) {
- count++;
- if (count == 1) {
- test.assertEqual(location, "about:blank");
- test.assertEqual(panel.contentURL, "about:blank");
- panel.contentURL = "about:buildconfig";
- }
- else {
- test.assertEqual(location, "about:buildconfig");
- test.assertEqual(panel.contentURL, "about:buildconfig");
- panel.destroy();
- test.done();
- }
- });
-};
-
-function makeEventOrderTest(options) {
- let expectedEvents = [];
-
- return function(test) {
- let panel = panels.Panel({ contentURL: "about:buildconfig" });
-
- function expect(event, cb) {
- expectedEvents.push(event);
- panel.on(event, function() {
- test.assertEqual(event, expectedEvents.shift());
- if (cb)
- require("timer").setTimeout(cb, 1);
- });
- return {then: expect};
- }
-
- test.waitUntilDone();
- options.test(test, expect, panel);
- }
-}
-
-tests.testAutomaticDestroy = function(test) {
- let loader = Loader(module);
- let panel = loader.require("panel").Panel({
- contentURL: "about:buildconfig",
- contentScript:
- "self.port.on('event', function() self.port.emit('event-back'));"
- });
-
- loader.unload();
-
- panel.port.on("event-back", function () {
- test.fail("Panel should have been destroyed on module unload");
- });
- panel.port.emit("event");
- test.pass("check automatic destroy");
-};
-
-tests.testWaitForInitThenShowThenDestroy = makeEventOrderTest({
- test: function(test, expect, panel) {
- expect('inited', function() { panel.show(); }).
- then('show', function() { panel.destroy(); }).
- then('hide', function() { test.done(); });
- }
-});
-
-tests.testShowThenWaitForInitThenDestroy = makeEventOrderTest({
- test: function(test, expect, panel) {
- panel.show();
- expect('inited').
- then('show', function() { panel.destroy(); }).
- then('hide', function() { test.done(); });
- }
-});
-
-tests.testShowThenHideThenDestroy = makeEventOrderTest({
- test: function(test, expect, panel) {
- panel.show();
- expect('show', function() { panel.hide(); }).
- then('hide', function() { panel.destroy(); test.done(); });
- }
-});
-
-tests.testContentURLOption = function(test) {
- const URL_STRING = "about:buildconfig";
- const HTML_CONTENT = "<html><title>Test</title><p>This is a test.</p></html>";
-
- let (panel = Panel({ contentURL: URL_STRING })) {
- test.pass("contentURL accepts a string URL.");
- test.assertEqual(panel.contentURL, URL_STRING,
- "contentURL is the string to which it was set.");
- }
-
- let dataURL = "data:text/html," + encodeURIComponent(HTML_CONTENT);
- let (panel = Panel({ contentURL: dataURL })) {
- test.pass("contentURL accepts a data: URL.");
- }
-
- let (panel = Panel({})) {
- test.assert(panel.contentURL == null,
- "contentURL is undefined.");
- }
-
- test.assertRaises(function () Panel({ contentURL: "foo" }),
- "The `contentURL` option must be a valid URL.",
- "Panel throws an exception if contentURL is not a URL.");
-};
-
-let panelSupported = true;
-
-try {
- panels = require("panel");
- Panel = panels.Panel;
-}
-catch(ex if ex.message == [
- "The panel module currently supports only Firefox. In the future ",
- "we would like it to support other applications, however. Please see ",
- "https://bugzilla.mozilla.org/show_bug.cgi?id=jetpack-panel-apps ",
- "for more information."
- ].join("")) {
- panelSupported = false;
-}
-
-if (panelSupported) {
- for (let test in tests)
- exports[test] = tests[test];
-}
-else {
- exports.testPanelNotSupported = function(test) {
- test.pass("The panel module is not supported on this app.");
- }
-}
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-passwords.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-passwords.js
deleted file mode 100644
index bfb137a..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-passwords.js
+++ /dev/null
@@ -1,281 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-const { store, search, remove } = require("passwords");
-
-exports["test store requires `password` field"] = function(assert, done) {
- store({
- username: "foo",
- realm: "bar",
- onComplete: function onComplete() {
- assert.fail("onComplete should not be called");
- },
- onError: function onError() {
- assert.pass("'`password` is required");
- done();
- }
- });
-};
-
-exports["test store requires `username` field"] = function(assert, done) {
- store({
- password: "foo",
- realm: "bar",
- onComplete: function onComplete() {
- assert.fail("onComplete should not be called");
- },
- onError: function onError() {
- assert.pass("'`username` is required");
- done();
- }
- });
-};
-
-exports["test onComplete is optional"] = function(assert, done) {
- store({
- realm: "bla",
- username: "bla",
- password: "bla",
- onError: function onError() {
- assert.fail("onError was called");
- }
- });
- assert.pass("exception is not thrown if `onComplete is missing")
- done();
-};
-
-exports["test exceptions in onComplete are reported"] = function(assert, done) {
- store({
- realm: "throws",
- username: "error",
- password: "boom!",
- onComplete: function onComplete(error) {
- throw new Error("Boom!")
- },
- onError: function onError(error) {
- assert.equal(error.message, "Boom!", "Error thrown is reported");
- done();
- }
- });
-};
-
-exports["test store requires `realm` field"] = function(assert, done) {
- store({
- username: "foo",
- password: "bar",
- onComplete: function onComplete() {
- assert.fail("onComplete should not be called");
- },
- onError: function onError() {
- assert.pass("'`realm` is required");
- done();
- }
- });
-};
-
-exports["test can't store same login twice"] = function(assert, done) {
- store({
- username: "user",
- password: "pass",
- realm: "realm",
- onComplete: function onComplete() {
- assert.pass("credential saved");
-
- store({
- username: "user",
- password: "pass",
- realm: "realm",
- onComplete: function onComplete() {
- assert.fail("onComplete should not be called");
- },
- onError: function onError() {
- assert.pass("re-saving credential failed");
-
- remove({
- username: "user",
- password: "pass",
- realm: "realm",
- onComplete: function onComplete() {
- assert.pass("credential was removed");
- done();
- },
- onError: function onError() {
- assert.fail("remove should not fail");
- }
- });
- }
- });
- },
- onError: function onError() {
- assert.fail("onError should not be called");
- }
- });
-};
-
-exports["test remove fails if no login found"] = function(assert, done) {
- remove({
- username: "foo",
- password: "bar",
- realm: "baz",
- onComplete: function onComplete() {
- assert.fail("should not be able to remove unstored credentials");
- },
- onError: function onError() {
- assert.pass("can't remove unstored credentials");
- done();
- }
- });
-};
-
-exports["test addon associated credentials"] = function(assert, done) {
- store({
- username: "foo",
- password: "bar",
- realm: "baz",
- onComplete: function onComplete() {
- search({
- username: "foo",
- password: "bar",
- realm: "baz",
- onComplete: function onComplete([credential]) {
- assert.equal(credential.url.indexOf("addon:"), 0,
- "`addon:` uri is used for add-on credentials");
- assert.equal(credential.username, "foo",
- "username matches");
- assert.equal(credential.password, "bar",
- "password matches");
- assert.equal(credential.realm, "baz", "realm matches");
- assert.equal(credential.formSubmitURL, null,
- "`formSubmitURL` is `null` for add-on credentials");
- assert.equal(credential.usernameField, "", "usernameField is empty");
- assert.equal(credential.passwordField, "", "passwordField is empty");
-
- remove({
- username: credential.username,
- password: credential.password,
- realm: credential.realm,
- onComplete: function onComplete() {
- assert.pass("credential is removed");
- done();
- },
- onError: function onError() {
- assert.fail("onError should not be called");
- }
- });
- },
- onError: function onError() {
- assert.fail("onError should not be called");
- }
- });
- },
- onError: function onError() {
- assert.fail("onError should not be called");
- }
- });
-};
-
-exports["test web page associated credentials"] = function(assert, done) {
- store({
- url: "http://bar.foo.com/authentication/?login",
- formSubmitURL: "http://login.foo.com/authenticate.cgi",
- username: "user",
- password: "pass",
- usernameField: "user-f",
- passwordField: "pass-f",
- onComplete: function onComplete() {
- search({
- username: "user",
- password: "pass",
- url: "http://bar.foo.com",
- formSubmitURL: "http://login.foo.com",
- onComplete: function onComplete([credential]) {
- assert.equal(credential.url, "http://bar.foo.com", "url matches");
- assert.equal(credential.username, "user", "username matches");
- assert.equal(credential.password, "pass", "password matches");
- assert.equal(credential.realm, null, "realm is null");
- assert.equal(credential.formSubmitURL, "http://login.foo.com",
- "formSubmitURL matches");
- assert.equal(credential.usernameField, "user-f",
- "usernameField is matches");
- assert.equal(credential.passwordField, "pass-f",
- "passwordField matches");
-
- remove({
- url: credential.url,
- formSubmitURL: credential.formSubmitURL,
- username: credential.username,
- password: credential.password,
- usernameField: credential.usernameField,
- passwordField: credential.passwordField,
-
- onComplete: function onComplete() {
- assert.pass("credential is removed");
- done();
- },
- onError: function onError(e) {
- assert.fail("onError should not be called");
- }
- });
- },
- onError: function onError() {
- assert.fail("onError should not be called");
- }
- });
- },
- onError: function onError() {
- assert.fail("onError should not be called");
- }
- });
-};
-
-exports["test site authentication credentials"] = function(assert, done) {
- store({
- url: "http://authentication.com",
- username: "U",
- password: "P",
- realm: "R",
- onComplete: function onComplete() {
- search({
- url: "http://authentication.com",
- username: "U",
- password: "P",
- realm: "R",
- onComplete: function onComplete([credential]) {
- assert.equal(credential.url,"http://authentication.com",
- "url matches");
- assert.equal(credential.username, "U", "username matches");
- assert.equal(credential.password, "P", "password matches");
- assert.equal(credential.realm, "R", "realm matches");
- assert.equal(credential.formSubmitURL, null, "formSubmitURL is null");
- assert.equal(credential.usernameField, "", "usernameField is empty");
- assert.equal(credential.passwordField, "", "passwordField is empty");
-
- remove({
- url: credential.url,
- username: credential.username,
- password: credential.password,
- realm: credential.realm,
- onComplete: function onComplete() {
- assert.pass("credential is removed");
- done();
- },
- onError: function onError() {
- assert.fail("onError should not be called");
- }
- });
- },
- onError: function onError() {
- assert.fail("onError should not be called");
- }
- });
- },
- onError: function onError() {
- assert.fail("onError should not be called");
- }
- });
-};
-
-require("test").run(exports);
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-private-browsing.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-private-browsing.js
deleted file mode 100644
index 1d60f6b..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-private-browsing.js
+++ /dev/null
@@ -1,204 +0,0 @@
-/* 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/. */
-
-let pb = require("private-browsing");
-let {Cc,Ci} = require("chrome");
-const { Loader } = require('./helpers');
-
-let pbService;
-// Currently, only Firefox implements the private browsing service.
-if (require("xul-app").is("Firefox")) {
- pbService = Cc["@mozilla.org/privatebrowsing;1"].
- getService(Ci.nsIPrivateBrowsingService);
-}
-
-if (pbService) {
-
- // tests that isActive has the same value as the private browsing service
- // expects
- exports.testGetIsActive = function (test) {
- test.assertEqual(pb.isActive, false,
- "private-browsing.isActive is correct without modifying PB service");
-
- pbService.privateBrowsingEnabled = true;
- test.assert(pb.isActive,
- "private-browsing.isActive is correct after modifying PB service");
-
- // Switch back to normal mode.
- pbService.privateBrowsingEnabled = false;
- };
-
- // tests that activating does put the browser into private browsing mode
- exports.testActivateDeactivate = function (test) {
- test.waitUntilDone();
- pb.once("start", function onStart() {
- test.assertEqual(pbService.privateBrowsingEnabled, true,
- "private browsing mode was activated");
- pb.deactivate();
- });
- pb.once("stop", function onStop() {
- test.assertEqual(pbService.privateBrowsingEnabled, false,
- "private browsing mode was deactivate");
- test.done();
- });
- pb.activate();
- };
-
- exports.testStart = function(test) {
- test.waitUntilDone();
- pb.on("start", function onStart() {
- test.assertEqual(this, pb, "`this` should be private-browsing module");
- test.assert(pbService.privateBrowsingEnabled,
- 'private mode is active when "start" event is emitted');
- test.assert(pb.isActive,
- '`isActive` is `true` when "start" event is emitted');
- pb.removeListener("start", onStart);
- test.done();
- });
- pb.activate();
- };
-
- exports.testStop = function(test) {
- test.waitUntilDone();
- pb.on("stop", function onStop() {
- test.assertEqual(this, pb, "`this` should be private-browsing module");
- test.assertEqual(pbService.privateBrowsingEnabled, false,
- "private mode is disabled when stop event is emitted");
- test.assertEqual(pb.isActive, false,
- "`isActive` is `false` when stop event is emitted");
- pb.removeListener("stop", onStop);
- test.done();
- });
- pb.activate();
- pb.deactivate();
- };
-
- exports.testAutomaticUnload = function(test) {
- test.waitUntilDone();
- // Create another private browsing instance and unload it
- let loader = Loader(module);
- let pb2 = loader.require("private-browsing");
- let called = false;
- pb2.on("start", function onStart() {
- called = true;
- test.fail("should not be called:x");
- });
- loader.unload();
-
- // Then switch to private mode in order to check that the previous instance
- // is correctly destroyed
- pb.activate();
- pb.once("start", function onStart() {
- require("timer").setTimeout(function () {
- test.assert(!called,
- "First private browsing instance is destroyed and inactive");
-
- // Must reset to normal mode, so that next test starts with it.
- pb.deactivate();
- test.done();
- }, 0);
- });
- };
-
- exports.testBothListeners = function(test) {
- test.waitUntilDone();
- let stop = false;
- let start = false;
-
- function onStop() {
- test.assertEqual(stop, false,
- "stop callback must be called only once");
- test.assertEqual(pbService.privateBrowsingEnabled, false,
- "private mode is disabled when stop event is emitted");
- test.assertEqual(pb.isActive, false,
- "`isActive` is `false` when stop event is emitted");
-
- pb.on("start", finish);
- pb.removeListener("start", onStart);
- pb.removeListener("start", onStart2);
- pb.activate();
- stop = true;
- }
-
- function onStart() {
- test.assertEqual(false, start,
- "stop callback must be called only once");
- test.assert(pbService.privateBrowsingEnabled,
- "private mode is active when start event is emitted");
- test.assert(pb.isActive,
- "`isActive` is `true` when start event is emitted");
-
- pb.on("stop", onStop);
- pb.deactivate();
- start = true;
- }
-
- function onStart2() {
- test.assert(start, "start listener must be called already");
- test.assertEqual(false, stop, "stop callback must not be called yet");
- }
-
- function finish() {
- test.assert(pbService.privateBrowsingEnabled, true,
- "private mode is active when start event is emitted");
- test.assert(pb.isActive,
- "`isActive` is `true` when start event is emitted");
-
- pb.removeListener("start", finish);
- pb.removeListener("stop", onStop);
-
- pb.deactivate();
- pb.once("stop", function () {
- test.assertEqual(pbService.privateBrowsingEnabled, false);
- test.assertEqual(pb.isActive, false);
-
- test.done();
- });
- }
-
- pb.on("start", onStart);
- pb.on("start", onStart2);
- pbService.privateBrowsingEnabled = true;
- };
-
- exports["test activate private mode via handler"] = function(test) {
- const tabs = require("tabs");
-
- test.waitUntilDone();
- function onReady(tab) {
- if (tab.url == "about:robots")
- tab.close(function() pb.activate());
- }
- function cleanup(tab) {
- if (tab.url == "about:") {
- tabs.removeListener("ready", cleanup);
- tab.close(function onClose() {
- test.done();
- });
- }
- }
-
- tabs.on("ready", onReady);
- pb.once("start", function onStart() {
- test.pass("private mode was activated");
- pb.deactivate();
- });
- pb.once("stop", function onStop() {
- test.pass("private mode was deactivated");
- tabs.removeListener("ready", onReady);
- tabs.on("ready", cleanup);
- });
- tabs.once("open", function onOpen() {
- tabs.open("about:robots");
- });
- tabs.open("about:");
- };
-}
-else {
- // tests for the case where private browsing doesn't exist
- exports.testNoImpl = function (test) {
- test.assertEqual(pb.isActive, false,
- "pb.isActive returns false when private browsing isn't supported");
- };
-}
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-request.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-request.js
deleted file mode 100644
index 42425d7..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-request.js
+++ /dev/null
@@ -1,340 +0,0 @@
-/* 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/. */
-
-const { Request } = require("addon-kit/request");
-const { pathFor } = require("api-utils/system");
-const { startServerAsync } = require("api-utils/httpd");
-const file = require("api-utils/file");
-
-const basePath = pathFor("TmpD")
-const port = 8099;
-
-
-exports.testOptionsValidator = function(test) {
- // First, a simple test to make sure we didn't break normal functionality.
- test.assertRaises(function () {
- Request({
- url: null
- });
- }, 'The option "url" must be one of the following types: string');
-
- // Next we'll have a Request that doesn't throw from c'tor, but from a setter.
- let req = Request({
- url: "http://playground.zpao.com/jetpack/request/text.php",
- onComplete: function () {}
- });
- test.assertRaises(function () {
- req.url = null;
- }, 'The option "url" must be one of the following types: string');
- // The url shouldn't have changed, so check that
- test.assertEqual(req.url, "http://playground.zpao.com/jetpack/request/text.php");
-}
-
-exports.testContentValidator = function(test) {
- test.waitUntilDone();
- Request({
- url: "data:text/html,response",
- content: { 'key1' : null, 'key2' : 'some value' },
- onComplete: function(response) {
- test.assertEqual(response.text, "response?key1=null&key2=some+value");
- test.done();
- }
- }).get();
-};
-
-// All tests below here require a network connection. They will be commented out
-// when checked in. If you'd like to run them, simply uncomment them.
-//
-// When we have the means, these tests will be converted so that they don't
-// require an external server nor a network connection.
-
-// This is a request to a file that exists.
-exports.testStatus200 = function (test) {
- let srv = startServerAsync(port, basePath);
- let content = "Look ma, no hands!\n";
- let basename = "test-request.txt"
- prepareFile(basename, content);
-
- test.waitUntilDone();
- var req = Request({
- url: "http://localhost:" + port + "/" + basename,
- onComplete: function (response) {
- test.assertEqual(this, req, "`this` should be request");
- test.assertEqual(response.status, 200);
- test.assertEqual(response.statusText, "OK");
- test.assertEqual(response.headers["Content-Type"], "text/plain");
- test.assertEqual(response.text, content);
- srv.stop(function() test.done());
- }
- }).get();
-}
-
-// This tries to get a file that doesn't exist
-exports.testStatus404 = function (test) {
- var srv = startServerAsync(port, basePath);
-
- test.waitUntilDone();
- Request({
- // the following URL doesn't exist
- url: "http://localhost:" + port + "/test-request-404.txt",
- onComplete: function (response) {
- test.assertEqual(response.status, 404);
- test.assertEqual(response.statusText, "Not Found");
- srv.stop(function() test.done());
- }
- }).get();
-}
-
-/*
-// a simple file with a known header
-exports.testKnownHeader = function (test) {
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/headers.php",
- onComplete: function (response) {
- test.assertEqual(response.headers["x-zpao-header"], "Jamba Juice");
- test.done();
- }
- }).get();
-}
-
-// complex headers
-exports.testKnownHeader = function (test) {
- let headers = {
- "x-zpao-header": "Jamba Juice is: delicious",
- "x-zpao-header-2": "foo, bar",
- "Set-Cookie": "foo=bar\nbaz=foo"
- }
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/complex_headers.php",
- onComplete: function (response) {
- for (k in headers) {
- test.assertEqual(response.headers[k], headers[k]);
- }
- test.done();
- }
- }).get();
-}
-*/
-
-exports.testSimpleJSON = function (test) {
- let srv = startServerAsync(port, basePath);
- let json = { foo: "bar" };
- let basename = "test-request.json";
- prepareFile(basename, JSON.stringify(json));
-
- test.waitUntilDone();
- Request({
- url: "http://localhost:" + port + "/" + basename,
- onComplete: function (response) {
- assertDeepEqual(test, response.json, json);
- srv.stop(function() test.done());
- }
- }).get();
-}
-
-exports.testInvalidJSON = function (test) {
- let srv = startServerAsync(port, basePath);
- let basename = "test-request-invalid.json";
- prepareFile(basename, '"this": "isn\'t JSON"');
-
- test.waitUntilDone();
- Request({
- url: "http://localhost:" + port + "/" + basename,
- onComplete: function (response) {
- test.assertEqual(response.json, null);
- srv.stop(function() test.done());
- }
- }).get();
-}
-
-/*
-exports.testGetWithParamsNotContent = function (test) {
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/getpost.php?foo=bar",
- onComplete: function (response) {
- let expected = {
- "POST": [],
- "GET" : { foo: "bar" }
- };
- assertDeepEqual(test, response.json, expected);
- test.done();
- }
- }).get();
-}
-
-exports.testGetWithContent = function (test) {
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/getpost.php",
- content: { foo: "bar" },
- onComplete: function (response) {
- let expected = {
- "POST": [],
- "GET" : { foo: "bar" }
- };
- assertDeepEqual(test, response.json, expected);
- test.done();
- }
- }).get();
-}
-
-exports.testGetWithParamsAndContent = function (test) {
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/getpost.php?foo=bar",
- content: { baz: "foo" },
- onComplete: function (response) {
- let expected = {
- "POST": [],
- "GET" : { foo: "bar", baz: "foo" }
- };
- assertDeepEqual(test, response.json, expected);
- test.done();
- }
- }).get();
-}
-
-exports.testSimplePost = function (test) {
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/getpost.php",
- content: { foo: "bar" },
- onComplete: function (response) {
- let expected = {
- "POST": { foo: "bar" },
- "GET" : []
- };
- assertDeepEqual(test, response.json, expected);
- test.done();
- }
- }).post();
-}
-
-exports.testEncodedContent = function (test) {
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/getpost.php",
- content: "foo=bar&baz=foo",
- onComplete: function (response) {
- let expected = {
- "POST": [],
- "GET" : { foo: "bar", baz: "foo" }
- };
- assertDeepEqual(test, response.json, expected);
- test.done();
- }
- }).get();
-}
-
-exports.testEncodedContentWithSpaces = function (test) {
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/getpost.php",
- content: "foo=bar+hop!&baz=foo",
- onComplete: function (response) {
- let expected = {
- "POST": [],
- "GET" : { foo: "bar hop!", baz: "foo" }
- };
- assertDeepEqual(test, response.json, expected);
- test.done();
- }
- }).get();
-}
-
-exports.testGetWithArray = function (test) {
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/getpost.php",
- content: { foo: [1, 2], baz: "foo" },
- onComplete: function (response) {
- let expected = {
- "POST": [],
- "GET" : { foo: [1, 2], baz: "foo" }
- };
- assertDeepEqual(test, response.json, expected);
- test.done();
- }
- }).get();
-}
-
-exports.testGetWithNestedArray = function (test) {
- test.waitUntilDone();
- Request({
- url: "http://playground.zpao.com/jetpack/request/getpost.php",
- content: { foo: [1, 2, [3, 4]], bar: "baz" },
- onComplete: function (response) {
- let expected = {
- "POST": [],
- "GET" : this.content
- };
- assertDeepEqual(test, response.json, expected);
- test.done();
- }
- }).get();
-}
-
-exports.testGetWithNestedArray = function (test) {
- test.waitUntilDone();
- let request = Request({
- url: "http://playground.zpao.com/jetpack/request/getpost.php",
- content: {
- foo: [1, 2, {
- omg: "bbq",
- "all your base!": "are belong to us"
- }],
- bar: "baz"
- },
- onComplete: function (response) {
- let expected = {
- "POST": [],
- "GET" : request.content
- };
- assertDeepEqual(test, response.json, expected);
- test.done();
- }
- }).get();
-}
-*/
-
-// This is not a proper testing for deep equal, but it's good enough for my uses
-// here. It will do type coercion to check equality, but that's good here. Data
-// coming from the server will be stringified and so "0" should be equal to 0.
-function assertDeepEqual(test, obj1, obj2, msg) {
- function equal(o1, o2) {
- // cover our non-object cases well enough
- if (o1 == o2)
- return true;
- if (typeof(o1) != typeof(o2))
- return false;
- if (typeof(o1) != "object")
- return o1 == o2;
-
- let e = true;
- for (let [key, val] in Iterator(o1)) {
- e = e && key in o2 && equal(o2[key], val);
- if (!e)
- break;
- }
- for (let [key, val] in Iterator(o2)) {
- e = e && key in o1 && equal(o1[key], val);
- if (!e)
- break;
- }
- return e;
- }
- msg = msg || "objects not equal - " + JSON.stringify(obj1) + " != " +
- JSON.stringify(obj2);
- test.assert(equal(obj1, obj2), msg);
-}
-
-function prepareFile(basename, content) {
- let filePath = file.join(basePath, basename);
- let fileStream = file.open(filePath, 'w');
- fileStream.write(content);
- fileStream.close();
-}
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-selection.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-selection.js
deleted file mode 100644
index 06feb7e..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-selection.js
+++ /dev/null
@@ -1,458 +0,0 @@
-/* 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/. */
-
-let timer = require("timer");
-let {Cc,Ci} = require("chrome");
-
-// Arbitrary delay needed to avoid weird behavior.
-// TODO: We need to find all uses of this and replace them
-// with more deterministic solutions.
-const ARB_DELAY = 100;
-
-// Select all divs elements in an HTML document
-function selectAllDivs(window) {
- let divs = window.document.getElementsByTagName("div");
- let s = window.getSelection();
- if (s.rangeCount > 0)
- s.removeAllRanges();
- for (let i = 0; i < divs.length; i++) {
- let range = window.document.createRange();
- range.selectNode(divs[i]);
- s.addRange(range);
- }
-}
-
-function selectTextarea(window, from, to) {
- let textarea = window.document.getElementsByTagName("textarea")[0];
-
- from = from || 0;
- to = to || textarea.value.length;
-
- textarea.setSelectionRange(from, to);
- textarea.focus();
-}
-
-function primeTestCase(html, test, callback) {
- let tabBrowser = require("tab-browser");
- let dataURL = "data:text/html," + encodeURI(html);
- let tracker = tabBrowser.whenContentLoaded(
- function(window) {
- if (window.document.location.href != dataURL)
- return;
- callback(window, test);
- timer.setTimeout(function() {
- tracker.unload();
- test.done();
- window.close();
- },
- ARB_DELAY);
- }
- );
- tabBrowser.addTab(dataURL);
-}
-
-const DIV1 = '<div id="foo">bar</div>';
-const DIV2 = '<div>noodles</div>';
-const HTML_MULTIPLE = '<html><body>' + DIV1 + DIV2 + '</body></html>';
-const HTML_SINGLE = '<html><body>' + DIV1 + '</body></html>';
-
-// Tests of contiguous
-
-exports.testContiguousMultiple = function testContiguousMultiple(test) {
- let selection = require("selection");
- primeTestCase(HTML_MULTIPLE, test, function(window, test) {
- selectAllDivs(window);
- test.assertEqual(selection.isContiguous, false,
- "selection.isContiguous multiple works.");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testContiguousSingle = function testContiguousSingle(test) {
- let selection = require("selection");
- primeTestCase(HTML_SINGLE, test, function(window, test) {
- selectAllDivs(window);
- test.assertEqual(selection.isContiguous, true,
- "selection.isContiguous single works.");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testContiguousWithoutSelection =
- function testContiguousWithoutSelection(test) {
- let selection = require("selection");
- primeTestCase(HTML_SINGLE, test, function(window, test) {
- test.assertEqual(selection.isContiguous, false,
- "selection.isContiguous without selection works.");
- });
-
- test.waitUntilDone(5000);
-};
-
-/**
- * Test that setting the contiguous property has no effect.
- */
-/*exports.testSetContiguous = function testSetContiguous(test) {
- let selection = require("selection");
- primeTestCase(HTML_MULTIPLE, test, function(window, test) {
- selectAllDivs(window);
- try {
- selection.isContiguous = true;
- test.assertEqual(selection.isContiguous, false,
- "setting selection.isContiguous doesn't work (as expected).");
- }
- catch (e) {
- test.pass("setting selection.isContiguous doesn't work (as expected).");
- }
- });
-
- test.waitUntilDone(5000);
-};*/
-
-
-// HTML tests
-
-exports.testGetHTMLSingleSelection = function testGetHTMLSingleSelection(test) {
- let selection = require("selection");
- primeTestCase(HTML_SINGLE, test, function(window, test) {
- selectAllDivs(window);
- test.assertEqual(selection.html, DIV1, "get html selection works");
- });
-
- test.waitUntilDone(5000);
-};
-
-/* Myk's comments: This is fine. However, it reminds me to figure out and
- specify whether iteration is ordered. If so, we'll want to change this
- test in the future to test that the discontiguous selections are returned in
- the appropriate order. In the meantime, add a comment to that effect here */
-exports.testGetHTMLMultipleSelection =
- function testGetHTMLMultipleSelection(test) {
- let selection = require("selection");
- primeTestCase(HTML_MULTIPLE, test, function(window, test) {
- selectAllDivs(window);
- let assertions = false;
- for each (let i in selection) {
- test.assertEqual(true, [DIV1, DIV2].some(function(t) t == i.html),
- "get multiple selection html works");
- assertions = true;
- }
- // Ensure we ran at least one assertEqual()
- test.assert(assertions, "No assertions were called");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testGetHTMLNull = function testGetHTMLNull(test) {
- let selection = require("selection");
- primeTestCase(HTML_SINGLE, test, function(window, test) {
- test.assertEqual(selection.html, null, "get html null works");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testGetHTMLWeird = function testGetHTMLWeird(test) {
- let selection = require("selection");
- // If the getter is used when there are contiguous selections, the first
- // selection should be returned
- primeTestCase(HTML_MULTIPLE, test, function(window, test) {
- selectAllDivs(window);
- test.assertEqual(selection.html, DIV1, "get html weird works");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testGetHTMLNullInTextareaSelection =
- function testGetHTMLNullInTextareaSelection(test) {
- let selection = require("selection");
-
- primeTestCase(TEXT_FIELD, test, function(window, test) {
- selectTextarea(window);
-
- test.assertEqual(selection.html, null, "get html null in textarea works")
- });
-
- test.waitUntilDone(5000);
-};
-
-const REPLACEMENT_HTML = "<b>Lorem ipsum dolor sit amet</b>";
-
-exports.testSetHTMLSelection = function testSetHTMLSelection(test) {
- let selection = require("selection");
- primeTestCase(HTML_SINGLE, test, function(window, test) {
- selectAllDivs(window);
- selection.html = REPLACEMENT_HTML;
- test.assertEqual(selection.html, "<span>" + REPLACEMENT_HTML +
- "</span>", "selection html works");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testSetHTMLException = function testSetHTMLException(test) {
- let selection = require("selection");
- primeTestCase(HTML_SINGLE, test, function(window, test) {
- try {
- selection.html = REPLACEMENT_HTML;
- test.fail("set HTML throws when there's no selection.");
- }
- catch (e) {
- test.pass("set HTML throws when there's no selection.");
- }
- });
-
- test.waitUntilDone(5000);
-};
-
-const TEXT1 = "foo";
-const TEXT2 = "noodles";
-const TEXT_MULTIPLE = "<html><body><div>" + TEXT1 + "</div><div>" + TEXT2 +
- "</div></body></html>";
-const TEXT_SINGLE = "<html><body><div>" + TEXT1 + "</div></body></html>";
-const TEXT_FIELD = "<html><body><textarea>" + TEXT1 + "</textarea></body></html>";
-
-// Text tests
-
-exports.testSetHTMLinTextareaSelection =
- function testSetHTMLinTextareaSelection(test) {
- let selection = require("selection");
-
- primeTestCase(TEXT_FIELD, test, function(window, test) {
- selectTextarea(window);
-
- // HTML string is set as plain text in textareas, that's because
- // `selection.html` and `selection.text` are basically aliases when a
- // value is set. See bug 677269
- selection.html = REPLACEMENT_HTML;
-
- test.assertEqual(selection.text, REPLACEMENT_HTML,
- "set selection html in textarea works");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testGetTextSingleSelection =
- function testGetTextSingleSelection(test) {
- let selection = require("selection");
- primeTestCase(TEXT_SINGLE, test, function(window, test) {
- selectAllDivs(window);
- test.assertEqual(selection.text, TEXT1, "get text selection works");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testGetTextMultipleSelection =
- function testGetTextMultipleSelection(test) {
- let selection = require("selection");
- primeTestCase(TEXT_MULTIPLE, test, function(window, test) {
- selectAllDivs(window);
- let assertions = false;
- for each (let i in selection) {
- test.assertEqual(true, [TEXT1, TEXT2].some(function(t) t == i.text),
- "get multiple selection text works");
- assertions = true;
- }
- // Ensure we ran at least one assertEqual()
- test.assert(assertions, "No assertions were called");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testGetTextNull = function testGetTextNull(test) {
- let selection = require("selection");
- primeTestCase(TEXT_SINGLE, test, function(window, test) {
- test.assertEqual(selection.text, null, "get text null works");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testGetTextWeird = function testGetTextWeird(test) {
- let selection = require("selection");
- // If the getter is used when there are contiguous selections, the first
- // selection should be returned
- primeTestCase(TEXT_MULTIPLE, test, function(window, test) {
- selectAllDivs(window);
- test.assertEqual(selection.text, TEXT1, "get text weird works");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testGetTextNullInTextareaSelection =
- function testGetTextInTextareaSelection(test) {
- let selection = require("selection");
-
- primeTestCase(TEXT_FIELD, test, function(window, test) {
- test.assertEqual(selection.text, null, "get text null in textarea works")
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testGetTextInTextareaSelection =
- function testGetTextInTextareaSelection(test) {
- let selection = require("selection");
-
- primeTestCase(TEXT_FIELD, test, function(window, test) {
- selectTextarea(window);
-
- test.assertEqual(selection.text, TEXT1, "get text null in textarea works")
- });
-
- test.waitUntilDone(5000);
-};
-
-const REPLACEMENT_TEXT = "Lorem ipsum dolor sit amet";
-
-exports.testSetTextSelection = function testSetTextSelection(test) {
- let selection = require("selection");
- primeTestCase(TEXT_SINGLE, test, function(window, test) {
- selectAllDivs(window);
- selection.text = REPLACEMENT_TEXT;
- test.assertEqual(selection.text, REPLACEMENT_TEXT, "selection text works");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testSetHTMLException = function testSetHTMLException(test) {
- let selection = require("selection");
- primeTestCase(TEXT_SINGLE, test, function(window, test) {
- try {
- selection.text = REPLACEMENT_TEXT;
- test.fail("set HTML throws when there's no selection.");
- }
- catch (e) {
- test.pass("set HTML throws when there's no selection.");
- }
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testSetTextInTextareaSelection =
- function testSetTextInTextareaSelection(test) {
- let selection = require("selection");
-
- primeTestCase(TEXT_FIELD, test, function(window, test) {
- selectTextarea(window);
-
- selection.text = REPLACEMENT_TEXT;
-
- test.assertEqual(selection.text, REPLACEMENT_TEXT,
- "set selection text in textarea works");
- });
-
- test.waitUntilDone(5000);
-};
-
-// Iterator tests
-
-exports.testIterator = function testIterator(test) {
- let selection = require("selection");
- let selectionCount = 0;
- primeTestCase(TEXT_MULTIPLE, test, function(window, test) {
- selectAllDivs(window);
- for each (let i in selection)
- selectionCount++;
- test.assertEqual(2, selectionCount, "iterator works.");
- });
-
- test.waitUntilDone(5000);
-};
-
-exports.testIteratorWithTextareaSelection =
- function testIteratorWithTextareaSelection(test) {
- let selection = require("selection");
- let selectionCount = 0;
-
- primeTestCase(TEXT_FIELD, test, function(window, test) {
- selectTextarea(window);
-
- for each (let i in selection)
- selectionCount++;
-
- test.assertEqual(1, selectionCount, "iterator works in textarea.");
- });
-
- test.waitUntilDone(5000);
-};
-
-/* onSelect tests */
-
-/*
-function sendSelectionSetEvent(window) {
- const Ci = Components.interfaces;
- let utils = window.QueryInterface(Ci.nsIInterfaceRequestor).
- getInterface(Ci.nsIDOMWindowUtils);
- if (!utils.sendSelectionSetEvent(0, 1, false))
- dump("**** sendSelectionSetEvent did not select anything\n");
- else
- dump("**** sendSelectionSetEvent succeeded\n");
-}
-
-// testOnSelect() requires nsIDOMWindowUtils, which is only available in
-// Firefox 3.7+.
-exports.testOnSelect = function testOnSelect(test) {
- let selection = require("selection");
- let callbackCount = 0;
- primeTestCase(TEXT_SINGLE, test, function(window, test) {
- selection.onSelect = function() {callbackCount++};
- // Now simulate the user selecting stuff
- sendSelectionSetEvent(window);
- selection.text = REPLACEMENT_TEXT;
- test.assertEqual(1, callbackCount, "onSelect text listener works.");
- //test.pass();
- //test.done();
- });
-
- test.waitUntilDone(5000);
-};
-
-// testOnSelectExceptionNoBubble() requires nsIDOMWindowUtils, which is only
-// available in Firefox 3.7+.
-exports.testOnSelectExceptionNoBubble =
- function testOnSelectTextSelection(test) {
- let selection = require("selection");
- primeTestCase(HTML_SINGLE, test, function(window, test) {
- selection.onSelect = function() {
- throw new Error("Exception thrown in testOnSelectExceptionNoBubble");
- };
- // Now simulate the user selecting stuff
- sendSelectionSetEvent(window);
- test.pass("onSelect catches exceptions.");
- });
-
- test.waitUntilDone(5000);
-};
-*/
-
-// If the module doesn't support the app we're being run in, require() will
-// throw. In that case, remove all tests above from exports, and add one dummy
-// test that passes.
-try {
- require("selection");
-}
-catch (err) {
- // This bug should be mentioned in the error message.
- let bug = "https://bugzilla.mozilla.org/show_bug.cgi?id=560716";
- if (err.message.indexOf(bug) < 0)
- throw err;
- for (let [prop, val] in Iterator(exports)) {
- if (/^test/.test(prop) && typeof(val) === "function")
- delete exports[prop];
- }
- exports.testAppNotSupported = function (test) {
- test.pass("The selection module does not support this application.");
- };
-}
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-simple-prefs.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-simple-prefs.js
deleted file mode 100644
index 7452a8a..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-simple-prefs.js
+++ /dev/null
@@ -1,175 +0,0 @@
-/* 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/. */
-
-
-const { Loader } = require("./helpers");
-const { setTimeout } = require("timers");
-const { notify } = require("observer-service");
-const { jetpackID } = require("@packaging");
-
-exports.testSetGetBool = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let sp = loader.require("simple-prefs").prefs;
-
- test.assertEqual(sp.test, undefined, "Value should not exist");
- sp.test = true;
- test.assert(sp.test, "Value read should be the value previously set");
-
- loader.unload();
- test.done();
-};
-
-exports.testSetGetInt = function(test) {
- test.waitUntilDone();
-
- // Load the module once, set a value.
- let loader = Loader(module);
- let sp = loader.require("simple-prefs").prefs;
-
- test.assertEqual(sp["test-int"], undefined, "Value should not exist");
- sp["test-int"] = 1;
- test.assertEqual(sp["test-int"], 1, "Value read should be the value previously set");
-
- loader.unload();
- test.done();
-};
-
-exports.testSetComplex = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let sp = loader.require("simple-prefs").prefs;
-
- try {
- sp["test-complex"] = {test: true};
- test.fail("Complex values are not allowed");
- }
- catch (e) {
- test.pass("Complex values are not allowed");
- }
-
- loader.unload();
- test.done();
-};
-
-exports.testSetGetString = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let sp = loader.require("simple-prefs").prefs;
-
- test.assertEqual(sp["test-string"], undefined, "Value should not exist");
- sp["test-string"] = "test";
- test.assertEqual(sp["test-string"], "test", "Value read should be the value previously set");
-
- loader.unload();
- test.done();
-};
-
-exports.testHasAndRemove = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let sp = loader.require("simple-prefs").prefs;
-
- sp.test = true;
- test.assert(("test" in sp), "Value exists");
- delete sp.test;
- test.assertEqual(sp.test, undefined, "Value should be undefined");
-
- loader.unload();
- test.done();
-
-};
-
-exports.testPrefListener = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let sp = loader.require("simple-prefs");
-
- let listener = function(prefName) {
- test.assertEqual(prefName, "test-listen", "The prefs listener heard the right event");
- test.done();
- };
-
- sp.on("test-listen", listener);
-
- sp.prefs["test-listen"] = true;
- loader.unload();
-};
-
-exports.testBtnListener = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let sp = loader.require("simple-prefs");
-
- sp.on("test-btn-listen", function() {
- test.pass("Button press event was heard");
- test.done();
- });
- notify((jetpackID + "-cmdPressed"), "", "test-btn-listen");
-
- loader.unload();
-};
-
-exports.testPrefRemoveListener = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let sp = loader.require("simple-prefs");
- let counter = 0;
-
- let listener = function() {
- test.pass("The prefs listener was not removed yet");
-
- if (++counter > 1)
- test.fail("The prefs listener was not removed");
-
- sp.removeListener("test-listen2", listener);
-
- sp.prefs["test-listen2"] = false;
-
- setTimeout(function() {
- test.pass("The prefs listener was removed");
- loader.unload();
- test.done();
- }, 250);
- };
-
- sp.on("test-listen2", listener);
-
- // emit change
- sp.prefs["test-listen2"] = true;
-};
-
-// Bug 710117: Test that simple-pref listeners are removed on unload
-exports.testPrefUnloadListener = function(test) {
- test.waitUntilDone();
-
- let loader = Loader(module);
- let sp = loader.require("simple-prefs");
- let counter = 0;
-
- let listener = function() {
- test.assertEqual(++counter, 1, "This listener should only be called once");
-
- loader.unload();
-
- // this may not execute after unload, but definitely shouldn't fire listener
- sp.prefs["test-listen3"] = false;
- // this should execute, but also definitely shouldn't fire listener
- require("simple-prefs").prefs["test-listen3"] = false; //
-
- test.done();
- };
-
- sp.on("test-listen3", listener);
-
- // emit change
- sp.prefs["test-listen3"] = true;
-};
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-simple-storage.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-simple-storage.js
deleted file mode 100644
index 25d0770..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-simple-storage.js
+++ /dev/null
@@ -1,311 +0,0 @@
-/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
- * vim:set ts=2 sw=2 sts=2 et filetype=javascript
- * 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/. */
-
-const file = require("file");
-const prefs = require("preferences-service");
-
-const QUOTA_PREF = "extensions.addon-sdk.simple-storage.quota";
-
-let {Cc,Ci} = require("chrome");
-
-const { Loader } = require("./helpers");
-const options = require("@packaging");
-
-let storeFile = Cc["@mozilla.org/file/directory_service;1"].
- getService(Ci.nsIProperties).
- get("ProfD", Ci.nsIFile);
-storeFile.append("jetpack");
-storeFile.append(options.jetpackID);
-storeFile.append("simple-storage");
-storeFile.append("store.json");
-let storeFilename = storeFile.path;
-
-function manager(loader) loader.sandbox("simple-storage").manager;
-
-exports.testSetGet = function (test) {
- test.waitUntilDone();
-
- // Load the module once, set a value.
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
- manager(loader).jsonStore.onWrite = function (storage) {
- test.assert(file.exists(storeFilename), "Store file should exist");
-
- // Load the module again and make sure the value stuck.
- loader = Loader(module);
- ss = loader.require("simple-storage");
- manager(loader).jsonStore.onWrite = function (storage) {
- file.remove(storeFilename);
- test.done();
- };
- test.assertEqual(ss.storage.foo, val, "Value should persist");
- loader.unload();
- };
- let val = "foo";
- ss.storage.foo = val;
- test.assertEqual(ss.storage.foo, val, "Value read should be value set");
- loader.unload();
-};
-
-exports.testSetGetRootArray = function (test) {
- setGetRoot(test, [1, 2, 3], function (arr1, arr2) {
- if (arr1.length !== arr2.length)
- return false;
- for (let i = 0; i < arr1.length; i++) {
- if (arr1[i] !== arr2[i])
- return false;
- }
- return true;
- });
-};
-
-exports.testSetGetRootBool = function (test) {
- setGetRoot(test, true);
-};
-
-exports.testSetGetRootFunction = function (test) {
- setGetRootError(test, function () {},
- "Setting storage to a function should fail");
-};
-
-exports.testSetGetRootNull = function (test) {
- setGetRoot(test, null);
-};
-
-exports.testSetGetRootNumber = function (test) {
- setGetRoot(test, 3.14);
-};
-
-exports.testSetGetRootObject = function (test) {
- setGetRoot(test, { foo: 1, bar: 2 }, function (obj1, obj2) {
- for (let [prop, val] in Iterator(obj1)) {
- if (!(prop in obj2) || obj2[prop] !== val)
- return false;
- }
- for (let [prop, val] in Iterator(obj2)) {
- if (!(prop in obj1) || obj1[prop] !== val)
- return false;
- }
- return true;
- });
-};
-
-exports.testSetGetRootString = function (test) {
- setGetRoot(test, "sho' 'nuff");
-};
-
-exports.testSetGetRootUndefined = function (test) {
- setGetRootError(test, undefined, "Setting storage to undefined should fail");
-};
-
-exports.testEmpty = function (test) {
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
- loader.unload();
- test.assert(!file.exists(storeFilename), "Store file should not exist");
-};
-
-exports.testMalformed = function (test) {
- let stream = file.open(storeFilename, "w");
- stream.write("i'm not json");
- stream.close();
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
- let empty = true;
- for (let key in ss.storage) {
- empty = false;
- break;
- }
- test.assert(empty, "Malformed storage should cause root to be empty");
- loader.unload();
-};
-
-// Go over quota and handle it by listener.
-exports.testQuotaExceededHandle = function (test) {
- test.waitUntilDone();
- prefs.set(QUOTA_PREF, 18);
-
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
- ss.on("OverQuota", function () {
- test.pass("OverQuota was emitted as expected");
- test.assertEqual(this, ss, "`this` should be simple storage");
- ss.storage = { x: 4, y: 5 };
-
- manager(loader).jsonStore.onWrite = function () {
- loader = Loader(module);
- ss = loader.require("simple-storage");
- let numProps = 0;
- for (let prop in ss.storage)
- numProps++;
- test.assert(numProps, 2,
- "Store should contain 2 values: " + ss.storage.toSource());
- test.assertEqual(ss.storage.x, 4, "x value should be correct");
- test.assertEqual(ss.storage.y, 5, "y value should be correct");
- manager(loader).jsonStore.onWrite = function (storage) {
- prefs.reset(QUOTA_PREF);
- test.done();
- };
- loader.unload();
- };
- loader.unload();
- });
- // This will be JSON.stringify()ed to: {"a":1,"b":2,"c":3} (19 bytes)
- ss.storage = { a: 1, b: 2, c: 3 };
- manager(loader).jsonStore.write();
-};
-
-// Go over quota but don't handle it. The last good state should still persist.
-exports.testQuotaExceededNoHandle = function (test) {
- test.waitUntilDone();
- prefs.set(QUOTA_PREF, 5);
-
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
-
- manager(loader).jsonStore.onWrite = function (storage) {
- loader = Loader(module);
- ss = loader.require("simple-storage");
- test.assertEqual(ss.storage, val,
- "Value should have persisted: " + ss.storage);
- ss.storage = "some very long string that is very long";
- ss.on("OverQuota", function () {
- test.pass("OverQuota emitted as expected");
- manager(loader).jsonStore.onWrite = function () {
- test.fail("Over-quota value should not have been written");
- };
- loader.unload();
-
- loader = Loader(module);
- ss = loader.require("simple-storage");
- test.assertEqual(ss.storage, val,
- "Over-quota value should not have been written, " +
- "old value should have persisted: " + ss.storage);
- loader.unload();
- prefs.reset(QUOTA_PREF);
- test.done();
- });
- manager(loader).jsonStore.write();
- };
-
- let val = "foo";
- ss.storage = val;
- loader.unload();
-};
-
-exports.testQuotaUsage = function (test) {
- test.waitUntilDone();
-
- let quota = 21;
- prefs.set(QUOTA_PREF, quota);
-
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
-
- // {"a":1} (7 bytes)
- ss.storage = { a: 1 };
- test.assertEqual(ss.quotaUsage, 7 / quota, "quotaUsage should be correct");
-
- // {"a":1,"bb":2} (14 bytes)
- ss.storage = { a: 1, bb: 2 };
- test.assertEqual(ss.quotaUsage, 14 / quota, "quotaUsage should be correct");
-
- // {"a":1,"bb":2,"cc":3} (21 bytes)
- ss.storage = { a: 1, bb: 2, cc: 3 };
- test.assertEqual(ss.quotaUsage, 21 / quota, "quotaUsage should be correct");
-
- manager(loader).jsonStore.onWrite = function () {
- prefs.reset(QUOTA_PREF);
- test.done();
- };
- loader.unload();
-};
-
-exports.testUninstall = function (test) {
- test.waitUntilDone();
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
- manager(loader).jsonStore.onWrite = function () {
- test.assert(file.exists(storeFilename), "Store file should exist");
-
- loader = Loader(module);
- ss = loader.require("simple-storage");
- loader.unload("uninstall");
- test.assert(!file.exists(storeFilename), "Store file should be removed");
- test.done();
- };
- ss.storage.foo = "foo";
- loader.unload();
-};
-
-exports.testSetNoSetRead = function (test) {
- test.waitUntilDone();
-
- // Load the module, set a value.
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
- manager(loader).jsonStore.onWrite = function (storage) {
- test.assert(file.exists(storeFilename), "Store file should exist");
-
- // Load the module again but don't access ss.storage.
- loader = Loader(module);
- ss = loader.require("simple-storage");
- manager(loader).jsonStore.onWrite = function (storage) {
- test.fail("Nothing should be written since `storage` was not accessed.");
- };
- loader.unload();
-
- // Load the module a third time and make sure the value stuck.
- loader = Loader(module);
- ss = loader.require("simple-storage");
- manager(loader).jsonStore.onWrite = function (storage) {
- file.remove(storeFilename);
- test.done();
- };
- test.assertEqual(ss.storage.foo, val, "Value should persist");
- loader.unload();
- };
- let val = "foo";
- ss.storage.foo = val;
- test.assertEqual(ss.storage.foo, val, "Value read should be value set");
- loader.unload();
-};
-
-
-function setGetRoot(test, val, compare) {
- test.waitUntilDone();
-
- compare = compare || function (a, b) a === b;
-
- // Load the module once, set a value.
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
- manager(loader).jsonStore.onWrite = function () {
- test.assert(file.exists(storeFilename), "Store file should exist");
-
- // Load the module again and make sure the value stuck.
- loader = Loader(module);
- ss = loader.require("simple-storage");
- manager(loader).jsonStore.onWrite = function () {
- file.remove(storeFilename);
- test.done();
- };
- test.assert(compare(ss.storage, val), "Value should persist");
- loader.unload();
- };
- ss.storage = val;
- test.assert(compare(ss.storage, val), "Value read should be value set");
- loader.unload();
-}
-
-function setGetRootError(test, val, msg) {
- let pred = "storage must be one of the following types: " +
- "array, boolean, null, number, object, string";
- let loader = Loader(module);
- let ss = loader.require("simple-storage");
- test.assertRaises(function () ss.storage = val, pred, msg);
- loader.unload();
-}
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-tabs.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-tabs.js
deleted file mode 100644
index 5719ab4..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-tabs.js
+++ /dev/null
@@ -1,900 +0,0 @@
-/* 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/. */
-"use strict";
-
-var {Cc,Ci} = require("chrome");
-const { Loader } = require("./helpers");
-
-// test tab.activeTab getter
-exports.testActiveTab_getter = function(test) {
- test.waitUntilDone();
-
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
-
- let url = "data:text/html,<html><head><title>foo</title></head></html>";
- require("tab-browser").addTab(
- url,
- {
- onLoad: function(e) {
- test.assert(tabs.activeTab);
- test.assertEqual(tabs.activeTab.url, url);
- test.assertEqual(tabs.activeTab.title, "foo");
- closeBrowserWindow(window, function() test.done());
- }
- }
- );
- });
-};
-
-// test 'BrowserWindow' instance creation on tab 'activate' event
-// See bug 648244: there was a infinite loop.
-exports.testBrowserWindowCreationOnActivate = function(test) {
- test.waitUntilDone();
-
- let windows = require("windows").browserWindows;
- let tabs = require("tabs");
-
- let gotActivate = false;
-
- tabs.once('activate', function onActivate(eventTab) {
- test.assert(windows.activeWindow, "Is able to fetch activeWindow");
- gotActivate = true;
- });
-
- openBrowserWindow(function(window, browser) {
- test.assert(gotActivate, "Received activate event before openBrowserWindow's callback is called");
- closeBrowserWindow(window, function () test.done());
- });
-}
-
-// test tab.activeTab setter
-exports.testActiveTab_setter = function(test) {
- test.waitUntilDone();
-
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let url = "data:text/html,<html><head><title>foo</title></head></html>";
-
- tabs.on('ready', function onReady(tab) {
- tabs.removeListener('ready', onReady);
- test.assertEqual(tabs.activeTab.url, "about:blank", "activeTab url has not changed");
- test.assertEqual(tab.url, url, "url of new background tab matches");
- tabs.on('activate', function onActivate(eventTab) {
- tabs.removeListener('activate', onActivate);
- test.assertEqual(tabs.activeTab.url, url, "url after activeTab setter matches");
- test.assertEqual(eventTab, tab, "event argument is the activated tab");
- test.assertEqual(eventTab, tabs.activeTab, "the tab is the active one");
- closeBrowserWindow(window, function() test.done());
- });
- tab.activate();
- })
-
- tabs.open({
- url: url,
- inBackground: true
- });
- });
-};
-
-exports.testAutomaticDestroy = function(test) {
- test.waitUntilDone();
-
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
-
- // Create a second tab instance that we will destroy
- let called = false;
-
- let loader = Loader(module);
- let tabs2 = loader.require("tabs");
- tabs2.on('open', function onOpen(tab) {
- called = true;
- });
-
- loader.unload();
-
- // Fire a tab event an ensure that this destroyed tab is inactive
- tabs.once('open', function () {
- require("timer").setTimeout(function () {
- test.assert(!called, "Unloaded tab module is destroyed and inactive");
- closeBrowserWindow(window, function() test.done());
- }, 0);
- });
-
- tabs.open("data:text/html,foo");
-
- });
-};
-
-// test tab properties
-exports.testTabProperties = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs= require("tabs");
- let url = "data:text/html,<html><head><title>foo</title></head><body>foo</body></html>";
- tabs.open({
- url: url,
- onReady: function(tab) {
- test.assertEqual(tab.title, "foo", "title of the new tab matches");
- test.assertEqual(tab.url, url, "URL of the new tab matches");
- test.assert(tab.favicon, "favicon of the new tab is not empty");
- test.assertEqual(tab.style, null, "style of the new tab matches");
- test.assertEqual(tab.index, 1, "index of the new tab matches");
- test.assertNotEqual(tab.getThumbnail(), null, "thumbnail of the new tab matches");
- closeBrowserWindow(window, function() test.done());
- }
- });
- });
-};
-
-// test tabs iterator and length property
-exports.testTabsIteratorAndLength = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let startCount = 0;
- for each (let t in tabs) startCount++;
- test.assertEqual(startCount, tabs.length, "length property is correct");
- let url = "data:text/html,default";
- tabs.open(url);
- tabs.open(url);
- tabs.open({
- url: url,
- onOpen: function(tab) {
- let count = 0;
- for each (let t in tabs) count++;
- test.assertEqual(count, startCount + 3, "iterated tab count matches");
- test.assertEqual(startCount + 3, tabs.length, "iterated tab count matches length property");
- closeBrowserWindow(window, function() test.done());
- }
- });
- });
-};
-
-// test tab.url setter
-exports.testTabLocation = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let url1 = "data:text/html,foo";
- let url2 = "data:text/html,bar";
-
- tabs.on('ready', function onReady(tab) {
- if (tab.url != url2)
- return;
- tabs.removeListener('ready', onReady);
- test.pass("tab.load() loaded the correct url");
- closeBrowserWindow(window, function() test.done());
- });
-
- tabs.open({
- url: url1,
- onOpen: function(tab) {
- tab.url = url2
- }
- });
- });
-};
-
-// test tab.close()
-exports.testTabClose = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let url = "data:text/html,foo";
-
- test.assertNotEqual(tabs.activeTab.url, url, "tab is now the active tab");
- tabs.on('ready', function onReady(tab) {
- tabs.removeListener('ready', onReady);
- test.assertEqual(tabs.activeTab.url, tab.url, "tab is now the active tab");
- tab.close(function() {
- closeBrowserWindow(window, function() test.done());
- });
- test.assertNotEqual(tabs.activeTab.url, url, "tab is no longer the active tab");
- });
-
- tabs.open(url);
- });
-};
-
-// test tab.reload()
-exports.testTabReload = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let url = "data:text/html,<!doctype%20html><title></title>";
-
- tabs.open({ url: url, onReady: function onReady(tab) {
- tab.removeListener("ready", onReady);
-
- browser.addEventListener(
- "load",
- function onLoad() {
- browser.removeEventListener("load", onLoad, true);
-
- browser.addEventListener(
- "load",
- function onReload() {
- browser.removeEventListener("load", onReload, true);
- test.pass("the tab was loaded again");
- test.assertEqual(tab.url, url, "the tab has the same URL");
- closeBrowserWindow(window, function() test.done());
- },
- true
- );
- tab.reload();
- },
- true
- );
- }});
- });
-};
-
-// test tab.move()
-exports.testTabMove = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let url = "data:text/html,foo";
-
- tabs.open({
- url: url,
- onOpen: function(tab) {
- test.assertEqual(tab.index, 1, "tab index before move matches");
- tab.index = 0;
- test.assertEqual(tab.index, 0, "tab index after move matches");
- closeBrowserWindow(window, function() test.done());
- }
- });
- });
-};
-
-// open tab with default options
-exports.testOpen = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let url = "data:text/html,default";
- tabs.open({
- url: url,
- onReady: function(tab) {
- test.assertEqual(tab.url, url, "URL of the new tab matches");
- test.assertEqual(window.content.location, url, "URL of active tab in the current window matches");
- closeBrowserWindow(window, function() test.done());
- }
- });
- });
-};
-
-// open pinned tab
-exports.testOpenPinned = function(test) {
- const xulApp = require("xul-app");
- if (xulApp.versionInRange(xulApp.platformVersion, "2.0b2", "*")) {
- // test tab pinning
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let url = "data:text/html,default";
- tabs.open({
- url: url,
- isPinned: true,
- onOpen: function(tab) {
- test.assertEqual(tab.isPinned, true, "The new tab is pinned");
- closeBrowserWindow(window, function() test.done());
- }
- });
- });
- }
- else {
- test.pass("Pinned tabs are not supported in this application.");
- }
-};
-
-// pin/unpin opened tab
-exports.testPinUnpin = function(test) {
- const xulApp = require("xul-app");
- if (xulApp.versionInRange(xulApp.platformVersion, "2.0b2", "*")) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let url = "data:text/html,default";
- tabs.open({
- url: url,
- onOpen: function(tab) {
- tab.pin();
- test.assertEqual(tab.isPinned, true, "The tab was pinned correctly");
- tab.unpin();
- test.assertEqual(tab.isPinned, false, "The tab was unpinned correctly");
- closeBrowserWindow(window, function() test.done());
- }
- });
- });
- }
- else {
- test.pass("Pinned tabs are not supported in this application.");
- }
-};
-
-// open tab in background
-exports.testInBackground = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let activeUrl = tabs.activeTab.url;
- let url = "data:text/html,background";
- test.assertEqual(activeWindow, window, "activeWindow matches this window");
- tabs.on('ready', function onReady(tab) {
- tabs.removeListener('ready', onReady);
- test.assertEqual(tabs.activeTab.url, activeUrl, "URL of active tab has not changed");
- test.assertEqual(tab.url, url, "URL of the new background tab matches");
- test.assertEqual(activeWindow, window, "a new window was not opened");
- test.assertNotEqual(tabs.activeTab.url, url, "URL of active tab is not the new URL");
- closeBrowserWindow(window, function() test.done());
- });
- tabs.open({
- url: url,
- inBackground: true
- });
- });
-};
-
-// open tab in new window
-exports.testOpenInNewWindow = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
-
- let cache = [];
- let windowUtils = require("window-utils");
- let wt = new windowUtils.WindowTracker({
- onTrack: function(win) {
- cache.push(win);
- },
- onUntrack: function(win) {
- cache.splice(cache.indexOf(win), 1)
- }
- });
- let startWindowCount = cache.length;
-
- let url = "data:text/html,newwindow";
- tabs.open({
- url: url,
- inNewWindow: true,
- onReady: function(tab) {
- let newWindow = cache[cache.length - 1];
- test.assertEqual(cache.length, startWindowCount + 1, "a new window was opened");
- test.assertEqual(activeWindow, newWindow, "new window is active");
- test.assertEqual(tab.url, url, "URL of the new tab matches");
- test.assertEqual(newWindow.content.location, url, "URL of new tab in new window matches");
- test.assertEqual(tabs.activeTab.url, url, "URL of activeTab matches");
- for (var i in cache) cache[i] = null;
- wt.unload();
- closeBrowserWindow(newWindow, function() {
- closeBrowserWindow(window, function() test.done());
- });
- }
- });
- });
-};
-
-// onOpen event handler
-exports.testTabsEvent_onOpen = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- var tabs = require("tabs");
- let url = "data:text/html,1";
- let eventCount = 0;
-
- // add listener via property assignment
- function listener1(tab) {
- eventCount++;
- };
- tabs.on('open', listener1);
-
- // add listener via collection add
- tabs.on('open', function listener2(tab) {
- test.assertEqual(++eventCount, 2, "both listeners notified");
- tabs.removeListener('open', listener1);
- tabs.removeListener('open', listener2);
- closeBrowserWindow(window, function() test.done());
- });
-
- tabs.open(url);
- });
-};
-
-// onClose event handler
-exports.testTabsEvent_onClose = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- var tabs = require("tabs");
- let url = "data:text/html,onclose";
- let eventCount = 0;
-
- // add listener via property assignment
- function listener1(tab) {
- eventCount++;
- }
- tabs.on('close', listener1);
-
- // add listener via collection add
- tabs.on('close', function listener2(tab) {
- test.assertEqual(++eventCount, 2, "both listeners notified");
- tabs.removeListener('close', listener1);
- tabs.removeListener('close', listener2);
- closeBrowserWindow(window, function() test.done());
- });
-
- tabs.on('ready', function onReady(tab) {
- tabs.removeListener('ready', onReady);
- tab.close();
- });
-
- tabs.open(url);
- });
-};
-
-// onClose event handler when a window is closed
-exports.testTabsEvent_onCloseWindow = function(test) {
- test.waitUntilDone();
-
- openBrowserWindow(function(window, browser) {
- var tabs = require("tabs");
-
- let closeCount = 0, individualCloseCount = 0;
- function listener() {
- closeCount++;
- }
- tabs.on('close', listener);
-
- // One tab is already open with the window
- let openTabs = 1;
- function testCasePossiblyLoaded() {
- if (++openTabs == 4) {
- beginCloseWindow();
- }
- }
-
- tabs.open({
- url: "data:text/html,tab2",
- onOpen: function() testCasePossiblyLoaded(),
- onClose: function() individualCloseCount++
- });
-
- tabs.open({
- url: "data:text/html,tab3",
- onOpen: function() testCasePossiblyLoaded(),
- onClose: function() individualCloseCount++
- });
-
- tabs.open({
- url: "data:text/html,tab4",
- onOpen: function() testCasePossiblyLoaded(),
- onClose: function() individualCloseCount++
- });
-
- function beginCloseWindow() {
- closeBrowserWindow(window, function testFinished() {
- tabs.removeListener("close", listener);
-
- test.assertEqual(closeCount, 4, "Correct number of close events received");
- test.assertEqual(individualCloseCount, 3,
- "Each tab with an attached onClose listener received a close " +
- "event when the window was closed");
-
- test.done();
- });
- }
-
- });
-}
-
-// onReady event handler
-exports.testTabsEvent_onReady = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- var tabs = require("tabs");
- let url = "data:text/html,onready";
- let eventCount = 0;
-
- // add listener via property assignment
- function listener1(tab) {
- eventCount++;
- };
- tabs.on('ready', listener1);
-
- // add listener via collection add
- tabs.on('ready', function listener2(tab) {
- test.assertEqual(++eventCount, 2, "both listeners notified");
- tabs.removeListener('ready', listener1);
- tabs.removeListener('ready', listener2);
- closeBrowserWindow(window, function() test.done());
- });
-
- tabs.open(url);
- });
-};
-
-// onActivate event handler
-exports.testTabsEvent_onActivate = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- var tabs = require("tabs");
- let url = "data:text/html,onactivate";
- let eventCount = 0;
-
- // add listener via property assignment
- function listener1(tab) {
- eventCount++;
- };
- tabs.on('activate', listener1);
-
- // add listener via collection add
- tabs.on('activate', function listener2(tab) {
- test.assertEqual(++eventCount, 2, "both listeners notified");
- tabs.removeListener('activate', listener1);
- tabs.removeListener('activate', listener2);
- closeBrowserWindow(window, function() test.done());
- });
-
- tabs.open(url);
- });
-};
-
-// onDeactivate event handler
-exports.testTabsEvent_onDeactivate = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- var tabs = require("tabs");
- let url = "data:text/html,ondeactivate";
- let eventCount = 0;
-
- // add listener via property assignment
- function listener1(tab) {
- eventCount++;
- };
- tabs.on('deactivate', listener1);
-
- // add listener via collection add
- tabs.on('deactivate', function listener2(tab) {
- test.assertEqual(++eventCount, 2, "both listeners notified");
- tabs.removeListener('deactivate', listener1);
- tabs.removeListener('deactivate', listener2);
- closeBrowserWindow(window, function() test.done());
- });
-
- tabs.on('open', function onOpen(tab) {
- tabs.removeListener('open', onOpen);
- tabs.open("data:text/html,foo");
- });
-
- tabs.open(url);
- });
-};
-
-exports.testTabsEvent_pinning = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- var tabs = require("tabs");
- let url = "data:text/html,1";
-
- tabs.on('open', function onOpen(tab) {
- tabs.removeListener('open', onOpen);
- tab.pin();
- });
-
- tabs.on('pinned', function onPinned(tab) {
- tabs.removeListener('pinned', onPinned);
- test.assert(tab.isPinned, "notified tab is pinned");
- tab.unpin();
- });
-
- tabs.on('unpinned', function onUnpinned(tab) {
- tabs.removeListener('unpinned', onUnpinned);
- test.assert(!tab.isPinned, "notified tab is not pinned");
- closeBrowserWindow(window, function() test.done());
- });
-
- tabs.open(url);
- });
-};
-
-// per-tab event handlers
-exports.testPerTabEvents = function(test) {
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- var tabs = require("tabs");
- let eventCount = 0;
-
- tabs.open({
- url: "data:text/html,foo",
- onOpen: function(tab) {
- // add listener via property assignment
- function listener1() {
- eventCount++;
- };
- tab.on('ready', listener1);
-
- // add listener via collection add
- tab.on('ready', function listener2() {
- test.assertEqual(eventCount, 1, "both listeners notified");
- tab.removeListener('ready', listener1);
- tab.removeListener('ready', listener2);
- closeBrowserWindow(window, function() test.done());
- });
- }
- });
- });
-};
-
-exports.testAttachOnOpen = function (test) {
- // Take care that attach has to be called on tab ready and not on tab open.
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
-
- tabs.open({
- url: "data:text/html,foobar",
- onOpen: function (tab) {
- let worker = tab.attach({
- contentScript: 'self.postMessage(document.location.href); ',
- onMessage: function (msg) {
- test.assertEqual(msg, "about:blank",
- "Worker document url is about:blank on open");
- worker.destroy();
- closeBrowserWindow(window, function() test.done());
- }
- });
- }
- });
-
- });
-}
-
-exports.testAttachOnMultipleDocuments = function (test) {
- // Example of attach that process multiple tab documents
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let firstLocation = "data:text/html,foobar";
- let secondLocation = "data:text/html,bar";
- let thirdLocation = "data:text/html,fox";
- let onReadyCount = 0;
- let worker1 = null;
- let worker2 = null;
- let detachEventCount = 0;
- tabs.open({
- url: firstLocation,
- onReady: function (tab) {
- onReadyCount++;
- if (onReadyCount == 1) {
- worker1 = tab.attach({
- contentScript: 'self.on("message", ' +
- ' function () self.postMessage(document.location.href)' +
- ');',
- onMessage: function (msg) {
- test.assertEqual(msg, firstLocation,
- "Worker url is equal to the 1st document");
- tab.url = secondLocation;
- },
- onDetach: function () {
- detachEventCount++;
- test.pass("Got worker1 detach event");
- test.assertRaises(function () {
- worker1.postMessage("ex-1");
- },
- /The page has been destroyed/,
- "postMessage throw because worker1 is destroyed");
- checkEnd();
- }
- });
- worker1.postMessage("new-doc-1");
- }
- else if (onReadyCount == 2) {
-
- worker2 = tab.attach({
- contentScript: 'self.on("message", ' +
- ' function () self.postMessage(document.location.href)' +
- ');',
- onMessage: function (msg) {
- test.assertEqual(msg, secondLocation,
- "Worker url is equal to the 2nd document");
- tab.url = thirdLocation;
- },
- onDetach: function () {
- detachEventCount++;
- test.pass("Got worker2 detach event");
- test.assertRaises(function () {
- worker2.postMessage("ex-2");
- },
- /The page has been destroyed/,
- "postMessage throw because worker2 is destroyed");
- checkEnd();
- }
- });
- worker2.postMessage("new-doc-2");
- }
- else if (onReadyCount == 3) {
-
- tab.close();
-
- }
-
- }
- });
-
- function checkEnd() {
- if (detachEventCount != 2)
- return;
-
- test.pass("Got all detach events");
-
- closeBrowserWindow(window, function() test.done());
- }
-
- });
-}
-
-
-exports.testAttachWrappers = function (test) {
- // Check that content script has access to wrapped values by default
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let document = "data:text/html,<script>var globalJSVar = true; " +
- " document.getElementById = 3;</script>";
- let count = 0;
-
- tabs.open({
- url: document,
- onReady: function (tab) {
- let worker = tab.attach({
- contentScript: 'try {' +
- ' self.postMessage(!("globalJSVar" in window));' +
- ' self.postMessage(typeof window.globalJSVar == "undefined");' +
- '} catch(e) {' +
- ' self.postMessage(e.message);' +
- '}',
- onMessage: function (msg) {
- test.assertEqual(msg, true, "Worker has wrapped objects ("+count+")");
- if (count++ == 1)
- closeBrowserWindow(window, function() test.done());
- }
- });
- }
- });
-
- });
-}
-
-/*
-// We do not offer unwrapped access to DOM since bug 601295 landed
-// See 660780 to track progress of unwrap feature
-exports.testAttachUnwrapped = function (test) {
- // Check that content script has access to unwrapped values through unsafeWindow
- test.waitUntilDone();
- openBrowserWindow(function(window, browser) {
- let tabs = require("tabs");
- let document = "data:text/html,<script>var globalJSVar=true;</script>";
- let count = 0;
-
- tabs.open({
- url: document,
- onReady: function (tab) {
- let worker = tab.attach({
- contentScript: 'try {' +
- ' self.postMessage(unsafeWindow.globalJSVar);' +
- '} catch(e) {' +
- ' self.postMessage(e.message);' +
- '}',
- onMessage: function (msg) {
- test.assertEqual(msg, true, "Worker has access to javascript content globals ("+count+")");
- closeBrowserWindow(window, function() test.done());
- }
- });
- }
- });
-
- });
-}
-*/
-
-exports['test window focus changes active tab'] = function(test) {
- test.waitUntilDone();
- let win1 = openBrowserWindow(function() {
- let win2 = openBrowserWindow(function() {
- let tabs = require("tabs");
- tabs.on("activate", function onActivate() {
- tabs.removeListener("activate", onActivate);
- test.pass("activate was called on windows focus change.");
- closeBrowserWindow(win1, function() {
- closeBrowserWindow(win2, function() { test.done(); });
- });
- });
- win1.focus();
- }, "data:text/html,test window focus changes active tab</br><h1>Window #2");
- }, "data:text/html,test window focus changes active tab</br><h1>Window #1");
-};
-
-exports['test ready event on new window tab'] = function(test) {
- test.waitUntilDone();
- let uri = encodeURI("data:text/html,Waiting for ready event!");
-
- require("tabs").on("ready", function onReady(tab) {
- if (tab.url === uri) {
- require("tabs").removeListener("ready", onReady);
- test.pass("ready event was emitted");
- closeBrowserWindow(window, function() {
- test.done();
- });
- }
- });
-
- let window = openBrowserWindow(function(){}, uri);
-};
-/******************* helpers *********************/
-
-// Helper for getting the active window
-this.__defineGetter__("activeWindow", function activeWindow() {
- return Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator).
- getMostRecentWindow("navigator:browser");
-});
-
-// Utility function to open a new browser window.
-function openBrowserWindow(callback, url) {
- let ww = Cc["@mozilla.org/embedcomp/window-watcher;1"].
- getService(Ci.nsIWindowWatcher);
- let urlString = Cc["@mozilla.org/supports-string;1"].
- createInstance(Ci.nsISupportsString);
- urlString.data = url;
- let window = ww.openWindow(null, "chrome://browser/content/browser.xul",
- "_blank", "chrome,all,dialog=no", urlString);
-
- if (callback) {
- window.addEventListener("load", function onLoad(event) {
- if (event.target && event.target.defaultView == window) {
- window.removeEventListener("load", onLoad, true);
- let browsers = window.document.getElementsByTagName("tabbrowser");
- try {
- require("timer").setTimeout(function () {
- callback(window, browsers[0]);
- }, 10);
- } catch (e) { console.exception(e); }
- }
- }, true);
- }
-
- return window;
-}
-
-// Helper for calling code at window close
-function closeBrowserWindow(window, callback) {
- window.addEventListener("unload", function unload() {
- window.removeEventListener("unload", unload, false);
- callback();
- }, false);
- window.close();
-}
-
-// If the module doesn't support the app we're being run in, require() will
-// throw. In that case, remove all tests above from exports, and add one dummy
-// test that passes.
-try {
- require("tabs");
-}
-catch (err) {
- // This bug should be mentioned in the error message.
- let bug = "https://bugzilla.mozilla.org/show_bug.cgi?id=560716";
- if (err.message.indexOf(bug) < 0)
- throw err;
- for (let [prop, val] in Iterator(exports)) {
- if (/^test/.test(prop) && typeof(val) === "function")
- delete exports[prop];
- }
- exports.testAppNotSupported = function (test) {
- test.pass("the tabs module does not support this application.");
- };
-}
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-timers.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-timers.js
deleted file mode 100644
index 90b26bf..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-timers.js
+++ /dev/null
@@ -1,12 +0,0 @@
-/* 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/. */
-const timers = require("timers");
-
-exports.testTimeout = function (test) {
- test.waitUntilDone();
- timers.setTimeout(function () {
- test.pass("timers.setTimeout works");
- test.done();
- }, 0);
-}
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-widget.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-widget.js
deleted file mode 100644
index 5d3475b..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-widget.js
+++ /dev/null
@@ -1,1010 +0,0 @@
-/* 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/. */
-
-"use strict";
-
-const {Cc,Ci} = require("chrome");
-const { Loader } = require('./helpers');
-const widgets = require("widget");
-const url = require("url");
-const windowUtils = require("window-utils");
-const tabBrowser = require("tab-browser");
-
-exports.testConstructor = function(test) {
- test.waitUntilDone(30000);
-
- let browserWindow = windowUtils.activeBrowserWindow;
- let doc = browserWindow.document;
- let AddonsMgrListener = browserWindow.AddonsMgrListener;
-
- function container() doc.getElementById("addon-bar");
- function widgetCount() container() ? container().getElementsByTagName("toolbaritem").length : 0;
- let widgetStartCount = widgetCount();
- function widgetNode(index) container() ? container().getElementsByTagName("toolbaritem")[index] : null;
-
- // Test basic construct/destroy
- AddonsMgrListener.onInstalling();
- let w = widgets.Widget({ id: "fooID", label: "foo", content: "bar" });
- AddonsMgrListener.onInstalled();
- test.assertEqual(widgetCount(), widgetStartCount + 1, "panel has correct number of child elements after widget construction");
-
- // test widget height
- test.assertEqual(widgetNode(0).firstChild.boxObject.height, 16, "widget has correct default height");
-
- AddonsMgrListener.onUninstalling();
- w.destroy();
- AddonsMgrListener.onUninstalled();
- w.destroy();
- test.pass("Multiple destroys do not cause an error");
- test.assertEqual(widgetCount(), widgetStartCount, "panel has correct number of child elements after destroy");
-
- // Test automatic widget destroy on unload
- let loader = Loader(module);
- let widgetsFromLoader = loader.require("widget");
- let widgetStartCount = widgetCount();
- let w = widgetsFromLoader.Widget({ id: "fooID", label: "foo", content: "bar" });
- test.assertEqual(widgetCount(), widgetStartCount + 1, "widget has been correctly added");
- loader.unload();
- test.assertEqual(widgetCount(), widgetStartCount, "widget has been destroyed on module unload");
-
- // Test nothing
- test.assertRaises(
- function() widgets.Widget({}),
- "The widget must have a non-empty label property.",
- "throws on no properties");
-
- // Test no label
- test.assertRaises(
- function() widgets.Widget({content: "foo"}),
- "The widget must have a non-empty label property.",
- "throws on no label");
-
- // Test empty label
- test.assertRaises(
- function() widgets.Widget({label: "", content: "foo"}),
- "The widget must have a non-empty label property.",
- "throws on empty label");
-
- // Test no content or image
- test.assertRaises(
- function() widgets.Widget({id: "fooID", label: "foo"}),
- "No content or contentURL property found. Widgets must have one or the other.",
- "throws on no content");
-
- // Test empty content, no image
- test.assertRaises(
- function() widgets.Widget({id:"fooID", label: "foo", content: ""}),
- "No content or contentURL property found. Widgets must have one or the other.",
- "throws on empty content");
-
- // Test empty image, no content
- test.assertRaises(
- function() widgets.Widget({id:"fooID", label: "foo", image: ""}),
- "No content or contentURL property found. Widgets must have one or the other.",
- "throws on empty content");
-
- // Test empty content, empty image
- test.assertRaises(
- function() widgets.Widget({id:"fooID", label: "foo", content: "", image: ""}),
- "No content or contentURL property found. Widgets must have one or the other.",
- "throws on empty content");
-
- // Test duplicated ID
- let duplicateID = widgets.Widget({id: "foo", label: "foo", content: "bar"});
- test.assertRaises(
- function() widgets.Widget({id: "foo", label: "bar", content: "bar"}),
- /This widget ID is already used:/,
- "throws on duplicated id");
- duplicateID.destroy();
-
- // Test Bug 652527
- test.assertRaises(
- function() widgets.Widget({id: "", label: "bar", content: "bar"}),
- /You have to specify a unique value for the id property of/,
- "throws on falsey id");
-
- // Test duplicate label, different ID
- let w1 = widgets.Widget({id: "id1", label: "foo", content: "bar"});
- let w2 = widgets.Widget({id: "id2", label: "foo", content: "bar"});
- w1.destroy();
- w2.destroy();
-
- // Test position restore on create/destroy/create
- // Create 3 ordered widgets
- let w1 = widgets.Widget({id: "first", label:"first", content: "bar"});
- let w2 = widgets.Widget({id: "second", label:"second", content: "bar"});
- let w3 = widgets.Widget({id: "third", label:"third", content: "bar"});
- // Remove the middle widget
- test.assertEqual(widgetNode(1).getAttribute("label"), "second", "second widget is the second widget inserted");
- w2.destroy();
- test.assertEqual(widgetNode(1).getAttribute("label"), "third", "second widget is removed, so second widget is now the third one");
- w2 = widgets.Widget({id: "second", label:"second", content: "bar"});
- test.assertEqual(widgetNode(1).getAttribute("label"), "second", "second widget is created again, at the same location");
- // Cleanup this testcase
- AddonsMgrListener.onUninstalling();
- w1.destroy();
- w2.destroy();
- w3.destroy();
- AddonsMgrListener.onUninstalled();
-
- // Test concurrent widget module instances on addon-bar hiding
- let loader = Loader(module);
- let anotherWidgetsInstance = loader.require("widget");
- test.assert(container().collapsed, "UI is hidden when no widgets");
- AddonsMgrListener.onInstalling();
- let w1 = widgets.Widget({id: "foo", label: "foo", content: "bar"});
- // Ideally we would let AddonsMgrListener display the addon bar
- // But, for now, addon bar is immediatly displayed by sdk code
- // https://bugzilla.mozilla.org/show_bug.cgi?id=627484
- test.assert(!container().collapsed, "UI is already visible when we just added the widget");
- AddonsMgrListener.onInstalled();
- test.assert(!container().collapsed, "UI become visible when we notify AddonsMgrListener about end of addon installation");
- let w2 = anotherWidgetsInstance.Widget({id: "bar", label: "bar", content: "foo"});
- test.assert(!container().collapsed, "UI still visible when we add a second widget");
- AddonsMgrListener.onUninstalling();
- w1.destroy();
- AddonsMgrListener.onUninstalled();
- test.assert(!container().collapsed, "UI still visible when we remove one of two widgets");
- AddonsMgrListener.onUninstalling();
- w2.destroy();
- test.assert(!container().collapsed, "UI is still visible when we have removed all widget but still not called onUninstalled");
- AddonsMgrListener.onUninstalled();
- test.assert(container().collapsed, "UI is hidden when we have removed all widget and called onUninstalled");
-
- // Helper for testing a single widget.
- // Confirms proper addition and content setup.
- function testSingleWidget(widgetOptions) {
- // We have to display which test is being run, because here we do not
- // use the regular test framework but rather a custom one that iterates
- // the `tests` array.
- console.info("executing: " + widgetOptions.id);
-
- let startCount = widgetCount();
- let widget = widgets.Widget(widgetOptions);
- let node = widgetNode(startCount);
- test.assert(node, "widget node at index");
- test.assertEqual(node.tagName, "toolbaritem", "widget element is correct");
- test.assertEqual(widget.width + "px", node.style.minWidth, "widget width is correct");
- test.assertEqual(widgetCount(), startCount + 1, "container has correct number of child elements");
- let content = node.firstElementChild;
- test.assert(content, "found content");
- test.assertMatches(content.tagName, /iframe|image/, "content is iframe or image");
- return widget;
- }
-
- // Array of widgets to test
- // and a function to test them.
- let tests = [];
- function nextTest() {
- test.assertEqual(widgetCount(), 0, "widget in last test property cleaned itself up");
- if (!tests.length)
- test.done();
- else
- require("timer").setTimeout(tests.shift(), 0);
- }
- function doneTest() nextTest();
-
- // text widget
- tests.push(function testTextWidget() testSingleWidget({
- id: "text",
- label: "text widget",
- content: "oh yeah",
- contentScript: "self.postMessage(document.body.innerHTML);",
- contentScriptWhen: "end",
- onMessage: function (message) {
- test.assertEqual(this.content, message, "content matches");
- this.destroy();
- doneTest();
- }
- }));
-
- // html widget
- tests.push(function testHTMLWidget() testSingleWidget({
- id: "html",
- label: "html widget",
- content: "<div>oh yeah</div>",
- contentScript: "self.postMessage(document.body.innerHTML);",
- contentScriptWhen: "end",
- onMessage: function (message) {
- test.assertEqual(this.content, message, "content matches");
- this.destroy();
- doneTest();
- }
- }));
-
- // image url widget
- tests.push(function testImageURLWidget() testSingleWidget({
- id: "image",
- label: "image url widget",
- contentURL: require("self").data.url("test.html"),
- contentScript: "self.postMessage({title: document.title, " +
- "tag: document.body.firstElementChild.tagName, " +
- "content: document.body.firstElementChild.innerHTML});",
- contentScriptWhen: "end",
- onMessage: function (message) {
- test.assertEqual(message.title, "foo", "title matches");
- test.assertEqual(message.tag, "P", "element matches");
- test.assertEqual(message.content, "bar", "element content matches");
- this.destroy();
- doneTest();
- }
- }));
-
- // web uri widget
- tests.push(function testWebURIWidget() testSingleWidget({
- id: "web",
- label: "web uri widget",
- contentURL: require("self").data.url("test.html"),
- contentScript: "self.postMessage({title: document.title, " +
- "tag: document.body.firstElementChild.tagName, " +
- "content: document.body.firstElementChild.innerHTML});",
- contentScriptWhen: "end",
- onMessage: function (message) {
- test.assertEqual(message.title, "foo", "title matches");
- test.assertEqual(message.tag, "P", "element matches");
- test.assertEqual(message.content, "bar", "element content matches");
- this.destroy();
- doneTest();
- }
- }));
-
- // event: onclick + content
- tests.push(function testOnclickEventContent() testSingleWidget({
- id: "click",
- label: "click test widget - content",
- content: "<div id='me'>foo</div>",
- contentScript: "var evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('click', true, true ); " +
- "document.getElementById('me').dispatchEvent(evt);",
- contentScriptWhen: "end",
- onClick: function() {
- test.pass("onClick called");
- this.destroy();
- doneTest();
- }
- }));
-
- // event: onmouseover + content
- tests.push(function testOnmouseoverEventContent() testSingleWidget({
- id: "mouseover",
- label: "mouseover test widget - content",
- content: "<div id='me'>foo</div>",
- contentScript: "var evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('mouseover', true, true ); " +
- "document.getElementById('me').dispatchEvent(evt);",
- contentScriptWhen: "end",
- onMouseover: function() {
- test.pass("onMouseover called");
- this.destroy();
- doneTest();
- }
- }));
-
- // event: onmouseout + content
- tests.push(function testOnmouseoutEventContent() testSingleWidget({
- id: "mouseout",
- label: "mouseout test widget - content",
- content: "<div id='me'>foo</div>",
- contentScript: "var evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('mouseout', true, true ); " +
- "document.getElementById('me').dispatchEvent(evt);",
- contentScriptWhen: "end",
- onMouseout: function() {
- test.pass("onMouseout called");
- this.destroy();
- doneTest();
- }
- }));
-
- // event: onclick + image
- tests.push(function testOnclickEventImage() testSingleWidget({
- id: "click",
- label: "click test widget - image",
- contentURL: require("self").data.url("moz_favicon.ico"),
- contentScript: "var evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('click', true, true ); " +
- "document.body.firstElementChild.dispatchEvent(evt);",
- contentScriptWhen: "end",
- onClick: function() {
- test.pass("onClick called");
- this.destroy();
- doneTest();
- }
- }));
-
- // event: onmouseover + image
- tests.push(function testOnmouseoverEventImage() testSingleWidget({
- id: "mouseover",
- label: "mouseover test widget - image",
- contentURL: require("self").data.url("moz_favicon.ico"),
- contentScript: "var evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('mouseover', true, true ); " +
- "document.body.firstElementChild.dispatchEvent(evt);",
- contentScriptWhen: "end",
- onMouseover: function() {
- test.pass("onMouseover called");
- this.destroy();
- doneTest();
- }
- }));
-
- // event: onmouseout + image
- tests.push(function testOnmouseoutEventImage() testSingleWidget({
- id: "mouseout",
- label: "mouseout test widget - image",
- contentURL: require("self").data.url("moz_favicon.ico"),
- contentScript: "var evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('mouseout', true, true ); " +
- "document.body.firstElementChild.dispatchEvent(evt);",
- contentScriptWhen: "end",
- onMouseout: function() {
- test.pass("onMouseout called");
- this.destroy();
- doneTest();
- }
- }));
-
- // test multiple widgets
- tests.push(function testMultipleWidgets() {
- let w1 = widgets.Widget({id: "first", label: "first widget", content: "first content"});
- let w2 = widgets.Widget({id: "second", label: "second widget", content: "second content"});
-
- w1.destroy();
- w2.destroy();
-
- doneTest();
- });
-
- // test updating widget content
- let loads = 0;
- tests.push(function testUpdatingWidgetContent() testSingleWidget({
- id: "content",
- label: "content update test widget",
- content: "<div id='me'>foo</div>",
- contentScript: "self.postMessage(1)",
- contentScriptWhen: "ready",
- onMessage: function(message) {
- if (!this.flag) {
- this.content = "<div id='me'>bar</div>";
- this.flag = 1;
- }
- else {
- test.assertEqual(this.content, "<div id='me'>bar</div>");
- this.destroy();
- doneTest();
- }
- }
- }));
-
- // test updating widget contentURL
- let url1 = "data:text/html,<body>foodle</body>";
- let url2 = "data:text/html,<body>nistel</body>";
-
- tests.push(function testUpdatingContentURL() testSingleWidget({
- id: "content",
- label: "content update test widget",
- contentURL: url1,
- contentScript: "self.postMessage(document.location.href);",
- contentScriptWhen: "end",
- onMessage: function(message) {
- if (!this.flag) {
- test.assertEqual(this.contentURL.toString(), url1);
- test.assertEqual(message, url1);
- this.contentURL = url2;
- this.flag = 1;
- }
- else {
- test.assertEqual(this.contentURL.toString(), url2);
- test.assertEqual(message, url2);
- this.destroy();
- doneTest();
- }
- }
- }));
-
- // test tooltip
- tests.push(function testTooltip() testSingleWidget({
- id: "text",
- label: "text widget",
- content: "oh yeah",
- tooltip: "foo",
- contentScript: "self.postMessage(1)",
- contentScriptWhen: "ready",
- onMessage: function(message) {
- test.assertEqual(this.tooltip, "foo", "tooltip matches");
- this.destroy();
- doneTest();
- }
- }));
-
- // test tooltip fallback to label
- tests.push(function testTooltipFallback() testSingleWidget({
- id: "fallback",
- label: "fallback",
- content: "oh yeah",
- contentScript: "self.postMessage(1)",
- contentScriptWhen: "ready",
- onMessage: function(message) {
- test.assertEqual(this.tooltip, this.label, "tooltip fallbacks to label");
- this.destroy();
- doneTest();
- }
- }));
-
- // test updating widget tooltip
- let updated = false;
- tests.push(function testUpdatingTooltip() testSingleWidget({
- id: "tooltip",
- label: "tooltip update test widget",
- tooltip: "foo",
- content: "<div id='me'>foo</div>",
- contentScript: "self.postMessage(1)",
- contentScriptWhen: "ready",
- onMessage: function(message) {
- this.tooltip = "bar";
- test.assertEqual(this.tooltip, "bar", "tooltip gets updated");
- this.destroy();
- doneTest();
- }
- }));
-
- // test allow attribute
- tests.push(function testDefaultAllow() testSingleWidget({
- id: "allow",
- label: "allow.script attribute",
- content: "<script>document.title = 'ok';</script>",
- contentScript: "self.postMessage(document.title)",
- onMessage: function(message) {
- test.assertEqual(message, "ok", "scripts are evaluated by default");
- this.destroy();
- doneTest();
- }
- }));
-
- tests.push(function testExplicitAllow() testSingleWidget({
- id: "allow",
- label: "allow.script attribute",
- allow: {script: true},
- content: "<script>document.title = 'ok';</script>",
- contentScript: "self.postMessage(document.title)",
- onMessage: function(message) {
- test.assertEqual(message, "ok", "scripts are evaluated when we want to");
- this.destroy();
- doneTest();
- }
- }));
-
- tests.push(function testExplicitDisallow() testSingleWidget({
- id: "allow",
- label: "allow.script attribute",
- content: "<script>document.title = 'ok';</script>",
- allow: {script: false},
- contentScript: "self.postMessage(document.title)",
- onMessage: function(message) {
- test.assertNotEqual(message, "ok", "scripts aren't evaluated when " +
- "explicitly blocked it");
- this.destroy();
- doneTest();
- }
- }));
-
- // test multiple windows
- tests.push(function testMultipleWindows() {
- tabBrowser.addTab("about:blank", { inNewWindow: true, onLoad: function(e) {
- let browserWindow = e.target.defaultView;
- let doc = browserWindow.document;
- function container() doc.getElementById("addon-bar");
- function widgetCount2() container() ? container().childNodes.length : 0;
- let widgetStartCount2 = widgetCount2();
-
- let w1Opts = {id:"first", label: "first widget", content: "first content"};
- let w1 = testSingleWidget(w1Opts);
- test.assertEqual(widgetCount2(), widgetStartCount2 + 1, "2nd window has correct number of child elements after first widget");
-
- let w2Opts = {id:"second", label: "second widget", content: "second content"};
- let w2 = testSingleWidget(w2Opts);
- test.assertEqual(widgetCount2(), widgetStartCount2 + 2, "2nd window has correct number of child elements after second widget");
-
- w1.destroy();
- test.assertEqual(widgetCount2(), widgetStartCount2 + 1, "2nd window has correct number of child elements after first destroy");
- w2.destroy();
- test.assertEqual(widgetCount2(), widgetStartCount2, "2nd window has correct number of child elements after second destroy");
-
- closeBrowserWindow(browserWindow, function() {
- doneTest();
- });
- }});
- });
-
- // test window closing
- tests.push(function testWindowClosing() {
- // 1/ Create a new widget
- let w1Opts = {
- id:"first",
- label: "first widget",
- content: "first content",
- contentScript: "self.port.on('event', function () self.port.emit('event'))"
- };
- let widget = testSingleWidget(w1Opts);
- let windows = require("windows").browserWindows;
-
- // 2/ Retrieve a WidgetView for the initial browser window
- let acceptDetach = false;
- let mainView = widget.getView(windows.activeWindow);
- test.assert(mainView, "Got first widget view");
- mainView.on("detach", function () {
- // 8/ End of our test. Accept detach event only when it occurs after
- // widget.destroy()
- if (acceptDetach)
- doneTest();
- else
- test.fail("View on initial window should not be destroyed");
- });
- mainView.port.on("event", function () {
- // 7/ Receive event sent during 6/ and cleanup our test
- acceptDetach = true;
- widget.destroy();
- });
-
- // 3/ First: open a new browser window
- windows.open({
- url: "about:blank",
- onOpen: function(window) {
- // 4/ Retrieve a WidgetView for this new window
- let view = widget.getView(window);
- test.assert(view, "Got second widget view");
- view.port.on("event", function () {
- test.fail("We should not receive event on the detach view");
- });
- view.on("detach", function () {
- // The related view is destroyed
- // 6/ Send a custom event
- test.assertRaises(function () {
- view.port.emit("event");
- },
- /The widget has been destroyed and can no longer be used./,
- "emit on a destroyed view should throw");
- widget.port.emit("event");
- });
-
- // 5/ Destroy this window
- window.close();
- }
- });
- });
-
- tests.push(function testAddonBarHide() {
- // Hide the addon-bar
- browserWindow.setToolbarVisibility(container(), false);
-
- // Then open a browser window and verify that the addon-bar remains hidden
- tabBrowser.addTab("about:blank", { inNewWindow: true, onLoad: function(e) {
- let browserWindow = e.target.defaultView;
- let doc = browserWindow.document;
- function container2() doc.getElementById("addon-bar");
- function widgetCount2() container2() ? container2().childNodes.length : 0;
- let widgetStartCount2 = widgetCount2();
-
- let w1Opts = {id:"first", label: "first widget", content: "first content"};
- let w1 = testSingleWidget(w1Opts);
- test.assertEqual(widgetCount2(), widgetStartCount2 + 1, "2nd window has correct number of child elements after widget creation");
-
- w1.destroy();
- test.assertEqual(widgetCount2(), widgetStartCount2, "2nd window has correct number of child elements after widget destroy");
-
- test.assert(container().collapsed, "1st window has an hidden addon-bar");
- test.assert(container2().collapsed, "2nd window has an hidden addon-bar");
-
- browserWindow.setToolbarVisibility(container(), true);
-
- closeBrowserWindow(browserWindow, function() {
- doneTest();
- });
- }});
- });
-
- // test widget.width
- tests.push(function testWidgetWidth() testSingleWidget({
- id: "text",
- label: "test widget.width",
- content: "test width",
- width: 200,
- contentScript: "self.postMessage(1)",
- contentScriptWhen: "ready",
- onMessage: function(message) {
- test.assertEqual(this.width, 200);
-
- let node = widgetNode(0);
- test.assertEqual(this.width, node.style.minWidth.replace("px", ""));
- test.assertEqual(this.width, node.firstElementChild.style.width.replace("px", ""));
- this.width = 300;
- test.assertEqual(this.width, node.style.minWidth.replace("px", ""));
- test.assertEqual(this.width, node.firstElementChild.style.width.replace("px", ""));
-
- this.destroy();
- doneTest();
- }
- }));
-
- // test click handler not respond to right-click
- let clickCount = 0;
- tests.push(function testNoRightClick() testSingleWidget({
- id: "click-content",
- label: "click test widget - content",
- content: "<div id='me'>foo</div>",
- contentScript: "var evt = document.createEvent('MouseEvents'); " +
- "evt.initMouseEvent('click', true, true, window, " +
- " 0, 0, 0, 0, 0, false, false, false, false, 2, null); " +
- "document.getElementById('me').dispatchEvent(evt); " +
- "evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('click', true, true ); " +
- "document.getElementById('me').dispatchEvent(evt); " +
- "evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('mouseover', true, true ); " +
- "document.getElementById('me').dispatchEvent(evt);",
- contentScriptWhen: "end",
- onClick: function() clickCount++,
- onMouseover: function() {
- test.assertEqual(clickCount, 1, "right click wasn't sent to click handler");
- this.destroy();
- doneTest();
- }
- }));
-
- // kick off test execution
- doneTest();
-};
-
-exports.testPanelWidget1 = function testPanelWidget1(test) {
- const widgets = require("widget");
-
- let widget1 = widgets.Widget({
- id: "panel1",
- label: "panel widget 1",
- content: "<div id='me'>foo</div>",
- contentScript: "var evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('click', true, true ); " +
- "document.body.dispatchEvent(evt);",
- contentScriptWhen: "end",
- panel: require("panel").Panel({
- contentURL: "data:text/html,<body>Look ma, a panel!</body>",
- onShow: function() {
- widget1.destroy();
- test.pass("panel displayed on click");
- test.done();
- }
- })
- });
- test.waitUntilDone();
-};
-
-exports.testPanelWidget2 = function testPanelWidget2(test) {
- const widgets = require("widget");
- test.assertRaises(
- function() {
- widgets.Widget({
- id: "panel2",
- label: "panel widget 2",
- panel: {}
- });
- },
- "The option \"panel\" must be one of the following types: null, undefined, object",
- "widget.panel must be a Panel object"
- );
-};
-
-exports.testPanelWidget3 = function testPanelWidget3(test) {
- const widgets = require("widget");
- let onClickCalled = false;
- let widget3 = widgets.Widget({
- id: "panel3",
- label: "panel widget 3",
- content: "<div id='me'>foo</div>",
- contentScript: "var evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('click', true, true ); " +
- "document.body.firstElementChild.dispatchEvent(evt);",
- contentScriptWhen: "end",
- onClick: function() {
- onClickCalled = true;
- this.panel.show();
- },
- panel: require("panel").Panel({
- contentURL: "data:text/html,<body>Look ma, a panel!</body>",
- onShow: function() {
- test.assert(
- onClickCalled,
- "onClick called on click for widget with both panel and onClick"
- );
- widget3.destroy();
- test.done();
- }
- })
- });
- test.waitUntilDone();
-};
-
-exports.testWidgetMessaging = function testWidgetMessaging(test) {
- test.waitUntilDone();
- let origMessage = "foo";
- const widgets = require("widget");
- let widget = widgets.Widget({
- id: "foo",
- label: "foo",
- content: "<bar>baz</bar>",
- contentScriptWhen: "end",
- contentScript: "self.on('message', function(data) { self.postMessage(data); }); self.postMessage('ready');",
- onMessage: function(message) {
- if (message == "ready")
- widget.postMessage(origMessage);
- else {
- test.assertEqual(origMessage, message);
- widget.destroy();
- test.done();
- }
- }
- });
-};
-
-exports.testWidgetViews = function testWidgetViews(test) {
- test.waitUntilDone();
- const widgets = require("widget");
- let widget = widgets.Widget({
- id: "foo",
- label: "foo",
- content: "<bar>baz</bar>",
- contentScriptWhen: "ready",
- contentScript: "self.on('message', function(data) self.postMessage(data)); self.postMessage('ready')",
- onAttach: function(view) {
- test.pass("WidgetView created");
- view.on("message", function () {
- test.pass("Got message in WidgetView");
- widget.destroy();
- });
- view.on("detach", function () {
- test.pass("WidgetView destroyed");
- test.done();
- });
- }
- });
-
-};
-
-exports.testWidgetViewsUIEvents = function testWidgetViewsUIEvents(test) {
- test.waitUntilDone();
- const widgets = require("widget");
- let view = null;
- let widget = widgets.Widget({
- id: "foo",
- label: "foo",
- content: "<div id='me'>foo</div>",
- contentScript: "var evt = document.createEvent('HTMLEvents'); " +
- "evt.initEvent('click', true, true ); " +
- "document.getElementById('me').dispatchEvent(evt);",
- contentScriptWhen: "ready",
- onAttach: function(attachView) {
- view = attachView;
- test.pass("Got attach event");
- },
- onClick: function (eventView) {
- test.assertEqual(view, eventView,
- "event first argument is equal to the WidgetView");
- let view2 = widget.getView(require("windows").browserWindows.activeWindow);
- test.assertEqual(view, view2,
- "widget.getView return the same WidgetView");
- widget.destroy();
- test.done();
- }
- });
-};
-
-exports.testWidgetViewsCustomEvents = function testWidgetViewsCustomEvents(test) {
- test.waitUntilDone();
- const widgets = require("widget");
- let widget = widgets.Widget({
- id: "foo",
- label: "foo",
- content: "<div id='me'>foo</div>",
- contentScript: "self.port.emit('event', 'ok');",
- contentScriptWhen: "ready",
- onAttach: function(view) {
- view.port.on("event", function (data) {
- test.assertEqual(data, "ok",
- "event argument is valid on WidgetView");
- });
- },
- });
- widget.port.on("event", function (data) {
- test.assertEqual(data, "ok",
- "event argument is valid on Widget");
- widget.destroy();
- test.done();
- });
-};
-
-exports.testWidgetViewsTooltip = function testWidgetViewsTooltip(test) {
- test.waitUntilDone();
- const widgets = require("widget");
-
- let widget = new widgets.Widget({
- id: "foo",
- label: "foo",
- content: "foo"
- });
- let view = widget.getView(require("windows").browserWindows.activeWindow);
- widget.tooltip = null;
- test.assertEqual(view.tooltip, "foo",
- "view tooltip defaults to base widget label");
- test.assertEqual(widget.tooltip, "foo",
- "tooltip defaults to base widget label");
- widget.destroy();
- test.done();
-};
-
-exports.testWidgetMove = function testWidgetMove(test) {
- test.waitUntilDone();
-
- let windowUtils = require("window-utils");
- let widgets = require("widget");
-
- let browserWindow = windowUtils.activeBrowserWindow;
- let doc = browserWindow.document;
-
- let label = "unique-widget-label";
- let origMessage = "message after node move";
- let gotFirstReady = false;
-
- let widget = widgets.Widget({
- id: "foo",
- label: label,
- content: "<bar>baz</bar>",
- contentScriptWhen: "ready",
- contentScript: "self.on('message', function(data) { self.postMessage(data); }); self.postMessage('ready');",
- onMessage: function(message) {
- if (message == "ready") {
- if (!gotFirstReady) {
- test.pass("Got first ready event");
- let widgetNode = doc.querySelector('toolbaritem[label="' + label + '"]');
- let parent = widgetNode.parentNode;
- parent.insertBefore(widgetNode, parent.firstChild);
- gotFirstReady = true;
- } else {
- test.pass("Got second ready event");
- widget.postMessage(origMessage);
- }
- }
- else {
- test.assertEqual(origMessage, message, "Got message after node move");
- widget.destroy();
- test.done();
- }
- }
- });
-};
-
-/*
-The bug is exhibited when a widget with HTML content has it's content
-changed to new HTML content with a pound in it. Because the src of HTML
-content is converted to a data URI, the underlying iframe doesn't
-consider the content change a navigation change, so doesn't load
-the new content.
-*/
-exports.testWidgetWithPound = function testWidgetWithPound(test) {
- test.waitUntilDone();
-
- function getWidgetContent(widget) {
- let windowUtils = require("window-utils");
- let browserWindow = windowUtils.activeBrowserWindow;
- let doc = browserWindow.document;
- let widgetNode = doc.querySelector('toolbaritem[label="' + widget.label + '"]');
- test.assert(widgetNode, 'found widget node in the front-end');
- return widgetNode.firstChild.contentDocument.body.innerHTML;
- }
-
- let widgets = require("widget");
- let count = 0;
- let widget = widgets.Widget({
- id: "1",
- label: "foo",
- content: "foo",
- contentScript: "window.addEventListener('load', self.postMessage, false);",
- onMessage: function() {
- count++;
- if (count == 1) {
- widget.content = "foo#";
- }
- else {
- test.assertEqual(getWidgetContent(widget), "foo#", "content updated to pound?");
- widget.destroy();
- test.done();
- }
- }
- });
-};
-
-exports.testNavigationBarWidgets = function testNavigationBarWidgets(test) {
- test.waitUntilDone();
-
- let w1 = widgets.Widget({id: "1st", label: "1st widget", content: "1"});
- let w2 = widgets.Widget({id: "2nd", label: "2nd widget", content: "2"});
- let w3 = widgets.Widget({id: "3rd", label: "3rd widget", content: "3"});
-
- // Hack to move 2nd and 3rd widgets manually to the navigation bar, in 5th
- // position, i.e. after search box. 3rd widget will be in 5th and 2nd in 6th.
- function getWidgetNode(toolbar, position) {
- return toolbar.getElementsByTagName("toolbaritem")[position];
- }
- let browserWindow = windowUtils.activeBrowserWindow;
- let doc = browserWindow.document;
- let addonBar = doc.getElementById("addon-bar");
- let w2Toolbaritem = getWidgetNode(addonBar, 1);
- let w3ToolbarItem = getWidgetNode(addonBar, 2);
- let navBar = doc.getElementById("nav-bar");
- navBar.insertItem(w2Toolbaritem.id, navBar.childNodes[6], null, false);
- navBar.insertItem(w3ToolbarItem.id, navBar.childNodes[6], null, false);
- // Widget and Firefox codes rely on this `currentset` attribute,
- // so ensure it is correctly saved
- navBar.setAttribute("currentset", navBar.currentSet);
- doc.persist(navBar.id, "currentset");
- // Update addonbar too as we removed widget from there.
- // Otherwise, widgets may still be added to this toolbar.
- addonBar.setAttribute("currentset", addonBar.currentSet);
- doc.persist(addonBar.id, "currentset");
-
- tabBrowser.addTab("about:blank", { inNewWindow: true, onLoad: function(e) {
- let browserWindow = e.target.defaultView;
- let doc = browserWindow.document;
- let navBar = doc.getElementById("nav-bar");
- let addonBar = doc.getElementById("addon-bar");
-
- // Ensure that 1st is in addon bar
- test.assertEqual(getWidgetNode(addonBar, 0).getAttribute("label"), w1.label);
- // And that 2nd and 3rd keep their original positions in navigation bar
- test.assertEqual(navBar.childNodes[5].getAttribute("label"), w3.label);
- test.assertEqual(navBar.childNodes[6].getAttribute("label"), w2.label);
-
- w1.destroy();
- w2.destroy();
- w3.destroy();
-
- closeBrowserWindow(browserWindow, function() {
- test.done();
- });
- }});
-};
-
-/******************* helpers *********************/
-
-// Helper for calling code at window close
-function closeBrowserWindow(window, callback) {
- require("timer").setTimeout(function() {
- window.addEventListener("unload", function onUnload() {
- window.removeEventListener("unload", onUnload, false);
- callback();
- }, false);
- window.close();
- }, 0);
-}
-
-// ADD NO TESTS BELOW THIS LINE! ///////////////////////////////////////////////
-
-// If the module doesn't support the app we're being run in, require() will
-// throw. In that case, remove all tests above from exports, and add one dummy
-// test that passes.
-try {
- require("widget");
-}
-catch (err) {
- // This bug should be mentioned in the error message.
- let bug = "https://bugzilla.mozilla.org/show_bug.cgi?id=560716";
- if (err.message.indexOf(bug) < 0)
- throw err;
- for (let [prop, val] in Iterator(exports)) {
- if (/^test/.test(prop) && typeof(val) === "function")
- delete exports[prop];
- }
- exports.testAppNotSupported = function (test) {
- test.pass("widget does not support this application.");
- };
-}
-
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-windows.js b/tools/addon-sdk-1.7/packages/addon-kit/tests/test-windows.js
deleted file mode 100644
index b85fec7..0000000
--- a/tools/addon-sdk-1.7/packages/addon-kit/tests/test-windows.js
+++ /dev/null
@@ -1,309 +0,0 @@
-/* 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/. */
-
-const {Cc, Ci} = require("chrome");
-const { setTimeout } = require("timer");
-const { Loader } = require('./helpers');
-const wm = Cc["@mozilla.org/appshell/window-mediator;1"].
- getService(Ci.nsIWindowMediator);
-let browserWindows;
-
-function getTestRunnerWindow() wm.getMostRecentWindow("test:runner")
-
-exports.testOpenAndCloseWindow = function(test) {
- test.waitUntilDone();
-
- test.assertEqual(browserWindows.length, 1, "Only one window open");
-
- browserWindows.open({
- url: "data:text/html,<title>windows API test</title>",
- onOpen: function(window) {
- test.assertEqual(this, browserWindows,
- "The 'this' object is the windows object.");
- test.assertEqual(window.tabs.length, 1, "Only one tab open");
- test.assertEqual(browserWindows.length, 2, "Two windows open");
- window.tabs.activeTab.on('ready', function onReady(tab) {
- tab.removeListener('ready', onReady);
- test.assert(window.title.indexOf("windows API test") != -1,
- "URL correctly loaded");
- window.close();
- });
- },
- onClose: function(window) {
- test.assertEqual(window.tabs.length, 0, "Tabs were cleared");
- test.assertEqual(browserWindows.length, 1, "Only one window open");
- test.done();
- }
- });
-};
-
-exports.testAutomaticDestroy = function(test) {
-
- test.waitUntilDone();
- let windows = browserWindows;
-
- // Create a second windows instance that we will unload
- let called = false;
- let loader = Loader(module);
- let windows2 = loader.require("windows").browserWindows;
- windows2.on("open", function() {
- called = true;
- });
-
- loader.unload();
-
- // Fire a windows event and check that this unloaded instance is inactive
- windows.open({
- url: "data:text/html,foo",
- onOpen: function(window) {
- setTimeout(function () {
- test.assert(!called,
- "Unloaded windows instance is destroyed and inactive");
- window.close(function () {
- test.done();
- });
- });
- }
- });
-
-};
-
-exports.testOnOpenOnCloseListeners = function(test) {
- test.waitUntilDone();
- let windows = browserWindows;
-
- test.assertEqual(browserWindows.length, 1, "Only one window open");
-
- let received = {
- listener1: false,
- listener2: false,
- listener3: false,
- listener4: false
- }
-
- function listener1() {
- test.assertEqual(this, windows, "The 'this' object is the windows object.");
- if (received.listener1)
- test.fail("Event received twice");
- received.listener1 = true;
- }
-
- function listener2() {
- if (received.listener2)
- test.fail("Event received twice");
- received.listener2 = true;
- }
-
- function listener3() {
- test.assertEqual(this, windows, "The 'this' object is the windows object.");
- if (received.listener3)
- test.fail("Event received twice");
- received.listener3 = true;
- }
-
- function listener4() {
- if (received.listener4)
- test.fail("Event received twice");
- received.listener4 = true;
- }
-
- windows.on('open', listener1);
- windows.on('open', listener2);
- windows.on('close', listener3);
- windows.on('close', listener4);
-
- function verify() {
- test.assert(received.listener1, "onOpen handler called");
- test.assert(received.listener2, "onOpen handler called");
- test.assert(received.listener3, "onClose handler called");
- test.assert(received.listener4, "onClose handler called");
-
- windows.removeListener('open', listener1);
- windows.removeListener('open', listener2);
- windows.removeListener('close', listener3);
- windows.removeListener('close', listener4);
- test.done();
- }
-
-
- windows.open({
- url: "data:text/html,foo",
- onOpen: function(window) {
- window.close(verify);
- }
- });
-};
-
-exports.testWindowTabsObject = function(test) {
- test.waitUntilDone();
-
- browserWindows.open({
- url: "data:text/html,<title>tab 1</title>",
- onOpen: function onOpen(window) {
- test.assertEqual(window.tabs.length, 1, "Only 1 tab open");
-
- window.tabs.open({
- url: "data:text/html,<title>tab 2</title>",
- inBackground: true,
- onReady: function onReady(newTab) {
- test.assertEqual(window.tabs.length, 2, "New tab open");
- test.assertEqual(newTab.title, "tab 2", "Correct new tab title");
- test.assertEqual(window.tabs.activeTab.title, "tab 1", "Correct active tab");
-
- let i = 1;
- for each (let tab in window.tabs)
- test.assertEqual(tab.title, "tab " + i++, "Correct title");
-
- window.close();
- }
- });
- },
- onClose: function onClose(window) {
- test.assertEqual(window.tabs.length, 0, "No more tabs on closed window");
- test.done();
- }
- });
-};
-
-exports.testActiveWindow = function(test) {
- const xulApp = require("xul-app");
- if (xulApp.versionInRange(xulApp.platformVersion, "1.9.2", "1.9.2.*")) {
- test.pass("This test is disabled on 3.6. For more information, see bug 598525");
- return;
- }
-
- let windows = browserWindows;
-
- // API window objects
- let window2, window3;
-
- // Raw window objects
- let nonBrowserWindow = getTestRunnerWindow(), rawWindow2, rawWindow3;
-
- test.waitUntilDone();
-
- let testSteps = [
- function() {
- test.assertEqual(windows.length, 3, "Correct number of browser windows");
- let count = 0;
- for (let window in windows)
- count++;
- test.assertEqual(count, 3, "Correct number of windows returned by iterator");
-
- rawWindow2.focus();
- continueAfterFocus(rawWindow2);
- },
- function() {
- nonBrowserWindow.focus();
- continueAfterFocus(nonBrowserWindow);
- },
- function() {
- /**
- * Bug 614079: This test fails intermittently on some specific linux
- * environnements, without being able to reproduce it in same
- * distribution with same window manager.
- * Disable it until being able to reproduce it easily.
-
- // On linux, focus is not consistent, so we can't be sure
- // what window will be on top.
- // Here when we focus "non-browser" window,
- // Any Browser window may be selected as "active".
- test.assert(windows.activeWindow == window2 || windows.activeWindow == window3,
- "Non-browser windows aren't handled by this module");
- */
- window2.activate();
- continueAfterFocus(rawWindow2);
- },
- function() {
- test.assertEqual(windows.activeWindow.title, window2.title, "Correct active window - 2");
- window3.activate();
- continueAfterFocus(rawWindow3);
- },
- function() {
- test.assertEqual(windows.activeWindow.title, window3.title, "Correct active window - 3");
- nonBrowserWindow.focus();
- finishTest();
- }
- ];
-
- windows.open({
- url: "data:text/html,<title>window 2</title>",
- onOpen: function(window) {
- window2 = window;
- rawWindow2 = wm.getMostRecentWindow("navigator:browser");
-
- windows.open({
- url: "data:text/html,<title>window 3</title>",
- onOpen: function(window) {
- window.tabs.activeTab.on('ready', function onReady() {
- window3 = window;
- rawWindow3 = wm.getMostRecentWindow("navigator:browser");
- nextStep()
- });
- }
- });
- }
- });
-
- function nextStep() {
- if (testSteps.length > 0)
- testSteps.shift()();
- }
-
- function continueAfterFocus(targetWindow) {
-
- // Based on SimpleTest.waitForFocus
- var fm = Cc["@mozilla.org/focus-manager;1"].
- getService(Ci.nsIFocusManager);
-
- var childTargetWindow = {};
- fm.getFocusedElementForWindow(targetWindow, true, childTargetWindow);
- childTargetWindow = childTargetWindow.value;
-
- var focusedChildWindow = {};
- if (fm.activeWindow) {
- fm.getFocusedElementForWindow(fm.activeWindow, true, focusedChildWindow);
- focusedChildWindow = focusedChildWindow.value;
- }
-
- var focused = (focusedChildWindow == childTargetWindow);
- if (focused) {
- nextStep();
- } else {
- childTargetWindow.addEventListener("focus", function focusListener() {
- childTargetWindow.removeEventListener("focus", focusListener, true);
- nextStep();
- }, true);
- }
-
- }
-
- function finishTest() {
- window3.close(function() {
- window2.close(function() {
- test.done();
- });
- });
- }
-};
-
-// If the module doesn't support the app we're being run in, require() will
-// throw. In that case, remove all tests above from exports, and add one dummy
-// test that passes.
-try {
- browserWindows = require("windows").browserWindows;
-}
-catch (err) {
- // This bug should be mentioned in the error message.
- let bug = "https://bugzilla.mozilla.org/show_bug.cgi?id=571449";
- if (err.message.indexOf(bug) < 0)
- throw err;
- for (let [prop, val] in Iterator(exports)) {
- if (/^test/.test(prop) && typeof(val) === "function")
- delete exports[prop];
- }
- exports.testAppNotSupported = function (test) {
- test.pass("the windows module does not support this application.");
- };
-}