Bug 1235123 - Part 2 - Update architecture of shell_remote.js to align shell.js, r=schien
authorKuoE0 <kuoe0.tw@gmail.com>
Thu, 28 Apr 2016 15:18:13 +0800
changeset 295238 2389fb0248dbb8184edfef0e06add6fe76bdaba2
parent 295237 e3245a8dfacdefc22a21261c32e5129afc725dfb
child 295239 50ec1d8e55046a5f474afe76b2ebc47c58c9687e
push id30220
push usercbook@mozilla.com
push dateThu, 28 Apr 2016 14:31:09 +0000
treeherdermozilla-central@4292da9df16b [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersschien
bugs1235123
milestone49.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1235123 - Part 2 - Update architecture of shell_remote.js to align shell.js, r=schien
b2g/chrome/content/shell_remote.js
--- a/b2g/chrome/content/shell_remote.js
+++ b/b2g/chrome/content/shell_remote.js
@@ -1,71 +1,139 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- /
 /* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */
 /* 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 {utils: Cu} = Components;
+var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
 
 Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/SystemAppProxy.jsm");
 
 function debug(aStr) {
   // dump(" -*- ShellRemote.js: " + aStr + "\n");
 }
 
 var remoteShell = {
 
+  _started: false,
+
   get homeURL() {
     let systemAppManifestURL = Services.io.newURI(this.systemAppManifestURL, null, null);
     let shellRemoteURL = Services.prefs.getCharPref("b2g.multiscreen.system_remote_url");
     shellRemoteURL = Services.io.newURI(shellRemoteURL, null, systemAppManifestURL);
     return shellRemoteURL.spec;
   },
 
   get systemAppManifestURL() {
     return Services.prefs.getCharPref("b2g.system_manifest_url");
   },
 
-  _started: false,
-
   hasStarted: function () {
     return this._started;
   },
 
   start: function () {
     this._started = true;
+    this._isEventListenerReady = false;
+    this.id = window.location.hash.substring(1);
 
     let homeURL = this.homeURL;
     if (!homeURL) {
       debug("ERROR! Remote home URL undefined.");
       return;
     }
     let manifestURL = this.systemAppManifestURL;
-    // <html:iframe id="remote-systemapp"
-    //              mozbrowser="true" allowfullscreen="true"
+    // <html:iframe id="this.id"
+    //              mozbrowser="true"
+    //              allowfullscreen="true"
     //              src="blank.html"/>
     let systemAppFrame =
       document.createElementNS("http://www.w3.org/1999/xhtml", "html:iframe");
-    systemAppFrame.setAttribute("id", "remote-systemapp");
+    systemAppFrame.setAttribute("id", this.id);
     systemAppFrame.setAttribute("mozbrowser", "true");
     systemAppFrame.setAttribute("mozapp", manifestURL);
     systemAppFrame.setAttribute("allowfullscreen", "true");
     systemAppFrame.setAttribute("src", "blank.html");
 
     let container = document.getElementById("container");
     this.contentBrowser = container.appendChild(systemAppFrame);
     this.contentBrowser.src = homeURL + window.location.hash;
+
+    window.addEventListener("unload", this);
+    this.contentBrowser.addEventListener("mozbrowserloadstart", this);
   },
 
   stop: function () {
+    window.removeEventListener("unload", this);
+    this.contentBrowser.removeEventListener("mozbrowserloadstart", this);
+    this.contentBrowser.removeEventListener("mozbrowserlocationchange", this, true);
+    SystemAppProxy.unregisterFrameWithId(this.id);
+  },
+
+  notifyContentStart: function(evt) {
+    this.contentBrowser.removeEventListener("mozbrowserloadstart", this);
+    this.contentBrowser.removeEventListener("mozbrowserlocationchange", this, true);
+
+    SystemAppProxy.registerFrameWithId(remoteShell.id, remoteShell.contentBrowser);
+    SystemAppProxy.addEventListenerWithId(this.id, "mozContentEvent", this);
+
+    let content = this.contentBrowser.contentWindow;
+    content.addEventListener("load", this, true);
+  },
+
+  notifyContentWindowLoaded: function () {
+    SystemAppProxy.setIsLoadedWithId(this.id);
+  },
+
+  notifyEventListenerReady: function () {
+    if (this._isEventListenerReady) {
+      Cu.reportError("shell_remote.js: SystemApp has already been declared as being ready.");
+      return;
+    }
+    this._isEventListenerReady = true;
+    SystemAppProxy.setIsReadyWithId(this.id);
   },
 
+  handleEvent: function(evt) {
+    debug("Got an event: " + evt.type);
+    let content = this.contentBrowser.contentWindow;
+
+    switch(evt.type) {
+      case "mozContentEvent":
+        if (evt.detail.type === "system-message-listener-ready") {
+          this.notifyEventListenerReady();
+        }
+        break;
+      case "load":
+        if (content.document.location == "about:blank") {
+          return;
+        }
+        content.removeEventListener("load", this, true);
+        this.notifyContentWindowLoaded();
+        break;
+      case "mozbrowserloadstart":
+        if (content.document.location == "about:blank") {
+          this.contentBrowser.addEventListener("mozbrowserlocationchange", this, true);
+          return;
+        }
+      case "mozbrowserlocationchange":
+        if (content.document.location == "about:blank") {
+          return;
+        }
+        this.notifyContentStart();
+        break;
+      case "unload":
+        this.stop();
+        break;
+    }
+  }
 };
 
 window.onload = function() {
   if (remoteShell.hasStarted() == false) {
     remoteShell.start();
   }
 };