summaryrefslogtreecommitdiffstats
path: root/devtools/shared/dom-helpers.js
diff options
context:
space:
mode:
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);
+ }
+ },
+};