Bug 1472491: Part 5η - Add BrowserChild actor. r?florian f=mconley draft
authorKris Maglione <maglione.k@gmail.com>
Mon, 30 Jul 2018 10:52:55 -0700
changeset 828468 479e16c7937b939a06dd6480bc29e2cfd39ab151
parent 828467 8da00377bc409ba83d5e6ccf05d825c6c4be7d24
child 828469 3a9a3aa60db74cf9f5aea93e6e93da0f82deadf8
push id118680
push usermaglione.k@gmail.com
push dateFri, 10 Aug 2018 23:04:22 +0000
reviewersflorian
bugs1472491
milestone63.0a1
Bug 1472491: Part 5η - Add BrowserChild actor. r?florian f=mconley MozReview-Commit-ID: D1d4hFGNKXj
browser/base/content/test/performance/browser_startup_content.js
toolkit/actors/BrowserChild.jsm
toolkit/actors/moz.build
toolkit/content/browser-child.js
toolkit/modules/ActorManagerParent.jsm
--- a/browser/base/content/test/performance/browser_startup_content.js
+++ b/browser/base/content/test/performance/browser_startup_content.js
@@ -50,17 +50,16 @@ const whitelist = {
     // Browser front-end
     "resource:///modules/AboutReaderChild.jsm",
     "resource:///modules/BrowserTabChild.jsm",
     "resource:///modules/ContentLinkHandler.jsm",
     "resource:///modules/ContentMetaHandler.jsm",
     "resource:///modules/PageStyleChild.jsm",
     "resource://gre/modules/ActorChild.jsm",
     "resource://gre/modules/ActorManagerChild.jsm",
-    "resource://gre/modules/BrowserUtils.jsm",
     "resource://gre/modules/E10SUtils.jsm",
     "resource://gre/modules/PrivateBrowsingUtils.jsm",
     "resource://gre/modules/ReaderMode.jsm",
     "resource://gre/modules/WebProgressChild.jsm",
     "resource://gre/modules/WebNavigationChild.jsm",
     "resource://gre/modules/ZoomChild.jsm",
 
     // Pocket
new file mode 100644
--- /dev/null
+++ b/toolkit/actors/BrowserChild.jsm
@@ -0,0 +1,49 @@
+/* vim: set ts=2 sw=2 sts=2 et tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+"use strict";
+
+var EXPORTED_SYMBOLS = ["BrowserChild"];
+
+ChromeUtils.import("resource://gre/modules/ActorChild.jsm");
+
+ChromeUtils.defineModuleGetter(this, "BrowserUtils",
+                               "resource://gre/modules/BrowserUtils.jsm");
+
+class BrowserChild extends ActorChild {
+  handleEvent(event) {
+    if (event.type == "DOMWindowClose") {
+      this.mm.sendAsyncMessage("DOMWindowClose");
+    }
+  }
+
+  receiveMessage(message) {
+    switch (message.name) {
+    case "Browser:CreateAboutBlank":
+      if (!this.content.document || this.content.document.documentURI != "about:blank") {
+        throw new Error("Can't create a content viewer unless on about:blank");
+      }
+      let principal = message.data;
+      principal = BrowserUtils.principalWithMatchingOA(principal, this.content.document.nodePrincipal);
+      this.mm.docShell.createAboutBlankContentViewer(principal);
+      break;
+
+    case "InPermitUnload":
+      let inPermitUnload = this.mm.docShell.contentViewer && this.mm.docShell.contentViewer.inPermitUnload;
+      this.mm.sendAsyncMessage("InPermitUnload", {id: message.data.id, inPermitUnload});
+      break;
+
+    case "PermitUnload":
+      this.mm.sendAsyncMessage("PermitUnload", {id: message.data.id, kind: "start"});
+
+      let permitUnload = true;
+      if (this.mm.docShell && this.mm.docShell.contentViewer) {
+        permitUnload = this.mm.docShell.contentViewer.permitUnload(message.data.aPermitUnloadFlags);
+      }
+
+      this.mm.sendAsyncMessage("PermitUnload", {id: message.data.id, kind: "end", permitUnload});
+      break;
+    }
+  }
+}
--- a/toolkit/actors/moz.build
+++ b/toolkit/actors/moz.build
@@ -1,16 +1,17 @@
 # -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 FINAL_TARGET_FILES.actors += [
     'AudioPlaybackChild.jsm',
+    'BrowserChild.jsm',
     'ControllersChild.jsm',
     'DateTimePickerChild.jsm',
     'ExtFindChild.jsm',
     'FindBarChild.jsm',
     'PopupBlockingChild.jsm',
     'PrintingChild.jsm',
     'PurgeSessionHistoryChild.jsm',
     'SelectChild.jsm',
--- a/toolkit/content/browser-child.js
+++ b/toolkit/content/browser-child.js
@@ -1,69 +1,34 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 /* eslint-env mozilla/frame-script */
 
-ChromeUtils.import("resource://gre/modules/BrowserUtils.jsm");
 ChromeUtils.import("resource://gre/modules/Services.jsm");
 ChromeUtils.import("resource://gre/modules/Timer.jsm");
 ChromeUtils.import("resource://gre/modules/WebNavigationChild.jsm");
 ChromeUtils.import("resource://gre/modules/WebProgressChild.jsm");
 
 this.WebProgress = new WebProgressChild(this);
 this.WebNavigation = new WebNavigationChild(this);
 
 addEventListener("DOMTitleChanged", function(aEvent) {
   if (!aEvent.isTrusted || aEvent.target.defaultView != content)
     return;
   sendAsyncMessage("DOMTitleChanged", { title: content.document.title });
 }, false);
 
-addEventListener("DOMWindowClose", function(aEvent) {
-  if (!aEvent.isTrusted)
-    return;
-  sendAsyncMessage("DOMWindowClose");
-}, false);
-
 addEventListener("ImageContentLoaded", function(aEvent) {
   if (content.document instanceof Ci.nsIImageDocument) {
     let req = content.document.imageRequest;
     if (!req.image)
       return;
     sendAsyncMessage("ImageDocumentLoaded", { width: req.image.width,
                                               height: req.image.height });
   }
 }, false);
 
-/**
- * Remote createAboutBlankContentViewer request handler.
- */
-addMessageListener("Browser:CreateAboutBlank", function(aMessage) {
-  if (!content.document || content.document.documentURI != "about:blank") {
-    throw new Error("Can't create a content viewer unless on about:blank");
-  }
-  let principal = aMessage.data;
-  principal = BrowserUtils.principalWithMatchingOA(principal, content.document.nodePrincipal);
-  docShell.createAboutBlankContentViewer(principal);
-});
-
-addMessageListener("InPermitUnload", msg => {
-  let inPermitUnload = docShell.contentViewer && docShell.contentViewer.inPermitUnload;
-  sendAsyncMessage("InPermitUnload", {id: msg.data.id, inPermitUnload});
-});
-
-addMessageListener("PermitUnload", msg => {
-  sendAsyncMessage("PermitUnload", {id: msg.data.id, kind: "start"});
-
-  let permitUnload = true;
-  if (docShell && docShell.contentViewer) {
-    permitUnload = docShell.contentViewer.permitUnload(msg.data.aPermitUnloadFlags);
-  }
-
-  sendAsyncMessage("PermitUnload", {id: msg.data.id, kind: "end", permitUnload});
-});
-
 // We may not get any responses to Browser:Init if the browser element
 // is torn down too quickly.
 var outerWindowID = content.windowUtils.outerWindowID;
 sendAsyncMessage("Browser:Init", {outerWindowID});
--- a/toolkit/modules/ActorManagerParent.jsm
+++ b/toolkit/modules/ActorManagerParent.jsm
@@ -106,16 +106,31 @@ let ACTORS = {
         "AudioPlayback",
       ],
       observers: [
         "audio-playback",
       ],
     },
   },
 
+  Browser: {
+    child: {
+      module: "resource://gre/actors/BrowserChild.jsm",
+      events: {
+        "DOMWindowClose": {},
+      },
+
+      messages: [
+        "Browser:CreateAboutBlank",
+        "InPermitUnload",
+        "PermitUnload",
+      ],
+    },
+  },
+
   Controllers: {
     child: {
       module: "resource://gre/actors/ControllersChild.jsm",
       messages: [
         "ControllerCommands:Do",
         "ControllerCommands:DoWithParams",
       ],
     },