Bug 1874684 - Part 37: Fix unified compilation. r=allstarschh
[gecko.git] / devtools / shared / dom-helpers.js
blob3646855560cc2a30076ee3e38a004343a9887436
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 "use strict";
7 exports.DOMHelpers = {
8   /**
9    * A simple way to be notified (once) when a window becomes
10    * interactive (DOMContentLoaded).
11    *
12    * It is based on the chromeEventHandler. This is useful when
13    * chrome iframes are loaded in content docshells (in Firefox
14    * tabs for example).
15    *
16    * @param nsIDOMWindow win
17    *        The content window, owning the document to traverse.
18    * @param Function callback
19    *        The method to call when the frame is loaded.
20    * @param String targetURL
21    *        (optional) Check that the frame URL corresponds to the provided URL
22    *        before calling the callback.
23    */
24   onceDOMReady(win, callback, targetURL) {
25     if (!win) {
26       throw new Error("window can't be null or undefined");
27     }
28     const docShell = win.docShell;
29     const onReady = function (event) {
30       if (event.target == win.document) {
31         docShell.chromeEventHandler.removeEventListener(
32           "DOMContentLoaded",
33           onReady
34         );
35         // If in `callback` the URL of the window is changed and a listener to DOMContentLoaded
36         // is attached, the event we just received will be also be caught by the new listener.
37         // We want to avoid that so we execute the callback in the next queue.
38         Services.tm.dispatchToMainThread(callback);
39       }
40     };
41     if (
42       (win.document.readyState == "complete" ||
43         win.document.readyState == "interactive") &&
44       win.location.href == targetURL
45     ) {
46       Services.tm.dispatchToMainThread(callback);
47     } else {
48       docShell.chromeEventHandler.addEventListener("DOMContentLoaded", onReady);
49     }
50   },