124 lines
3.6 KiB
JavaScript
124 lines
3.6 KiB
JavaScript
/* Copyright 2012 Will Shanks.
|
|
* 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/. */
|
|
|
|
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();
|
|
|
|
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/"],
|
|
]);
|
|
}
|
|
|
|
// String 'rootURI' introduced in Zotero 7
|
|
if (!rootURI) {
|
|
rootURI = resourceURI.spec;
|
|
}
|
|
|
|
const window = Zotero.getMainWindow();
|
|
// Global variables for plugin code
|
|
const ctx = {
|
|
Zotero,
|
|
rootURI,
|
|
window,
|
|
document: window.document,
|
|
ZoteroPane: Zotero.getActiveZoteroPane(),
|
|
};
|
|
|
|
Services.scriptloader.loadSubScript(
|
|
`${rootURI}/chrome/content/scripts/index.js`,
|
|
ctx
|
|
);
|
|
}
|
|
|
|
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.AddonTemplate.events.onUnInit(Zotero);
|
|
|
|
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) {}
|