summaryrefslogtreecommitdiffstats
path: root/devtools/shared/dom-helpers.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /devtools/shared/dom-helpers.js
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'devtools/shared/dom-helpers.js')
-rw-r--r--devtools/shared/dom-helpers.js51
1 files changed, 51 insertions, 0 deletions
diff --git a/devtools/shared/dom-helpers.js b/devtools/shared/dom-helpers.js
new file mode 100644
index 0000000000..3646855560
--- /dev/null
+++ b/devtools/shared/dom-helpers.js
@@ -0,0 +1,51 @@
+/* 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";
+
+exports.DOMHelpers = {
+ /**
+ * A simple way to be notified (once) when a window becomes
+ * interactive (DOMContentLoaded).
+ *
+ * It is based on the chromeEventHandler. This is useful when
+ * chrome iframes are loaded in content docshells (in Firefox
+ * tabs for example).
+ *
+ * @param nsIDOMWindow win
+ * The content window, owning the document to traverse.
+ * @param Function callback
+ * The method to call when the frame is loaded.
+ * @param String targetURL
+ * (optional) Check that the frame URL corresponds to the provided URL
+ * before calling the callback.
+ */
+ onceDOMReady(win, callback, targetURL) {
+ if (!win) {
+ throw new Error("window can't be null or undefined");
+ }
+ const docShell = win.docShell;
+ const onReady = function (event) {
+ if (event.target == win.document) {
+ docShell.chromeEventHandler.removeEventListener(
+ "DOMContentLoaded",
+ onReady
+ );
+ // If in `callback` the URL of the window is changed and a listener to DOMContentLoaded
+ // is attached, the event we just received will be also be caught by the new listener.
+ // We want to avoid that so we execute the callback in the next queue.
+ Services.tm.dispatchToMainThread(callback);
+ }
+ };
+ if (
+ (win.document.readyState == "complete" ||
+ win.document.readyState == "interactive") &&
+ win.location.href == targetURL
+ ) {
+ Services.tm.dispatchToMainThread(callback);
+ } else {
+ docShell.chromeEventHandler.addEventListener("DOMContentLoaded", onReady);
+ }
+ },
+};