gecko-dev/devtools/shared/dom-helpers.js
Julian Descottes 3f0e2f4c4f Bug 1592517 - Migrate devtools DOMHelpers.jsm from JSM to plain JS module r=ochameau
Depends on D51054

Summary of the changes here:
- move DOMHelpers.jsm to dom-helpers.js
- remove all unused methods
- converted to a static helper to avoid instanciating DOMHelpers objects for no reason
- updated call sites accordingly

Differential Revision: https://phabricator.services.mozilla.com/D51065

--HG--
rename : devtools/shared/DOMHelpers.jsm => devtools/shared/dom-helpers.js
extra : moz-landing-system : lando
2019-10-30 11:25:01 +00:00

54 lines
1.9 KiB
JavaScript

/* 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 Services = require("Services");
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: function(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);
}
},
};