mirror of
https://github.com/gryf/pentadactyl-pm.git
synced 2025-12-20 18:47:58 +01:00
75 lines
2.7 KiB
JavaScript
75 lines
2.7 KiB
JavaScript
// By Kris Maglione. Public Domain.
|
|
// Please feel free to copy and use at will.
|
|
|
|
var ADDON_ID;
|
|
|
|
const OVERLAY_URLS = [
|
|
"about:addons",
|
|
"chrome://mozapps/content/extensions/extensions.xul"
|
|
];
|
|
|
|
const Ci = Components.interfaces;
|
|
const Cu = Components.utils;
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
|
|
|
const TOPIC = "chrome-document-global-created";
|
|
|
|
function observe(window, topic, url) {
|
|
if (topic === TOPIC)
|
|
checkDocument(window.document);
|
|
}
|
|
function init(id) {
|
|
if (id)
|
|
ADDON_ID = id;
|
|
|
|
Services.obs[id ? "addObserver" : "removeObserver"](observe, TOPIC, false);
|
|
for (let doc in chromeDocuments())
|
|
checkDocument(doc, !id);
|
|
}
|
|
function cleanup() { init(null); }
|
|
|
|
function checkPopup(event) {
|
|
let doc = event.originalTarget.ownerDocument;
|
|
let binding = doc.getBindingParent(event.originalTarget);
|
|
if (binding && binding.addon && binding.addon.guid == ADDON_ID && !binding.addon.compatible) {
|
|
let elem = doc.getAnonymousElementByAttribute(binding, "anonid", "stillworks");
|
|
if (elem && elem.nextSibling) {
|
|
elem.nextSibling.disabled = true;
|
|
elem.nextSibling.setAttribute("tooltiptext", "Developer has opted out of incompatibility reports\n"+
|
|
"Development versions are available with updated support");
|
|
}
|
|
}
|
|
}
|
|
|
|
function checkDocument(doc, disable, force) {
|
|
if (["interactive", "complete"].indexOf(doc.readyState) >= 0 || force && doc.readyState === "uninitialized") {
|
|
if (OVERLAY_URLS.indexOf(doc.documentURI) >= 0)
|
|
doc[disable ? "removeEventListener" : "addEventListener"]("popupshowing", checkPopup, false);
|
|
}
|
|
else {
|
|
doc.addEventListener("DOMContentLoaded", function listener() {
|
|
doc.removeEventListener("DOMContentLoaded", listener, false);
|
|
checkDocument(doc, disable, true);
|
|
}, false);
|
|
}
|
|
}
|
|
|
|
function chromeDocuments() {
|
|
let windows = Services.wm.getXULWindowEnumerator(null);
|
|
while (windows.hasMoreElements()) {
|
|
let window = windows.getNext().QueryInterface(Ci.nsIXULWindow);
|
|
for each (let type in ["typeChrome", "typeContent"]) {
|
|
let docShells = window.docShell.getDocShellEnumerator(Ci.nsIDocShellTreeItem[type],
|
|
Ci.nsIDocShell.ENUMERATE_FORWARDS);
|
|
while (docShells.hasMoreElements())
|
|
yield docShells.getNext().QueryInterface(Ci.nsIDocShell).contentViewer.DOMDocument;
|
|
}
|
|
}
|
|
}
|
|
|
|
var EXPORTED_SYMBOLS = ["cleanup", "init"];
|
|
|
|
// vim: set fdm=marker sw=4 ts=4 et ft=javascript:
|