Bug 1336763 - Update browser_beforeunload_between_chrome_content.js to use ContentTask. r?jessica draft
authorMike Conley <mconley@mozilla.com>
Thu, 27 Apr 2017 12:46:59 -0400
changeset 570385 7e5b695fbd4578d3a74888ac121c63d8841cf58b
parent 570384 830afcae08b9cc5efc7364b073664e716ea342b0
child 570386 774f46bc9638562c49c7226c075c68109b1b2c27
push id56469
push usermconley@mozilla.com
push dateFri, 28 Apr 2017 19:52:42 +0000
reviewersjessica
bugs1336763
milestone55.0a1
Bug 1336763 - Update browser_beforeunload_between_chrome_content.js to use ContentTask. r?jessica By using ContentTask, we get a Promise that resolves once we've heard confirmation from the content process that the ContentTask function has completed running. This means we can be certain that browser_beforeunload_between_chrome_content.js has had the beforeunload event handlers added before attempting to unload the page. MozReview-Commit-ID: DhoTsOZ4BNk
dom/tests/browser/browser_beforeunload_between_chrome_content.js
--- a/dom/tests/browser/browser_beforeunload_between_chrome_content.js
+++ b/dom/tests/browser/browser_beforeunload_between_chrome_content.js
@@ -3,23 +3,25 @@ const TEST_URL = "http://www.example.com
 function pageScript() {
   window.addEventListener("beforeunload", function (event) {
     var str = "Leaving?";
     event.returnValue = str;
     return str;
   }, true);
 }
 
-function frameScript() {
-  content.window.addEventListener("beforeunload", function (event) {
-    sendAsyncMessage("Test:OnBeforeUnloadReceived");
-    var str = "Leaving?";
-    event.returnValue = str;
-    return str;
-  }, true);
+function injectBeforeUnload(browser) {
+  return ContentTask.spawn(browser, null, function*() {
+    content.window.addEventListener("beforeunload", function (event) {
+      sendAsyncMessage("Test:OnBeforeUnloadReceived");
+      var str = "Leaving?";
+      event.returnValue = str;
+      return str;
+    }, true);
+  });
 }
 
 // Wait for onbeforeunload dialog, and dismiss it immediately.
 function awaitAndCloseBeforeUnloadDialog(doStayOnPage) {
   return new Promise(resolve => {
     function onDialogShown(node) {
       Services.obs.removeObserver(onDialogShown, "tabmodal-dialog-loaded");
       let button = doStayOnPage ? node.ui.button1 : node.ui.button0;
@@ -44,35 +46,34 @@ add_task(function* () {
     beforeUnloadCount++;
   });
 
   // Open a content page.
   let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, TEST_URL);
   let browser = tab.linkedBrowser;
 
   ok(browser.isRemoteBrowser, "Browser should be remote.");
-  browser.messageManager.loadFrameScript(
-    "data:,(" + frameScript.toString() + ")();", true);
 
+  yield injectBeforeUnload(browser);
   // Navigate to a chrome page.
   let dialogShown1 = awaitAndCloseBeforeUnloadDialog(false);
   yield BrowserTestUtils.loadURI(browser, "about:support");
   yield Promise.all([
     dialogShown1,
     BrowserTestUtils.browserLoaded(browser)
   ]);
+
   is(beforeUnloadCount, 1, "Should have received one beforeunload event.");
   ok(!browser.isRemoteBrowser, "Browser should not be remote.");
 
   // Go back to content page.
   ok(gBrowser.webNavigation.canGoBack, "Should be able to go back.");
   gBrowser.goBack();
   yield BrowserTestUtils.browserLoaded(browser);
-  browser.messageManager.loadFrameScript(
-    "data:,(" + frameScript.toString() + ")();", true);
+  yield injectBeforeUnload(browser);
 
   // Test that going forward triggers beforeunload prompt as well.
   ok(gBrowser.webNavigation.canGoForward, "Should be able to go forward.");
   let dialogShown2 = awaitAndCloseBeforeUnloadDialog(false);
   gBrowser.goForward();
   yield Promise.all([
     dialogShown2,
     BrowserTestUtils.browserLoaded(browser)