Bug 1320502 - fix paste (and go) issues regressed in
bug 1229426, r=mak
MozReview-Commit-ID: Lm6J4Xfik5t
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -5626,17 +5626,22 @@ function middleMousePaste(event) {
});
event.stopPropagation();
}
function stripUnsafeProtocolOnPaste(pasteData) {
// Don't allow pasting javascript URIs since we don't support
// LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL for those.
- return pasteData.replace(/\r?\n/g, "").replace(/^(?:\s*javascript:)+/i, "");
+ let changed = false;
+ let pasteDataNoJS = pasteData.replace(/\r?\n/g, "")
+ .replace(/^(?:\s*javascript:)+/i,
+ () => { changed = true;
+ return ""; });
+ return changed ? pasteDataNoJS : pasteData;
}
// handleDroppedLink has the following 2 overloads:
// handleDroppedLink(event, url, name)
// handleDroppedLink(event, links)
function handleDroppedLink(event, urlOrLinks, name)
{
let links;
--- a/browser/base/content/test/urlbar/browser.ini
+++ b/browser/base/content/test/urlbar/browser.ini
@@ -33,16 +33,18 @@ subsuite = clipboard
support-files =
redirect_bug623155.sjs
[browser_bug783614.js]
[browser_canonizeURL.js]
[browser_locationBarCommand.js]
skip-if = true # bug 917535, bug 1289765
[browser_locationBarExternalLoad.js]
[browser_moz_action_link.js]
+[browser_pasteAndGo.js]
+subsuite = clipboard
[browser_removeUnsafeProtocolsFromURLBarPaste.js]
subsuite = clipboard
[browser_search_favicon.js]
[browser_tabMatchesInAwesomebar.js]
support-files =
moz.png
[browser_tabMatchesInAwesomebar_perwindowpb.js]
skip-if = os == 'linux' # Bug 1104755
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/urlbar/browser_pasteAndGo.js
@@ -0,0 +1,38 @@
+"use strict";
+
+let clipboardHelper = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(Ci.nsIClipboardHelper);
+
+add_task(function*() {
+ const kURLs = [
+ "http://example.com/1",
+ "http://example.org/2\n",
+ "http://\nexample.com/3\n",
+ ];
+ for (let url of kURLs) {
+ yield BrowserTestUtils.withNewTab("about:blank", function* (browser) {
+ gURLBar.focus();
+ yield new Promise((resolve, reject) => {
+ waitForClipboard(url, function() {
+ clipboardHelper.copyString(url);
+ }, resolve,
+ () => reject(new Error(`Failed to copy string '${url}' to clipboard`))
+ );
+ });
+ let textBox = document.getAnonymousElementByAttribute(gURLBar,
+ "anonid", "textbox-input-box");
+ let cxmenu = document.getAnonymousElementByAttribute(textBox,
+ "anonid", "input-box-contextmenu");
+ let cxmenuPromise = BrowserTestUtils.waitForEvent(cxmenu, "popupshown");
+ EventUtils.synthesizeMouseAtCenter(gURLBar, {type: "contextmenu", button: 2});
+ yield cxmenuPromise;
+ let menuitem = document.getAnonymousElementByAttribute(textBox,
+ "anonid", "paste-and-go");
+ let browserLoadedPromise = BrowserTestUtils.browserLoaded(browser, url.replace(/\n/g, ""));
+ EventUtils.synthesizeMouseAtCenter(menuitem, {});
+ // Using toSource in order to get the newlines escaped:
+ info("Paste and go, loading " + url.toSource());
+ yield browserLoadedPromise;
+ ok(true, "Successfully loaded " + url);
+ });
+ }
+});
--- a/browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
+++ b/browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
@@ -2,16 +2,19 @@ function test() {
waitForExplicitFinish();
testNext();
}
var pairs = [
["javascript:", ""],
["javascript:1+1", "1+1"],
["javascript:document.domain", "document.domain"],
+ ["java\nscript:foo", "foo"],
+ ["http://\nexample.com", "http://example.com"],
+ ["http://\nexample.com\n", "http://example.com"],
["data:text/html,<body>hi</body>", "data:text/html,<body>hi</body>"],
// Nested things get confusing because some things don't parse as URIs:
["javascript:javascript:alert('hi!')", "alert('hi!')"],
["data:data:text/html,<body>hi</body>", "data:data:text/html,<body>hi</body>"],
["javascript:data:javascript:alert('hi!')", "data:javascript:alert('hi!')"],
["javascript:data:text/html,javascript:alert('hi!')", "data:text/html,javascript:alert('hi!')"],
["data:data:text/html,javascript:alert('hi!')", "data:data:text/html,javascript:alert('hi!')"],
];