Some checks failed
Close inactive issues / close-issues (push) Has been cancelled
149 lines
4.3 KiB
JavaScript
149 lines
4.3 KiB
JavaScript
/**
|
|
* Most of this code is from Zotero team's official Make It Red example[1]
|
|
* or the Zotero 7 documentation[2].
|
|
* [1] https://github.com/zotero/make-it-red
|
|
* [2] https://www.zotero.org/support/dev/zotero_7_for_developers
|
|
*/
|
|
|
|
if (typeof Zotero == "undefined") {
|
|
var Zotero;
|
|
}
|
|
|
|
var chromeHandle;
|
|
|
|
// In Zotero 6, bootstrap methods are called before Zotero is initialized, and using include.js
|
|
// to get the Zotero XPCOM service would risk breaking Zotero startup. Instead, wait for the main
|
|
// Zotero window to open and get the Zotero object from there.
|
|
//
|
|
// In Zotero 7, bootstrap methods are not called until Zotero is initialized, and the 'Zotero' is
|
|
// automatically made available.
|
|
async function waitForZotero() {
|
|
if (typeof Zotero != "undefined") {
|
|
await Zotero.initializationPromise;
|
|
}
|
|
|
|
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
|
var windows = Services.wm.getEnumerator("navigator:browser");
|
|
var found = false;
|
|
while (windows.hasMoreElements()) {
|
|
let win = windows.getNext();
|
|
if (win.Zotero) {
|
|
Zotero = win.Zotero;
|
|
found = true;
|
|
break;
|
|
}
|
|
}
|
|
if (!found) {
|
|
await new Promise((resolve) => {
|
|
var listener = {
|
|
onOpenWindow: function (aWindow) {
|
|
// Wait for the window to finish loading
|
|
let domWindow = aWindow
|
|
.QueryInterface(Ci.nsIInterfaceRequestor)
|
|
.getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow);
|
|
domWindow.addEventListener(
|
|
"load",
|
|
function () {
|
|
domWindow.removeEventListener("load", arguments.callee, false);
|
|
if (domWindow.Zotero) {
|
|
Services.wm.removeListener(listener);
|
|
Zotero = domWindow.Zotero;
|
|
resolve();
|
|
}
|
|
},
|
|
false
|
|
);
|
|
},
|
|
};
|
|
Services.wm.addListener(listener);
|
|
});
|
|
}
|
|
await Zotero.initializationPromise;
|
|
}
|
|
|
|
function install(data, reason) {}
|
|
|
|
async function startup({ id, version, resourceURI, rootURI }, reason) {
|
|
await waitForZotero();
|
|
|
|
// String 'rootURI' introduced in Zotero 7
|
|
if (!rootURI) {
|
|
rootURI = resourceURI.spec;
|
|
}
|
|
|
|
if (Zotero.platformMajorVersion >= 102) {
|
|
var aomStartup = Components.classes[
|
|
"@mozilla.org/addons/addon-manager-startup;1"
|
|
].getService(Components.interfaces.amIAddonManagerStartup);
|
|
var manifestURI = Services.io.newURI(rootURI + "manifest.json");
|
|
chromeHandle = aomStartup.registerChrome(manifestURI, [
|
|
["content", "__addonRef__", rootURI + "chrome/content/"],
|
|
["locale", "__addonRef__", "en-US", rootURI + "chrome/locale/en-US/"],
|
|
["locale", "__addonRef__", "zh-CN", rootURI + "chrome/locale/zh-CN/"],
|
|
]);
|
|
} else {
|
|
setDefaultPrefs(rootURI);
|
|
}
|
|
|
|
// Global variables for plugin code
|
|
const ctx = {
|
|
rootURI,
|
|
};
|
|
ctx._globalThis = ctx;
|
|
|
|
Services.scriptloader.loadSubScript(
|
|
`${rootURI}/chrome/content/scripts/index.js`,
|
|
ctx,
|
|
"utf8"
|
|
);
|
|
}
|
|
|
|
function shutdown({ id, version, resourceURI, rootURI }, reason) {
|
|
if (reason === APP_SHUTDOWN) {
|
|
return;
|
|
}
|
|
if (typeof Zotero === "undefined") {
|
|
Zotero = Components.classes["@zotero.org/Zotero;1"].getService(
|
|
Components.interfaces.nsISupports
|
|
).wrappedJSObject;
|
|
}
|
|
Zotero.__addonInstance__.hooks.onShutdown();
|
|
|
|
Cc["@mozilla.org/intl/stringbundle;1"]
|
|
.getService(Components.interfaces.nsIStringBundleService)
|
|
.flushBundles();
|
|
|
|
Cu.unload(`${rootURI}/chrome/content/scripts/index.js`);
|
|
|
|
if (chromeHandle) {
|
|
chromeHandle.destruct();
|
|
chromeHandle = null;
|
|
}
|
|
}
|
|
|
|
function uninstall(data, reason) {}
|
|
|
|
// Loads default preferences from defaults/preferences/prefs.js in Zotero 6
|
|
function setDefaultPrefs(rootURI) {
|
|
var branch = Services.prefs.getDefaultBranch("");
|
|
var obj = {
|
|
pref(pref, value) {
|
|
switch (typeof value) {
|
|
case "boolean":
|
|
branch.setBoolPref(pref, value);
|
|
break;
|
|
case "string":
|
|
branch.setStringPref(pref, value);
|
|
break;
|
|
case "number":
|
|
branch.setIntPref(pref, value);
|
|
break;
|
|
default:
|
|
Zotero.logError(`Invalid type '${typeof value}' for pref '${pref}'`);
|
|
}
|
|
},
|
|
};
|
|
Zotero.getMainWindow().console.log(rootURI + "prefs.js");
|
|
Services.scriptloader.loadSubScript(rootURI + "prefs.js", obj);
|
|
}
|