-
Notifications
You must be signed in to change notification settings - Fork 5
/
bootstrap.ts
156 lines (137 loc) · 4.35 KB
/
bootstrap.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/* eslint-disable prefer-arrow/prefer-arrow-functions, no-var, @typescript-eslint/no-unused-vars, no-caller */
declare const dump: (msg: string) => void
declare const Components: any
declare const ChromeUtils: any
declare var Services: any
const {
interfaces: Ci,
results: Cr,
utils: Cu,
Constructor: CC,
} = Components
var stylesheetID = 'zotero-alt-open-pdf-stylesheet'
var ftlID = 'zotero-alt-open-pdf-ftl'
var menuitemID = 'make-it-green-instead'
var addedElementIDs = [stylesheetID, ftlID, menuitemID]
if (typeof Zotero == 'undefined') {
var Zotero
}
function log(msg) {
Zotero.debug(`AltOpen PDF: (bootstrap) ${msg}`)
}
// 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
return
}
// eslint-disable-next-line @typescript-eslint/no-shadow
var { Services } = ChromeUtils.import('resource://gre/modules/Services.jsm')
var windows = Services.wm.getEnumerator('navigator:browser')
var found = false
while (windows.hasMoreElements()) {
const win = windows.getNext()
if (win.Zotero) {
Zotero = win.Zotero
found = true
break
}
}
if (!found) {
await new Promise(resolve => {
var listener = {
onOpenWindow(aWindow) {
// Wait for the window to finish loading
const 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(undefined)
}
}, false)
},
}
Services.wm.addListener(listener)
})
}
await Zotero.initializationPromise
}
// Loads default preferences from 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}'`)
}
},
}
Services.scriptloader.loadSubScript(`${rootURI}prefs.js`, obj)
}
export async function install(): Promise<void> {
await waitForZotero()
log('Installed')
}
export async function startup({ id, version, resourceURI, rootURI = resourceURI.spec }): Promise<void> {
await waitForZotero()
log('Starting')
// 'Services' may not be available in Zotero 6
if (typeof Services == 'undefined') {
// eslint-disable-next-line @typescript-eslint/no-shadow
var { Services } = ChromeUtils.import('resource://gre/modules/Services.jsm')
}
// Read prefs from prefs.js when the plugin in Zotero 6
if (Zotero.platformMajorVersion < 102) {
setDefaultPrefs(rootURI)
}
// Add DOM elements to the main Zotero pane
try {
log('loading lib')
var win = Zotero.getMainWindow()
Services.scriptloader.loadSubScript(`${rootURI}lib.js`, { Zotero })
log(`AltOpen PDF: lib loaded: ${Object.keys(Zotero.AltOpenPDF)}`) // eslint-disable-line @typescript-eslint/no-unsafe-argument
Zotero.AltOpenPDF.startup()
log('AltOpen PDF: started')
}
catch (err) {
log(`AltOpen PDF: startup error: ${err}`)
}
}
export function shutdown() {
log('Shutting down')
if (Zotero.AltOpenPDF) {
try {
Zotero.AltOpenPDF.shutdown()
delete Zotero.AltOpenPDF
}
catch (err) {
log(`shutdown error: ${err}`)
}
}
}
export function uninstall() {
// `Zotero` object isn't available in `uninstall()` in Zotero 6, so log manually
if (typeof Zotero == 'undefined') {
dump('AltOpen PDF: Uninstalled\n\n')
return
}
log('Uninstalled')
}