Bug 1320502 - fix paste (and go) issues regressed in bug 1229426, r=mak draft
authorGijs Kruitbosch <gijskruitbosch@gmail.com>
Mon, 28 Nov 2016 14:59:02 +0000
changeset 445323 3c32f78781495d2fff3a1e663653a25a5f3f0bf9
parent 444478 05328d3102efd4d5fc0696489734d7771d24459f
child 538491 26302d446bf84b92fa90c2a49d7e50d1f1e8a348
push id37482
push userbmo:gijskruitbosch+bugs@gmail.com
push dateTue, 29 Nov 2016 12:39:00 +0000
reviewersmak
bugs1320502, 1229426
milestone53.0a1
Bug 1320502 - fix paste (and go) issues regressed in bug 1229426, r=mak MozReview-Commit-ID: Lm6J4Xfik5t
browser/base/content/browser.js
browser/base/content/test/urlbar/browser.ini
browser/base/content/test/urlbar/browser_pasteAndGo.js
browser/base/content/test/urlbar/browser_removeUnsafeProtocolsFromURLBarPaste.js
--- 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!')"],
 ];