aboutsummaryrefslogtreecommitdiff
path: root/tools/addon-sdk-1.3/packages/api-utils/tests/test-window-utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/addon-sdk-1.3/packages/api-utils/tests/test-window-utils.js')
-rw-r--r--tools/addon-sdk-1.3/packages/api-utils/tests/test-window-utils.js276
1 files changed, 276 insertions, 0 deletions
diff --git a/tools/addon-sdk-1.3/packages/api-utils/tests/test-window-utils.js b/tools/addon-sdk-1.3/packages/api-utils/tests/test-window-utils.js
new file mode 100644
index 0000000..c5a5c78
--- /dev/null
+++ b/tools/addon-sdk-1.3/packages/api-utils/tests/test-window-utils.js
@@ -0,0 +1,276 @@
+var windowUtils = require("window-utils");
+var timer = require("timer");
+var {Cc,Ci} = require("chrome");
+
+function makeEmptyWindow() {
+ var xulNs = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+ var blankXul = ('<?xml version="1.0"?>' +
+ '<?xml-stylesheet href="chrome://global/skin/" ' +
+ ' type="text/css"?>' +
+ '<window xmlns="' + xulNs + '" windowtype="test:window">' +
+ '</window>');
+ var url = "data:application/vnd.mozilla.xul+xml," + escape(blankXul);
+ var features = ["chrome", "width=10", "height=10"];
+
+ var ww = Cc["@mozilla.org/embedcomp/window-watcher;1"]
+ .getService(Ci.nsIWindowWatcher);
+ return ww.openWindow(null, url, null, features.join(","), null);
+}
+
+exports.testCloseOnUnload = function(test) {
+ var timesClosed = 0;
+ var fakeWindow = {
+ _listeners: [],
+ addEventListener: function(name, func, bool) {
+ this._listeners.push(func);
+ },
+ removeEventListener: function(name, func, bool) {
+ var index = this._listeners.indexOf(func);
+ if (index == -1)
+ throw new Error("event listener not found");
+ this._listeners.splice(index, 1);
+ },
+ close: function() {
+ timesClosed++;
+ this._listeners.forEach(
+ function(func) {
+ func({target: fakeWindow.document});
+ });
+ },
+ document: {
+ get defaultView() { return fakeWindow; }
+ }
+ };
+
+ var loader = test.makeSandboxedLoader();
+ loader.require("window-utils").closeOnUnload(fakeWindow);
+ test.assertEqual(fakeWindow._listeners.length, 1,
+ "unload listener added on closeOnUnload()");
+ test.assertEqual(timesClosed, 0,
+ "window not closed when registered.");
+ loader.require("unload").send();
+ test.assertEqual(timesClosed, 1,
+ "window closed on module unload.");
+ test.assertEqual(fakeWindow._listeners.length, 0,
+ "unload event listener removed on module unload");
+
+ timesClosed = 0;
+ loader.require("window-utils").closeOnUnload(fakeWindow);
+ test.assertEqual(timesClosed, 0,
+ "window not closed when registered.");
+ fakeWindow.close();
+ test.assertEqual(timesClosed, 1,
+ "window closed when close() called.");
+ test.assertEqual(fakeWindow._listeners.length, 0,
+ "unload event listener removed on window close");
+ loader.require("unload").send();
+ test.assertEqual(timesClosed, 1,
+ "window not closed again on module unload.");
+ loader.unload();
+};
+
+exports.testWindowWatcher = function(test) {
+ var myWindow;
+ var finished = false;
+
+ var delegate = {
+ onTrack: function(window) {
+ if (window == myWindow) {
+ test.pass("onTrack() called with our test window");
+ timer.setTimeout(function() { myWindow.close(); }, 1);
+ }
+ },
+ onUntrack: function(window) {
+ if (window == myWindow) {
+ test.pass("onUntrack() called with our test window");
+ timer.setTimeout(function() {
+ if (!finished) {
+ finished = true;
+ myWindow = null;
+ wt.unload();
+ test.done();
+ } else
+ test.fail("finishTest() called multiple times.");
+ }, 1);
+ }
+ }
+ };
+
+ var wt = new windowUtils.WindowTracker(delegate);
+ myWindow = makeEmptyWindow();
+ test.waitUntilDone(5000);
+};
+
+// test that _unregWindow calls _unregLoadingWindow
+exports.testWindowWatcherUnregs4LoadingWindows = function(test) {
+ var myWindow;
+ var finished = false;
+ let browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Ci.nsIWindowMediator)
+ .getMostRecentWindow("navigator:browser");
+ var counter = 0;
+
+ var delegate = {
+ onTrack: function(window) {
+ var type = window.document.documentElement.getAttribute("windowtype");
+ if (type == "test:window")
+ test.fail("onTrack shouldn't have been executed.");
+ }
+ };
+ var wt = new windowUtils.WindowTracker(delegate);
+
+ // make a new window
+ myWindow = makeEmptyWindow();
+
+ // make sure that the window hasn't loaded yet
+ test.assertNotEqual(
+ myWindow.document.readyState,
+ "complete",
+ "window hasn't loaded yet.");
+
+ // unload WindowTracker
+ wt.unload();
+
+ // make sure that the window still hasn't loaded, which means that the onTrack
+ // would have been removed successfully assuming that it doesn't execute.
+ test.assertNotEqual(
+ myWindow.document.readyState,
+ "complete",
+ "window still hasn't loaded yet.");
+
+ // wait for the window to load and then close it. onTrack wouldn't be called
+ // until the window loads, so we must let it load before closing it to be
+ // certain that onTrack was removed.
+ myWindow.addEventListener("load", function() {
+ // allow all of the load handles to execute before closing
+ myWindow.setTimeout(function() {
+ myWindow.addEventListener("unload", function() {
+ // once the window unloads test is done
+ test.done();
+ }, false);
+ myWindow.close();
+ }, 0);
+ }, false);
+
+ test.waitUntilDone(5000);
+}
+
+exports.testWindowWatcherWithoutUntracker = function(test) {
+ var myWindow;
+ var finished = false;
+
+ var delegate = {
+ onTrack: function(window) {
+ if (window == myWindow) {
+ test.pass("onTrack() called with our test window");
+ timer.setTimeout(function() {
+ myWindow.close();
+
+ if (!finished) {
+ finished = true;
+ myWindow = null;
+ wt.unload();
+ test.done();
+ } else {
+ test.fail("onTrack() called multiple times.");
+ }
+ }, 1);
+ }
+ }
+ };
+
+ var wt = new windowUtils.WindowTracker(delegate);
+ myWindow = makeEmptyWindow();
+ test.waitUntilDone(5000);
+};
+
+exports.testActiveWindow = function(test) {
+ test.waitUntilDone(5000);
+
+ let testRunnerWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Ci.nsIWindowMediator)
+ .getMostRecentWindow(null);
+ let browserWindow = Cc["@mozilla.org/appshell/window-mediator;1"]
+ .getService(Ci.nsIWindowMediator)
+ .getMostRecentWindow("navigator:browser");
+
+ test.assertEqual(windowUtils.activeWindow, testRunnerWindow,
+ "Test runner is the active window.");
+
+ test.assertEqual(windowUtils.activeBrowserWindow, browserWindow,
+ "Browser window is the active browser window.");
+
+
+ let testSteps = [
+ function() {
+ windowUtils.activeWindow = browserWindow;
+ continueAfterFocus(browserWindow);
+ },
+ function() {
+ test.assertEqual(windowUtils.activeWindow, browserWindow,
+ "Correct active window [1]");
+ windowUtils.activeWindow = testRunnerWindow;
+ continueAfterFocus(testRunnerWindow);
+ },
+ function() {
+ test.assertEqual(windowUtils.activeWindow, testRunnerWindow,
+ "Correct active window [2]");
+ test.assertEqual(windowUtils.activeBrowserWindow, browserWindow,
+ "Correct active browser window [3]");
+ windowUtils.activeWindow = browserWindow;
+ continueAfterFocus(browserWindow);
+ },
+ function() {
+ test.assertEqual(windowUtils.activeWindow, browserWindow,
+ "Correct active window [4]");
+ windowUtils.activeWindow = testRunnerWindow;
+ continueAfterFocus(testRunnerWindow);
+ },
+ function() {
+ test.assertEqual(windowUtils.activeWindow, testRunnerWindow,
+ "Correct active window [5]");
+ test.assertEqual(windowUtils.activeBrowserWindow, browserWindow,
+ "Correct active browser window [6]");
+ testRunnerWindow = null;
+ browserWindow = null;
+ test.done()
+ }
+ ];
+
+ let nextTest = function() {
+ let func = testSteps.shift();
+ if (func) {
+ func();
+ }
+ }
+
+ 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) {
+ nextTest();
+ } else {
+ childTargetWindow.addEventListener("focus", function focusListener() {
+ childTargetWindow.removeEventListener("focus", focusListener, true);
+ nextTest();
+ }, true);
+ }
+
+ }
+
+ nextTest();
+}