Bug 1279635 - Change mozbrowserlocationchange event detail to match Servo. r=smaug draft
authorKan-Ru Chen <kanru@kanru.info>
Fri, 02 Sep 2016 17:20:05 +0800
changeset 409150 1f35b92aa71208d3debfe9308626d5eca8b81147
parent 409041 d5f20820c80514476f596090292a5d77c4b41e3b
child 530283 f48b2d390666bb9050d0e0c3471b61b06cf6c1ac
push id28405
push userbmo:kchen@mozilla.com
push dateFri, 02 Sep 2016 09:20:29 +0000
reviewerssmaug
bugs1279635
milestone51.0a1
Bug 1279635 - Change mozbrowserlocationchange event detail to match Servo. r=smaug MozReview-Commit-ID: 1kCbM5lJ4Sr
dom/browser-element/BrowserElementChildPreload.js
dom/browser-element/mochitest/browserElement_BackForward.js
dom/browser-element/mochitest/browserElement_BrowserWindowNamespace.js
dom/browser-element/mochitest/browserElement_DataURI.js
dom/browser-element/mochitest/browserElement_ExposableURI.js
dom/browser-element/mochitest/browserElement_FirstPaint.js
dom/browser-element/mochitest/browserElement_ForwardName.js
dom/browser-element/mochitest/browserElement_LoadEvents.js
dom/browser-element/mochitest/browserElement_PurgeHistory.js
dom/browser-element/mochitest/browserElement_SendEvent.js
dom/browser-element/mochitest/browserElement_TargetTop.js
--- a/dom/browser-element/BrowserElementChildPreload.js
+++ b/dom/browser-element/BrowserElementChildPreload.js
@@ -1562,17 +1562,21 @@ BrowserElementChild.prototype = {
       if (!this._seenLoadStart) {
         return;
       }
 
       // Remove password and wyciwyg from uri.
       location = Cc["@mozilla.org/docshell/urifixup;1"]
         .getService(Ci.nsIURIFixup).createExposableURI(location);
 
-      sendAsyncMsg('locationchange', { _payload_: location.spec });
+      var webNav = docShell.QueryInterface(Ci.nsIWebNavigation);
+
+      sendAsyncMsg('locationchange', { url: location.spec,
+                                       canGoBack: webNav.canGoBack,
+                                       canGoForward: webNav.canGoForward });
     },
 
     onStateChange: function(webProgress, request, stateFlags, status) {
       if (webProgress != docShell) {
         return;
       }
 
       if (stateFlags & Ci.nsIWebProgressListener.STATE_START) {
--- a/dom/browser-element/mochitest/browserElement_BackForward.js
+++ b/dom/browser-element/mochitest/browserElement_BackForward.js
@@ -65,34 +65,40 @@ function test3() {
 
   SimpleTest.executeSoon(function() {
     iframe.src = browserElementTestHelpers.emptyPage2;
   });
 }
 
 function test4() {
   addOneShotIframeEventListener('mozbrowserlocationchange', function(e) {
-    is(e.detail, browserElementTestHelpers.emptyPage3);
+    is(e.detail.url, browserElementTestHelpers.emptyPage3);
+    is(e.detail.canGoBack, true);
+    is(e.detail.canGoForward, false);
     checkCanGoBackAndForward(true, false, test5);
   });
 
   SimpleTest.executeSoon(function() {
     iframe.src = browserElementTestHelpers.emptyPage3;
   });
 }
 
 function test5() {
   addOneShotIframeEventListener('mozbrowserlocationchange', function(e) {
-    is(e.detail, browserElementTestHelpers.emptyPage2);
+    is(e.detail.url, browserElementTestHelpers.emptyPage2);
+    is(e.detail.canGoBack, true);
+    is(e.detail.canGoForward, true);
     checkCanGoBackAndForward(true, true, test6);
   });
   iframe.goBack();
 }
 
 function test6() {
   addOneShotIframeEventListener('mozbrowserlocationchange', function(e) {
-    is(e.detail, browserElementTestHelpers.emptyPage1);
+    is(e.detail.url, browserElementTestHelpers.emptyPage1);
+    is(e.detail.canGoBack, false);
+    is(e.detail.canGoForward, true);
     checkCanGoBackAndForward(false, true, SimpleTest.finish);
   });
   iframe.goBack();
 }
 
 addEventListener('testready', runTest);
--- a/dom/browser-element/mochitest/browserElement_BrowserWindowNamespace.js
+++ b/dom/browser-element/mochitest/browserElement_BrowserWindowNamespace.js
@@ -19,22 +19,22 @@ function runTest() {
   // window.open("foo", "bar") call.  We should only get one
   // mozbrowseropenwindow event.
 
   iframe1.addEventListener('mozbrowseropenwindow', function(e) {
     ok(true, "Got first mozbrowseropenwindow event.");
     document.body.appendChild(e.detail.frameElement);
 
     e.detail.frameElement.addEventListener('mozbrowserlocationchange', function(e) {
-      if (e.detail == "http://example.com/#2") {
+      if (e.detail.url == "http://example.com/#2") {
         ok(true, "Got locationchange to http://example.com/#2");
         SimpleTest.finish();
       }
       else {
-        ok(true, "Got locationchange to " + e.detail);
+        ok(true, "Got locationchange to " + e.detail.url);
       }
     });
 
     SimpleTest.executeSoon(function() {
       var iframe2 = document.createElement('iframe');
       iframe2.setAttribute('mozbrowser', 'true');
 
       iframe2.addEventListener('mozbrowseropenwindow', function(e) {
--- a/dom/browser-element/mochitest/browserElement_DataURI.js
+++ b/dom/browser-element/mochitest/browserElement_DataURI.js
@@ -31,17 +31,17 @@ function runTest2() {
 
   var sawLoadEnd = false;
   var sawLocationChange = false;
 
   iframe1.addEventListener('mozbrowserlocationchange', function(e) {
     ok(e.isTrusted, 'Event should be trusted.');
     ok(!sawLocationChange, 'Just one locationchange event.');
     ok(!sawLoadEnd, 'locationchange before load.');
-    is(e.detail, 'data:text/html,1', "event's reported location");
+    is(e.detail.url, 'data:text/html,1', "event's reported location");
     sawLocationChange = true;
   });
 
   iframe1.addEventListener('mozbrowserloadend', function() {
     ok(sawLocationChange, 'Loadend after locationchange.');
     ok(!sawLoadEnd, 'Just one loadend event.');
     sawLoadEnd = true;
   });
--- a/dom/browser-element/mochitest/browserElement_ExposableURI.js
+++ b/dom/browser-element/mochitest/browserElement_ExposableURI.js
@@ -8,17 +8,17 @@
 SimpleTest.waitForExplicitFinish();
 browserElementTestHelpers.setEnabledPref(true);
 browserElementTestHelpers.addPermission();
 
 var iframe;
 
 function testPassword() {
   function locationchange(e) {
-    var uri = e.detail;
+    var uri = e.detail.url;
     is(uri, 'http://mochi.test:8888/tests/dom/browser-element/mochitest/file_empty.html',
        "Username and password shouldn't be exposed in uri.");
     SimpleTest.finish();
   }
 
   iframe.addEventListener('mozbrowserlocationchange', locationchange);
   iframe.src = "http://iamuser:iampassword@mochi.test:8888/tests/dom/browser-element/mochitest/file_empty.html";
 }
@@ -28,17 +28,17 @@ function testWyciwyg() {
 
   function locationchange(e) {
     // locationChangeCount:
     //  0 - the first load.
     //  1 - after document.write().
     if (locationChangeCount == 0) {
       locationChangeCount ++;
     } else if (locationChangeCount == 1) {
-      var uri = e.detail;
+      var uri = e.detail.url;
       is(uri, 'http://mochi.test:8888/tests/dom/browser-element/mochitest/file_wyciwyg.html', "Scheme in string shouldn't be wyciwyg");
       iframe.removeEventListener('mozbrowserlocationchange', locationchange);
       SimpleTest.executeSoon(testPassword);
     }
   }
 
   // file_wyciwyg.html calls document.write() to create a wyciwyg channel.
   iframe.src = 'file_wyciwyg.html';
--- a/dom/browser-element/mochitest/browserElement_FirstPaint.js
+++ b/dom/browser-element/mochitest/browserElement_FirstPaint.js
@@ -19,23 +19,23 @@ function runTest() {
     gotFirstPaint = true;
 
     if (gotFirstLocationChange) {
       iframe.src = browserElementTestHelpers.emptyPage1 + '?2';
     }
   });
 
   iframe.addEventListener('mozbrowserlocationchange', function(e) {
-    if (e.detail == browserElementTestHelpers.emptyPage1) {
+    if (e.detail.url == browserElementTestHelpers.emptyPage1) {
       gotFirstLocationChange = true;
       if (gotFirstPaint) {
         iframe.src = browserElementTestHelpers.emptyPage1 + '?2';
       }
     }
-    else if (e.detail.endsWith('?2')) {
+    else if (e.detail.url.endsWith('?2')) {
       SimpleTest.finish();
     }
   });
 
   document.body.appendChild(iframe);
 
   iframe.src = browserElementTestHelpers.emptyPage1;
 }
--- a/dom/browser-element/mochitest/browserElement_ForwardName.js
+++ b/dom/browser-element/mochitest/browserElement_ForwardName.js
@@ -15,18 +15,18 @@ function runTest() {
   iframe.setAttribute('mozbrowser', 'true');
   iframe.setAttribute('name', 'foo');
 
   iframe.addEventListener("mozbrowseropenwindow", function(e) {
     ok(false, 'Got mozbrowseropenwindow, but should not have.');
   });
 
   iframe.addEventListener('mozbrowserlocationchange', function(e) {
-    ok(true, "Got locationchange to " + e.detail);
-    if (e.detail.endsWith("ForwardName.html#finish")) {
+    ok(true, "Got locationchange to " + e.detail.url);
+    if (e.detail.url.endsWith("ForwardName.html#finish")) {
       SimpleTest.finish();
     }
   });
 
   // The file sends us messages via alert() that start with "success:" or
   // "failure:".
   iframe.addEventListener('mozbrowsershowmodalprompt', function(e) {
     ok(e.detail.message.startsWith('success:'), e.detail.message);
--- a/dom/browser-element/mochitest/browserElement_LoadEvents.js
+++ b/dom/browser-element/mochitest/browserElement_LoadEvents.js
@@ -33,17 +33,17 @@ function runTest() {
   }
 
   function locationchange(e) {
     ok(e.isTrusted, 'Event should be trusted.');
     ok(!seenLocationChange, 'Just one locationchange event.');
     seenLocationChange = true;
     ok(seenLoadStart, 'Location change after load start.');
     ok(!seenLoadEnd, 'Location change before load end.');
-    ok(e.detail, browserElementTestHelpers.emptyPage1, "event's reported location");
+    ok(e.detail.url, browserElementTestHelpers.emptyPage1, "event's reported location");
   }
 
   function loadend(e) {
     ok(e.isTrusted, 'Event should be trusted.');
     ok(seenLoadStart, 'loadend after loadstart.');
     ok(!seenLoadEnd, 'Just one loadend event.');
     ok(seenLocationChange, 'loadend after locationchange.');
     is(e.detail.backgroundColor, 'rgb(0, 128, 0)', 'Expected background color reported')
@@ -86,17 +86,17 @@ function runTest2() {
 
   var iframe = document.getElementById('iframe');
   iframe.addEventListener('mozbrowserlocationchange', function(e) {
     ok(e.isTrusted, 'Event should be trusted.');
     ok(!seenLocationChange, 'Just one locationchange event.');
     seenLocationChange = true;
     ok(seenLoadStart, 'Location change after load start.');
     ok(!seenLoadEnd, 'Location change before load end.');
-    ok(e.detail, browserElementTestHelpers.emptyPage2, "event's reported location");
+    ok(e.detail.url, browserElementTestHelpers.emptyPage2, "event's reported location");
   });
 
   iframe.addEventListener('mozbrowserloadend', function(e) {
     ok(e.isTrusted, 'Event should be trusted.');
     ok(!seenLoadEnd, 'Just one load end event.');
     seenLoadEnd = true;
     ok(seenLoadStart, 'Load end after load start.');
     ok(seenLocationChange, 'Load end after location change.');
--- a/dom/browser-element/mochitest/browserElement_PurgeHistory.js
+++ b/dom/browser-element/mochitest/browserElement_PurgeHistory.js
@@ -70,17 +70,17 @@ function test3() {
 
   SimpleTest.executeSoon(function() {
     iframe.src = browserElementTestHelpers.emptyPage2;
   });
 }
 
 function test4() {
   addOneShotIframeEventListener('mozbrowserlocationchange', function(e) {
-    is(e.detail, browserElementTestHelpers.emptyPage3);
+    is(e.detail.url, browserElementTestHelpers.emptyPage3);
     purgeHistory(SimpleTest.finish);
   });
 
   SimpleTest.executeSoon(function() {
     iframe.src = browserElementTestHelpers.emptyPage3;
   });
 }
 
--- a/dom/browser-element/mochitest/browserElement_SendEvent.js
+++ b/dom/browser-element/mochitest/browserElement_SendEvent.js
@@ -30,17 +30,17 @@ function runTest() {
   }
 
   iframe.addEventListener("mozbrowserloadend", function onloadend(e) {
     iframe.sendMouseEvent("mousedown", x, y, 0, 1, 0);
   });
 
   iframe.addEventListener("mozbrowserlocationchange", function onlocchange(e) {
     var a = document.createElement("a");
-    a.href = e.detail;
+    a.href = e.detail.url;
 
     switch (a.hash) {
       case "#mousedown":
         ok(true, "Receive a mousedown event.");
         iframe.sendMouseEvent("mousemove", x, y, 0, 0, 0);
         break;
       case "#mousemove":
         ok(true, "Receive a mousemove event.");
--- a/dom/browser-element/mochitest/browserElement_TargetTop.js
+++ b/dom/browser-element/mochitest/browserElement_TargetTop.js
@@ -13,17 +13,17 @@ function runTest() {
   var iframe = document.createElement('iframe');
   iframe.setAttribute('mozbrowser', 'true');
 
   iframe.addEventListener('mozbrowseropenwindow', function(e) {
     ok(false, 'Not expecting an openwindow event.');
   });
 
   iframe.addEventListener('mozbrowserlocationchange', function(e) {
-    if (/file_browserElement_TargetTop.html\?2$/.test(e.detail)) {
+    if (/file_browserElement_TargetTop.html\?2$/.test(e.detail.url)) {
       ok(true, 'Got the locationchange we were looking for.');
       SimpleTest.finish();
     }
   });
 
   document.body.appendChild(iframe);
   iframe.src = 'file_browserElement_TargetTop.html';
 }