diff -r 000000000000 -r 6474c204b198 browser/base/content/test/general/browser_homeDrop.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browser/base/content/test/general/browser_homeDrop.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,91 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +function test() { + waitForExplicitFinish(); + + let str = Cc["@mozilla.org/supports-string;1"] + .createInstance(Ci.nsISupportsString); + str.data = "about:mozilla"; + Services.prefs.setComplexValue("browser.startup.homepage", + Ci.nsISupportsString, str); + registerCleanupFunction(() => { + Services.prefs.clearUserPref("browser.startup.homepage"); + }); + + // Open a new tab, since starting a drag from the home button activates it and + // we don't want to interfere with future tests by loading the home page. + let newTab = gBrowser.selectedTab = gBrowser.addTab(); + registerCleanupFunction(function () { + gBrowser.removeTab(newTab); + }); + + let scriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"]. + getService(Ci.mozIJSSubScriptLoader); + let ChromeUtils = {}; + scriptLoader.loadSubScript("chrome://mochikit/content/tests/SimpleTest/ChromeUtils.js", ChromeUtils); + + let homeButton = document.getElementById("home-button"); + ok(homeButton, "home button present"); + + let dialogListener = new WindowListener("chrome://global/content/commonDialog.xul", function (domwindow) { + ok(true, "dialog appeared in response to home button drop"); + domwindow.document.documentElement.cancelDialog(); + Services.wm.removeListener(dialogListener); + + // Now trigger the invalid URI test + executeSoon(function () { + let consoleListener = { + observe: function (m) { + if (m.message.contains("NS_ERROR_DOM_BAD_URI")) { + ok(true, "drop was blocked"); + executeSoon(finish); + } + } + } + Services.console.registerListener(consoleListener); + registerCleanupFunction(function () { + Services.console.unregisterListener(consoleListener); + }); + + executeSoon(function () { + info("Attempting second drop, of a javascript: URI"); + // The drop handler throws an exception when dragging URIs that inherit + // principal, e.g. javascript: + expectUncaughtException(); + ChromeUtils.synthesizeDrop(homeButton, homeButton, [[{type: "text/plain", data: "javascript:8888"}]], "copy", window); + }); + }) + }); + + Services.wm.addListener(dialogListener); + + ChromeUtils.synthesizeDrop(homeButton, homeButton, [[{type: "text/plain", data: "http://mochi.test:8888/"}]], "copy", window); +} + +function WindowListener(aURL, aCallback) { + this.callback = aCallback; + this.url = aURL; +} +WindowListener.prototype = { + onOpenWindow: function(aXULWindow) { + var domwindow = aXULWindow.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindow); + var self = this; + domwindow.addEventListener("load", function() { + domwindow.removeEventListener("load", arguments.callee, false); + + ok(true, "domwindow.document.location.href: " + domwindow.document.location.href); + if (domwindow.document.location.href != self.url) + return; + + // Allow other window load listeners to execute before passing to callback + executeSoon(function() { + self.callback(domwindow); + }); + }, false); + }, + onCloseWindow: function(aXULWindow) {}, + onWindowTitleChange: function(aXULWindow, aNewTitle) {} +} +