diff options
Diffstat (limited to 'packages/vold-utils/tests/test-unload+.js')
-rw-r--r-- | packages/vold-utils/tests/test-unload+.js | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/packages/vold-utils/tests/test-unload+.js b/packages/vold-utils/tests/test-unload+.js new file mode 100644 index 0000000..92f3e0c --- /dev/null +++ b/packages/vold-utils/tests/test-unload+.js @@ -0,0 +1,119 @@ +/* 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 timer = require("timer"); +var {Cc,Ci} = require("chrome"); +const windowUtils = require("window-utils"); +const { Loader } = require('test-harness/loader'); + +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 + '">' + + '</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.testUnloading = function(test) { + var loader = Loader(module); + var {unload} = loader.require("unload+"); + var unloadCalled = 0; + + function unloader() { + unloadCalled++; + throw "error"; + } + unload(unloader); + + function unloader2() unloadCalled++; + var removeUnloader2 = unload(unloader2); + + function unloader3() unloadCalled++; + unload(unloader3); + + // remove unloader2 + removeUnloader2(); + + loader.unload(); + test.assertEqual( + unloadCalled, 2, "Unloader functions are called on unload."); +}; + +exports.testUnloadingWindow = function(test) { + test.waitUntilDone(); + + var loader = Loader(module); + var {unload} = loader.require("unload+"); + var unloadCalled = 0; + var finished = false; + var myWindow; + + var delegate = { + onTrack: function(window) { + if (window == myWindow) { + test.pass("onTrack() called with our test window"); + + let unloader = function unloader() { + unloadCalled++; + } + unload(unloader, window); + unload(unloader); + + timer.setTimeout(function() { + window.close(); + + test.assertEqual( + unloadCalled, 0, "no unloaders called."); + + if (window.closed) { + test.pass("window closed"); + } else { + test.fail("window is not closed!"); + } + + timer.setTimeout(function() { + test.assertEqual( + unloadCalled, 0, "zero unloaders called."); + + loader.unload(); + + test.assertEqual( + unloadCalled, 1, "one unloaders called."); + + if (finished) { + test.pass("finished"); + test.done(); + } else { + test.fail("not finished!"); + } + }, 1); + }, 1); + } + }, + onUntrack: function(window) { + if (window == myWindow) { + test.pass("onUntrack() called with our test window"); + + if (!finished) { + finished = true; + myWindow = null; + wt.unload(); + } else { + test.fail("finishTest() called multiple times."); + } + } + } + }; + + var wt = new windowUtils.WindowTracker(delegate); + myWindow = makeEmptyWindow(); +}; |