| OLD | NEW |
| (Empty) |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | |
| 2 * License, v. 2.0. If a copy of the MPL was not distributed with this | |
| 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | |
| 4 | |
| 5 const Cc = Components.classes; | |
| 6 const Ci = Components.interfaces; | |
| 7 const Cr = Components.results; | |
| 8 const Cu = Components.utils; | |
| 9 | |
| 10 let {Services} = Cu.import("resource://gre/modules/Services.jsm", {}); | |
| 11 | |
| 12 Cu.importGlobalProperties(["atob", "btoa", "File", "URL", | |
| 13 "TextDecoder", "TextEncoder", "XMLHttpRequest"]); | |
| 14 | |
| 15 let addonData = null; | |
| 16 | |
| 17 function startup(params, reason) | |
| 18 { | |
| 19 addonData = params; | |
| 20 | |
| 21 {%- if hasChromeRequires %} | |
| 22 Services.obs.addObserver(RequireObserver, "{{metadata.get('general', 'basename
')}}-require", true); | |
| 23 onShutdown.add(function() | |
| 24 { | |
| 25 Services.obs.removeObserver(RequireObserver, "{{metadata.get('general', 'bas
ename')}}-require"); | |
| 26 }); | |
| 27 {%- set hasShutdownHandlers = True %} | |
| 28 {%- endif %} | |
| 29 | |
| 30 {%- if hasWebExtension %} | |
| 31 let port = params.webExtension.startup().then(({browser}) => | |
| 32 { | |
| 33 return new Promise((resolve, reject) => | |
| 34 { | |
| 35 browser.runtime.onConnect.addListener(resolve); | |
| 36 }); | |
| 37 }); | |
| 38 require.scopes.webextension = {exports: port}; | |
| 39 {%- endif %} | |
| 40 | |
| 41 require("main"); | |
| 42 } | |
| 43 | |
| 44 function shutdown(params, reason) | |
| 45 { | |
| 46 {%- if chromeWindows %} | |
| 47 let windowNames = {{chromeWindows|json}}; | |
| 48 for (let i = 0; i < windowNames.length; i++) | |
| 49 { | |
| 50 let enumerator = Services.wm.getEnumerator(windowNames[i]); | |
| 51 while (enumerator.hasMoreElements()) | |
| 52 { | |
| 53 let window = enumerator.getNext().QueryInterface(Ci.nsIDOMWindow); | |
| 54 window.setTimeout("window.close()", 0); // Closing immediately might not w
ork due to modal windows | |
| 55 try | |
| 56 { | |
| 57 window.close(); | |
| 58 } catch(e) {} | |
| 59 } | |
| 60 } | |
| 61 {%- endif %} | |
| 62 | |
| 63 {%- if hasShutdownHandlers %} | |
| 64 onShutdown.done = true; | |
| 65 for (let i = shutdownHandlers.length - 1; i >= 0; i --) | |
| 66 { | |
| 67 try | |
| 68 { | |
| 69 shutdownHandlers[i](); | |
| 70 } | |
| 71 catch (e) | |
| 72 { | |
| 73 Cu.reportError(e); | |
| 74 } | |
| 75 } | |
| 76 shutdownHandlers = null; | |
| 77 {%- endif %} | |
| 78 | |
| 79 // Make sure to release our ties to the modules even if the sandbox cannot be | |
| 80 // released for some reason. | |
| 81 for (let key in require.scopes) | |
| 82 { | |
| 83 let scope = require.scopes[key]; | |
| 84 let list = Object.keys(scope); | |
| 85 for (let i = 0; i < list.length; i++) | |
| 86 scope[list[i]] = null; | |
| 87 } | |
| 88 require.scopes = null; | |
| 89 addonData = null; | |
| 90 } | |
| 91 | |
| 92 function install(params, reason) {} | |
| 93 | |
| 94 function uninstall(params, reason) | |
| 95 { | |
| 96 {%- if 'currentVersion' in jsonRequires.get('prefs.json', {}).get('defaults',
{}) %} | |
| 97 const ADDON_UNINSTALL = 6; // https://developer.mozilla.org/en/Extensions/Boo
tstrapped_extensions#Reason_constants | |
| 98 if (reason == ADDON_UNINSTALL) | |
| 99 { | |
| 100 // Users often uninstall/reinstall extension to "fix" issues. Clear current | |
| 101 // version number on uninstall to rerun first-run actions in this scenario. | |
| 102 Services.prefs.clearUserPref("extensions.{{metadata.get('general', 'basename
')}}.currentVersion"); | |
| 103 } | |
| 104 {%- endif %} | |
| 105 } | |
| 106 | |
| 107 {%- if hasShutdownHandlers %} | |
| 108 let shutdownHandlers = []; | |
| 109 let onShutdown = | |
| 110 { | |
| 111 done: false, | |
| 112 add: function(handler) | |
| 113 { | |
| 114 if (shutdownHandlers.indexOf(handler) < 0) | |
| 115 shutdownHandlers.push(handler); | |
| 116 }, | |
| 117 remove: function(handler) | |
| 118 { | |
| 119 let index = shutdownHandlers.indexOf(handler); | |
| 120 if (index >= 0) | |
| 121 shutdownHandlers.splice(index, 1); | |
| 122 } | |
| 123 }; | |
| 124 {%- endif %} | |
| 125 | |
| 126 function require(module) | |
| 127 { | |
| 128 let scopes = require.scopes; | |
| 129 if (!(module in scopes)) | |
| 130 { | |
| 131 {%- if 'info' in requires %} | |
| 132 if (module == "info") | |
| 133 { | |
| 134 let applications = {{applications|json}}; | |
| 135 let appInfo = Services.appinfo; | |
| 136 | |
| 137 scopes[module] = {}; | |
| 138 scopes[module].exports = | |
| 139 { | |
| 140 addonID: addonData.id, | |
| 141 addonVersion: addonData.version, | |
| 142 addonRoot: addonData.resourceURI.spec, | |
| 143 addonName: "{{metadata.get('general', 'basename')}}", | |
| 144 application: (appInfo.ID in applications ? applications[appInfo.ID] : "o
ther"), | |
| 145 applicationVersion: appInfo.version, | |
| 146 platform: "gecko", | |
| 147 platformVersion: appInfo.platformVersion | |
| 148 }; | |
| 149 } | |
| 150 else | |
| 151 { | |
| 152 {%- endif %} | |
| 153 let url = addonData.resourceURI.spec + "lib/" + module + ".js"; | |
| 154 scopes[module] = { | |
| 155 Cc, Ci, Cr, Cu, atob, btoa, File, URL, TextDecoder, TextEncoder, | |
| 156 XMLHttpRequest, require, | |
| 157 {% if hasShutdownHandlers %} | |
| 158 onShutdown, | |
| 159 {% endif %} | |
| 160 exports: {}}; | |
| 161 {%- if multicompartment %} | |
| 162 let principal = Cc["@mozilla.org/systemprincipal;1"].getService(Ci.nsIPrin
cipal); | |
| 163 scopes[module] = new Cu.Sandbox(principal, { | |
| 164 sandboxName: url, | |
| 165 sandboxPrototype: scopes[module], | |
| 166 wantXrays: false | |
| 167 }); | |
| 168 {%- endif %} | |
| 169 Services.scriptloader.loadSubScript(url, scopes[module]); | |
| 170 {%- if 'info' in requires %} | |
| 171 } | |
| 172 {%- endif %} | |
| 173 } | |
| 174 return scopes[module].exports; | |
| 175 } | |
| 176 require.scopes = Object.create(null); | |
| 177 {%- for name, data in jsonRequires.iteritems() %} | |
| 178 require.scopes[{{name|json}}] = {exports: {{data|json}}}; | |
| 179 {%- endfor %} | |
| 180 | |
| 181 {%- if hasChromeRequires %} | |
| 182 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); | |
| 183 | |
| 184 let RequireObserver = | |
| 185 { | |
| 186 observe: function(subject, topic, data) | |
| 187 { | |
| 188 if (topic == "{{metadata.get('general', 'basename')}}-require") | |
| 189 { | |
| 190 subject.wrappedJSObject.exports = require(data); | |
| 191 } | |
| 192 }, | |
| 193 | |
| 194 QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObse
rver]) | |
| 195 }; | |
| 196 {%- endif %} | |
| OLD | NEW |