12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- /* 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";
- module.metadata = {
- "stability": "experimental"
- };
- const { Ci } = require("chrome");
- const method = require("../../method/core");
- const { add, remove, iterator } = require("../lang/weak-set");
- let getTargetWindow = method("getTargetWindow");
- getTargetWindow.define(function (target) {
- if (target instanceof Ci.nsIDOMWindow)
- return target;
- if (target instanceof Ci.nsIDOMDocument)
- return target.defaultView || null;
- return null;
- });
- exports.getTargetWindow = getTargetWindow;
- let attachTo = method("attachTo");
- exports.attachTo = attachTo;
- let detachFrom = method("detatchFrom");
- exports.detachFrom = detachFrom;
- function attach(modification, target) {
- let window = getTargetWindow(target);
- attachTo(modification, window);
- // modification are stored per content; `window` reference can still be the
- // same even if the content is changed, therefore `document` is used instead.
- add(modification, window.document);
- }
- exports.attach = attach;
- function detach(modification, target) {
- if (target) {
- let window = getTargetWindow(target);
- detachFrom(modification, window);
- remove(modification, window.document);
- }
- else {
- let documents = iterator(modification);
- for (let document of documents) {
- detachFrom(modification, document.defaultView);
- remove(modification, document);
- }
- }
- }
- exports.detach = detach;
|