From 2aa4a82499d4becd2284cdb482213d541b8804dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 28 Apr 2024 16:29:10 +0200 Subject: Adding upstream version 86.0.1. Signed-off-by: Daniel Baumann --- devtools/shared/content-observer.js | 76 +++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 devtools/shared/content-observer.js (limited to 'devtools/shared/content-observer.js') diff --git a/devtools/shared/content-observer.js b/devtools/shared/content-observer.js new file mode 100644 index 0000000000..805037427b --- /dev/null +++ b/devtools/shared/content-observer.js @@ -0,0 +1,76 @@ +/* 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 EventEmitter = require("devtools/shared/event-emitter"); + +/** + * 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(targetActor) { + this._contentWindow = targetActor.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" + ); + Services.obs.addObserver( + this._onInnerWindowDestroyed, + "inner-window-destroyed" + ); + }, + + /** + * Stops listening for the required observer messages. + */ + stopListening: function() { + Services.obs.removeObserver( + this._onContentGlobalCreated, + "content-document-global-created" + ); + Services.obs.removeObserver( + this._onInnerWindowDestroyed, + "inner-window-destroyed" + ); + }, + + /** + * Fired immediately after a web content document window has been set up. + */ + _onContentGlobalCreated: function(subject, topic, data) { + if (subject == this._contentWindow) { + EventEmitter.emit(this, "global-created", subject); + } + }, + + /** + * Fired when an inner window is removed from the backward/forward cache. + */ + _onInnerWindowDestroyed: function(subject, topic, data) { + const id = subject.QueryInterface(Ci.nsISupportsPRUint64).data; + EventEmitter.emit(this, "global-destroyed", id); + }, +}; + +// Utility functions. + +ContentObserver.GetInnerWindowID = function(window) { + return window.windowGlobalChild.innerWindowId; +}; -- cgit v1.2.3