summaryrefslogtreecommitdiffstats
path: root/devtools/server/actors/childtab.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/server/actors/childtab.js')
-rw-r--r--devtools/server/actors/childtab.js82
1 files changed, 82 insertions, 0 deletions
diff --git a/devtools/server/actors/childtab.js b/devtools/server/actors/childtab.js
new file mode 100644
index 000000000..96d82e281
--- /dev/null
+++ b/devtools/server/actors/childtab.js
@@ -0,0 +1,82 @@
+/* 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 { Cr } = require("chrome");
+var { TabActor } = require("devtools/server/actors/webbrowser");
+
+/**
+ * Tab actor for documents living in a child process.
+ *
+ * Depends on TabActor, defined in webbrowser.js.
+ */
+
+/**
+ * Creates a tab actor for handling requests to the single tab, like
+ * attaching and detaching. ContentActor respects the actor factories
+ * registered with DebuggerServer.addTabActor.
+ *
+ * @param connection DebuggerServerConnection
+ * The conection to the client.
+ * @param chromeGlobal
+ * The content script global holding |content| and |docShell| properties for a tab.
+ * @param prefix
+ * the prefix used in protocol to create IDs for each actor.
+ * Used as ID identifying this particular TabActor from the parent process.
+ */
+function ContentActor(connection, chromeGlobal, prefix)
+{
+ this._chromeGlobal = chromeGlobal;
+ this._prefix = prefix;
+ TabActor.call(this, connection, chromeGlobal);
+ this.traits.reconfigure = false;
+ this._sendForm = this._sendForm.bind(this);
+ this._chromeGlobal.addMessageListener("debug:form", this._sendForm);
+
+ Object.defineProperty(this, "docShell", {
+ value: this._chromeGlobal.docShell,
+ configurable: true
+ });
+}
+
+ContentActor.prototype = Object.create(TabActor.prototype);
+
+ContentActor.prototype.constructor = ContentActor;
+
+Object.defineProperty(ContentActor.prototype, "title", {
+ get: function () {
+ return this.window.document.title;
+ },
+ enumerable: true,
+ configurable: true
+});
+
+ContentActor.prototype.exit = function () {
+ if (this._sendForm) {
+ try {
+ this._chromeGlobal.removeMessageListener("debug:form", this._sendForm);
+ } catch (e) {
+ if (e.result != Cr.NS_ERROR_NULL_POINTER) {
+ throw e;
+ }
+ // In some cases, especially when using messageManagers in non-e10s mode, we reach
+ // this point with a dead messageManager which only throws errors but does not
+ // seem to indicate in any other way that it is dead.
+ }
+ this._sendForm = null;
+ }
+
+ TabActor.prototype.exit.call(this);
+
+ this._chromeGlobal = null;
+};
+
+/**
+ * On navigation events, our URL and/or title may change, so we update our
+ * counterpart in the parent process that participates in the tab list.
+ */
+ContentActor.prototype._sendForm = function () {
+ this._chromeGlobal.sendAsyncMessage("debug:form", this.form());
+};