diff -r 000000000000 -r 6474c204b198 browser/base/content/test/general/browser_bug676619.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/base/content/test/general/browser_bug676619.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,121 @@ +function test () { + waitForExplicitFinish(); + + var isHTTPS = false; + + gBrowser.selectedTab = gBrowser.addTab(); + gBrowser.selectedBrowser.addEventListener("load", function () { + if (isHTTPS) { + gBrowser.selectedBrowser.removeEventListener("load", arguments.callee, true); + } + let doc = gBrowser.contentDocument; + + + function testLocation(link, url, next) { + var tabOpenListener = new TabOpenListener(url, function () { + gBrowser.removeTab(this.tab); + }, function () { + next(); + }); + + doc.getElementById(link).click(); + } + + function testLink(link, name, next) { + addWindowListener("chrome://mozapps/content/downloads/unknownContentType.xul", function (win) { + is(doc.getElementById("unload-flag").textContent, "Okay", "beforeunload shouldn't have fired"); + is(win.document.getElementById("location").value, name, "file name should match"); + win.close(); + next(); + }); + + doc.getElementById(link).click(); + } + + testLink("link1", "test.txt", + testLink.bind(null, "link2", "video.ogg", + testLink.bind(null, "link3", "just some video", + testLink.bind(null, "link4", "with-target.txt", + testLink.bind(null, "link5", "javascript.txt", + testLink.bind(null, "link6", "test.blob", + testLocation.bind(null, "link7", "http://example.com/", + function () { + if (isHTTPS) { + gBrowser.removeCurrentTab(); + finish(); + } else { + // same test again with https: + isHTTPS = true; + content.location = "https://example.com:443/browser/browser/base/content/test/general/download_page.html"; + } + }))))))); + + }, true); + + content.location = "http://mochi.test:8888/browser/browser/base/content/test/general/download_page.html"; +} + + +function addWindowListener(aURL, aCallback) { + Services.wm.addListener({ + onOpenWindow: function(aXULWindow) { + info("window opened, waiting for focus"); + Services.wm.removeListener(this); + + var domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindow); + waitForFocus(function() { + is(domwindow.document.location.href, aURL, "should have seen the right window open"); + aCallback(domwindow); + }, domwindow); + }, + onCloseWindow: function(aXULWindow) { }, + onWindowTitleChange: function(aXULWindow, aNewTitle) { } + }); +} + +// This listens for the next opened tab and checks it is of the right url. +// opencallback is called when the new tab is fully loaded +// closecallback is called when the tab is closed +function TabOpenListener(url, opencallback, closecallback) { + this.url = url; + this.opencallback = opencallback; + this.closecallback = closecallback; + + gBrowser.tabContainer.addEventListener("TabOpen", this, false); +} + +TabOpenListener.prototype = { + url: null, + opencallback: null, + closecallback: null, + tab: null, + browser: null, + + handleEvent: function(event) { + if (event.type == "TabOpen") { + gBrowser.tabContainer.removeEventListener("TabOpen", this, false); + this.tab = event.originalTarget; + this.browser = this.tab.linkedBrowser; + gBrowser.addEventListener("pageshow", this, false); + } else if (event.type == "pageshow") { + if (event.target.location.href != this.url) + return; + gBrowser.removeEventListener("pageshow", this, false); + this.tab.addEventListener("TabClose", this, false); + var url = this.browser.contentDocument.location.href; + is(url, this.url, "Should have opened the correct tab"); + this.opencallback(this.tab, this.browser.contentWindow); + } else if (event.type == "TabClose") { + if (event.originalTarget != this.tab) + return; + this.tab.removeEventListener("TabClose", this, false); + this.opencallback = null; + this.tab = null; + this.browser = null; + // Let the window close complete + executeSoon(this.closecallback); + this.closecallback = null; + } + } +};