84 lines
2.4 KiB
JavaScript
84 lines
2.4 KiB
JavaScript
/* 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";
|
|
|
|
const { Ci } = require("chrome");
|
|
const Services = require("Services");
|
|
const { TabActor } = require("./tab");
|
|
|
|
/**
|
|
* Creates a WindowActor for debugging a single window, like a browser window in Firefox,
|
|
* but it can be used to reach any window in the process. (Currently this is parent
|
|
* process only because the root actor's `onGetWindow` doesn't try to cross process
|
|
* boundaries.) Both chrome and content windows are supported.
|
|
*
|
|
* Most of the implementation is inherited from TabActor. WindowActor exposes all tab
|
|
* actors via its form() request, like TabActor.
|
|
*
|
|
* You can request a specific window's actor via RootActor.getWindow().
|
|
*
|
|
* @param connection DebuggerServerConnection
|
|
* The connection to the client.
|
|
* @param window DOMWindow
|
|
* The window.
|
|
*/
|
|
function WindowActor(connection, window) {
|
|
TabActor.call(this, connection);
|
|
|
|
let docShell = window.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIDocShell);
|
|
Object.defineProperty(this, "docShell", {
|
|
value: docShell,
|
|
configurable: true
|
|
});
|
|
}
|
|
|
|
WindowActor.prototype = Object.create(TabActor.prototype);
|
|
|
|
// Bug 1266561: This setting is mysteriously named, we should split up the
|
|
// functionality that is triggered by it.
|
|
WindowActor.prototype.isRootActor = true;
|
|
|
|
WindowActor.prototype.observe = function (subject, topic, data) {
|
|
TabActor.prototype.observe.call(this, subject, topic, data);
|
|
if (!this.attached) {
|
|
return;
|
|
}
|
|
if (topic == "chrome-webnavigation-destroy") {
|
|
this._onDocShellDestroy(subject);
|
|
}
|
|
};
|
|
|
|
WindowActor.prototype._attach = function () {
|
|
if (this.attached) {
|
|
return false;
|
|
}
|
|
|
|
TabActor.prototype._attach.call(this);
|
|
|
|
// Listen for chrome docshells in addition to content docshells
|
|
if (this.docShell.itemType == Ci.nsIDocShellTreeItem.typeChrome) {
|
|
Services.obs.addObserver(this, "chrome-webnavigation-destroy");
|
|
}
|
|
|
|
return true;
|
|
};
|
|
|
|
WindowActor.prototype._detach = function () {
|
|
if (!this.attached) {
|
|
return false;
|
|
}
|
|
|
|
if (this.docShell.itemType == Ci.nsIDocShellTreeItem.typeChrome) {
|
|
Services.obs.removeObserver(this, "chrome-webnavigation-destroy");
|
|
}
|
|
|
|
TabActor.prototype._detach.call(this);
|
|
|
|
return true;
|
|
};
|
|
|
|
exports.WindowActor = WindowActor;
|