diff options
Diffstat (limited to 'docshell/test/browser/browser_bug422543.js')
-rw-r--r-- | docshell/test/browser/browser_bug422543.js | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/docshell/test/browser/browser_bug422543.js b/docshell/test/browser/browser_bug422543.js new file mode 100644 index 000000000..0655a17b7 --- /dev/null +++ b/docshell/test/browser/browser_bug422543.js @@ -0,0 +1,116 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +add_task(function* runTests() { + yield setup(); + let browser = gBrowser.selectedBrowser; + // Now that we're set up, initialize our frame script. + yield checkListeners("initial", "listeners initialized"); + + // Check if all history listeners are always notified. + info("# part 1"); + yield whenPageShown(browser, () => browser.loadURI("http://www.example.com/")); + yield checkListeners("newentry", "shistory has a new entry"); + ok(browser.canGoBack, "we can go back"); + + yield whenPageShown(browser, () => browser.goBack()); + yield checkListeners("goback", "back to the first shentry"); + ok(browser.canGoForward, "we can go forward"); + + yield whenPageShown(browser, () => browser.goForward()); + yield checkListeners("goforward", "forward to the second shentry"); + + yield whenPageShown(browser, () => browser.reload()); + yield checkListeners("reload", "current shentry reloaded"); + + yield whenPageShown(browser, () => browser.gotoIndex(0)); + yield checkListeners("gotoindex", "back to the first index"); + + // Check nsISHistoryInternal.notifyOnHistoryReload + info("# part 2"); + ok((yield notifyReload()), "reloading has not been canceled"); + yield checkListeners("reload", "saw the reload notification"); + + // Let the first listener cancel the reload action. + info("# part 3"); + yield resetListeners(); + yield setListenerRetval(0, false); + ok(!(yield notifyReload()), "reloading has been canceled"); + yield checkListeners("reload", "saw the reload notification"); + + // Let both listeners cancel the reload action. + info("# part 4"); + yield resetListeners(); + yield setListenerRetval(1, false); + ok(!(yield notifyReload()), "reloading has been canceled"); + yield checkListeners("reload", "saw the reload notification"); + + // Let the second listener cancel the reload action. + info("# part 5"); + yield resetListeners(); + yield setListenerRetval(0, true); + ok(!(yield notifyReload()), "reloading has been canceled"); + yield checkListeners("reload", "saw the reload notification"); +}); + +function listenOnce(message, arg = {}) { + return new Promise(resolve => { + let mm = gBrowser.selectedBrowser.messageManager; + mm.addMessageListener(message + ":return", function listener(msg) { + mm.removeMessageListener(message + ":return", listener); + resolve(msg.data); + }); + + mm.sendAsyncMessage(message, arg); + }); +} + +function checkListeners(aLast, aMessage) { + return listenOnce("bug422543:getListenerStatus").then((listenerStatuses) => { + is(listenerStatuses[0], aLast, aMessage); + is(listenerStatuses[1], aLast, aMessage); + }); +} + +function resetListeners() { + return listenOnce("bug422543:resetListeners"); +} + +function notifyReload() { + return listenOnce("bug422543:notifyReload").then(({ rval }) => { + return rval; + }); +} + +function setListenerRetval(num, val) { + return listenOnce("bug422543:setRetval", { num, val }); +} + +function setup() { + return BrowserTestUtils.openNewForegroundTab(gBrowser, + "http://mochi.test:8888") + .then(function (tab) { + let browser = tab.linkedBrowser; + registerCleanupFunction(function* () { + yield listenOnce("bug422543:cleanup"); + gBrowser.removeTab(tab); + }); + + browser.messageManager + .loadFrameScript(getRootDirectory(gTestPath) + "file_bug422543_script.js", false); + }); +} + +function whenPageShown(aBrowser, aNavigation) { + let listener = ContentTask.spawn(aBrowser, null, function () { + return new Promise(resolve => { + addEventListener("pageshow", function onLoad() { + removeEventListener("pageshow", onLoad, true); + resolve(); + }, true); + }); + }); + + aNavigation(); + return listener; +} |