diff options
Diffstat (limited to 'b2g/chrome/content/shell_remote.js')
-rw-r--r-- | b2g/chrome/content/shell_remote.js | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/b2g/chrome/content/shell_remote.js b/b2g/chrome/content/shell_remote.js new file mode 100644 index 000000000..1f1115ef0 --- /dev/null +++ b/b2g/chrome/content/shell_remote.js @@ -0,0 +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 {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"); + }, + + 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="this.id" + // mozbrowser="true" + // allowfullscreen="true" + // src="blank.html"/> + let systemAppFrame = + document.createElementNS("http://www.w3.org/1999/xhtml", "html:iframe"); + 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(); + } +}; + |