| 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;
 |