diff options
Diffstat (limited to 'devtools/shared/content-observer.js')
-rw-r--r-- | devtools/shared/content-observer.js | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/devtools/shared/content-observer.js b/devtools/shared/content-observer.js new file mode 100644 index 000000000..6bef2ebd5 --- /dev/null +++ b/devtools/shared/content-observer.js @@ -0,0 +1,71 @@ +/* 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 {Cc, Ci, Cu, Cr} = require("chrome"); +const Services = require("Services"); + +const events = require("sdk/event/core"); + +/** + * Handles adding an observer for the creation of content document globals, + * event sent immediately after a web content document window has been set up, + * but before any script code has been executed. + */ +function ContentObserver(tabActor) { + this._contentWindow = tabActor.window; + this._onContentGlobalCreated = this._onContentGlobalCreated.bind(this); + this._onInnerWindowDestroyed = this._onInnerWindowDestroyed.bind(this); + this.startListening(); +} + +module.exports.ContentObserver = ContentObserver; + +ContentObserver.prototype = { + /** + * Starts listening for the required observer messages. + */ + startListening: function () { + Services.obs.addObserver( + this._onContentGlobalCreated, "content-document-global-created", false); + Services.obs.addObserver( + this._onInnerWindowDestroyed, "inner-window-destroyed", false); + }, + + /** + * Stops listening for the required observer messages. + */ + stopListening: function () { + Services.obs.removeObserver( + this._onContentGlobalCreated, "content-document-global-created", false); + Services.obs.removeObserver( + this._onInnerWindowDestroyed, "inner-window-destroyed", false); + }, + + /** + * Fired immediately after a web content document window has been set up. + */ + _onContentGlobalCreated: function (subject, topic, data) { + if (subject == this._contentWindow) { + events.emit(this, "global-created", subject); + } + }, + + /** + * Fired when an inner window is removed from the backward/forward cache. + */ + _onInnerWindowDestroyed: function (subject, topic, data) { + let id = subject.QueryInterface(Ci.nsISupportsPRUint64).data; + events.emit(this, "global-destroyed", id); + } +}; + +// Utility functions. + +ContentObserver.GetInnerWindowID = function (window) { + return window + .QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIDOMWindowUtils) + .currentInnerWindowID; +}; |