зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1252871 - Add support for runtime.onInstalled r=aswan
MozReview-Commit-ID: 3wDtv0g0BpO --HG-- extra : rebase_source : 589f77f750d7d874cb8f1634590b944b366fb3a4
This commit is contained in:
Родитель
09fbf696c1
Коммит
20342b5f6c
|
@ -1200,10 +1200,12 @@ class MockExtension {
|
|||
}
|
||||
}
|
||||
|
||||
let _browserUpdated = false;
|
||||
|
||||
// We create one instance of this class per extension. |addonData|
|
||||
// comes directly from bootstrap.js when initializing.
|
||||
this.Extension = class extends ExtensionData {
|
||||
constructor(addonData) {
|
||||
constructor(addonData, startupReason) {
|
||||
super(addonData.resourceURI);
|
||||
|
||||
this.uuid = UUIDMap.get(addonData.id);
|
||||
|
@ -1215,6 +1217,8 @@ this.Extension = class extends ExtensionData {
|
|||
}
|
||||
|
||||
this.addonData = addonData;
|
||||
this.startupReason = startupReason;
|
||||
|
||||
this.id = addonData.id;
|
||||
this.baseURI = NetUtil.newURI(this.getURL("")).QueryInterface(Ci.nsIURL);
|
||||
this.principal = this.createPrincipal();
|
||||
|
@ -1233,6 +1237,14 @@ this.Extension = class extends ExtensionData {
|
|||
this.emitter = new EventEmitter();
|
||||
}
|
||||
|
||||
static set browserUpdated(updated) {
|
||||
_browserUpdated = updated;
|
||||
}
|
||||
|
||||
static get browserUpdated() {
|
||||
return _browserUpdated;
|
||||
}
|
||||
|
||||
/**
|
||||
* This code is designed to make it easy to test a WebExtension
|
||||
* without creating a bunch of files. Everything is contained in a
|
||||
|
|
|
@ -20,6 +20,11 @@ XPCOMUtils.defineLazyModuleGetter(this, "Schemas",
|
|||
XPCOMUtils.defineLazyModuleGetter(this, "Services",
|
||||
"resource://gre/modules/Services.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyGetter(this, "Management", () => {
|
||||
const {Management} = Cu.import("resource://gre/modules/Extension.jsm", {});
|
||||
return Management;
|
||||
});
|
||||
|
||||
/* exported ExtensionTestUtils */
|
||||
|
||||
let BASE_MANIFEST = Object.freeze({
|
||||
|
@ -50,6 +55,8 @@ class ExtensionWrapper {
|
|||
|
||||
this.messageQueue = new Set();
|
||||
|
||||
this.attachListeners();
|
||||
|
||||
this.testScope.do_register_cleanup(() => {
|
||||
if (this.messageQueue.size) {
|
||||
let names = Array.from(this.messageQueue, ([msg]) => msg);
|
||||
|
@ -61,32 +68,6 @@ class ExtensionWrapper {
|
|||
}
|
||||
});
|
||||
|
||||
/* eslint-disable mozilla/balanced-listeners */
|
||||
extension.on("test-eq", (kind, pass, msg, expected, actual) => {
|
||||
this.testScope.ok(pass, `${msg} - Expected: ${expected}, Actual: ${actual}`);
|
||||
});
|
||||
extension.on("test-log", (kind, pass, msg) => {
|
||||
this.testScope.do_print(msg);
|
||||
});
|
||||
extension.on("test-result", (kind, pass, msg) => {
|
||||
this.testScope.ok(pass, msg);
|
||||
});
|
||||
extension.on("test-done", (kind, pass, msg, expected, actual) => {
|
||||
this.testScope.ok(pass, msg);
|
||||
this.testResolve(msg);
|
||||
});
|
||||
|
||||
extension.on("test-message", (kind, msg, ...args) => {
|
||||
let handler = this.messageHandler.get(msg);
|
||||
if (handler) {
|
||||
handler(...args);
|
||||
} else {
|
||||
this.messageQueue.add([msg, ...args]);
|
||||
this.checkMessages();
|
||||
}
|
||||
});
|
||||
/* eslint-enable mozilla/balanced-listeners */
|
||||
|
||||
this.testScope.do_register_cleanup(() => {
|
||||
if (this.state == "pending" || this.state == "running") {
|
||||
this.testScope.equal(this.state, "unloaded", "Extension left running at test shutdown");
|
||||
|
@ -99,6 +80,34 @@ class ExtensionWrapper {
|
|||
this.testScope.do_print(`Extension loaded`);
|
||||
}
|
||||
|
||||
attachListeners() {
|
||||
/* eslint-disable mozilla/balanced-listeners */
|
||||
this.extension.on("test-eq", (kind, pass, msg, expected, actual) => {
|
||||
this.testScope.ok(pass, `${msg} - Expected: ${expected}, Actual: ${actual}`);
|
||||
});
|
||||
this.extension.on("test-log", (kind, pass, msg) => {
|
||||
this.testScope.do_print(msg);
|
||||
});
|
||||
this.extension.on("test-result", (kind, pass, msg) => {
|
||||
this.testScope.ok(pass, msg);
|
||||
});
|
||||
this.extension.on("test-done", (kind, pass, msg, expected, actual) => {
|
||||
this.testScope.ok(pass, msg);
|
||||
this.testResolve(msg);
|
||||
});
|
||||
|
||||
this.extension.on("test-message", (kind, msg, ...args) => {
|
||||
let handler = this.messageHandler.get(msg);
|
||||
if (handler) {
|
||||
handler(...args);
|
||||
} else {
|
||||
this.messageQueue.add([msg, ...args]);
|
||||
this.checkMessages();
|
||||
}
|
||||
});
|
||||
/* eslint-enable mozilla/balanced-listeners */
|
||||
}
|
||||
|
||||
startup() {
|
||||
if (this.state != "uninitialized") {
|
||||
throw new Error("Extension already started");
|
||||
|
@ -200,8 +209,6 @@ var ExtensionTestUtils = {
|
|||
BASE_MANIFEST,
|
||||
|
||||
normalizeManifest: Task.async(function* (manifest, baseManifest = BASE_MANIFEST) {
|
||||
const {Management} = Cu.import("resource://gre/modules/Extension.jsm", {});
|
||||
|
||||
yield Management.lazyInit();
|
||||
|
||||
let errors = [];
|
||||
|
|
|
@ -101,11 +101,7 @@ BackgroundPage.prototype = {
|
|||
.then(addon => addon.setDebugGlobal(window));
|
||||
}
|
||||
|
||||
// TODO(robwu): This implementation of onStartup is wrong, see
|
||||
// https://bugzil.la/1247435#c1
|
||||
if (this.extension.onStartup) {
|
||||
this.extension.onStartup();
|
||||
}
|
||||
this.extension.emit("startup");
|
||||
}),
|
||||
|
||||
shutdown() {
|
||||
|
|
|
@ -8,13 +8,14 @@ Cu.import("resource://gre/modules/ExtensionUtils.jsm");
|
|||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "AddonManager",
|
||||
"resource://gre/modules/AddonManager.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Extension",
|
||||
"resource://gre/modules/Extension.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionManagement",
|
||||
"resource://gre/modules/ExtensionManagement.jsm");
|
||||
|
||||
var {
|
||||
EventManager,
|
||||
SingletonEventManager,
|
||||
ignoreEvent,
|
||||
SingletonEventManager,
|
||||
} = ExtensionUtils;
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "NativeApp",
|
||||
|
@ -24,15 +25,30 @@ extensions.registerSchemaAPI("runtime", "addon_parent", context => {
|
|||
let {extension} = context;
|
||||
return {
|
||||
runtime: {
|
||||
onStartup: new EventManager(context, "runtime.onStartup", fire => {
|
||||
extension.onStartup = fire;
|
||||
onStartup: ignoreEvent(context, "runtime.onStartup"),
|
||||
|
||||
onInstalled: new SingletonEventManager(context, "runtime.onInstalled", fire => {
|
||||
let listener = () => {
|
||||
switch (extension.startupReason) {
|
||||
case "APP_STARTUP":
|
||||
if (Extension.browserUpdated) {
|
||||
fire({reason: "browser_update"});
|
||||
}
|
||||
break;
|
||||
case "ADDON_INSTALL":
|
||||
fire({reason: "install"});
|
||||
break;
|
||||
case "ADDON_UPGRADE":
|
||||
fire({reason: "update"});
|
||||
break;
|
||||
}
|
||||
};
|
||||
extension.on("startup", listener);
|
||||
return () => {
|
||||
extension.onStartup = null;
|
||||
extension.off("startup", listener);
|
||||
};
|
||||
}).api(),
|
||||
|
||||
onInstalled: ignoreEvent(context, "runtime.onInstalled"),
|
||||
|
||||
onUpdateAvailable: new SingletonEventManager(context, "runtime.onUpdateAvailable", fire => {
|
||||
let instanceID = extension.addonData.instanceID;
|
||||
AddonManager.addUpgradeListener(instanceID, upgrade => {
|
||||
|
|
|
@ -122,7 +122,7 @@
|
|||
{
|
||||
"id": "OnInstalledReason",
|
||||
"type": "string",
|
||||
"enum": ["install", "update", "chrome_update", "shared_module_update"],
|
||||
"enum": ["install", "update", "browser_update"],
|
||||
"allowedContexts": ["content"],
|
||||
"description": "The reason that this event is being dispatched."
|
||||
},
|
||||
|
@ -459,7 +459,6 @@
|
|||
},
|
||||
{
|
||||
"name": "onInstalled",
|
||||
"unsupported": true,
|
||||
"type": "function",
|
||||
"description": "Fired when the extension is first installed, when the extension is updated to a new version, and when the browser is updated to a new version.",
|
||||
"parameters": [
|
||||
|
@ -474,11 +473,13 @@
|
|||
"previousVersion": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"unsupported": true,
|
||||
"description": "Indicates the previous version of the extension, which has just been updated. This is present only if 'reason' is 'update'."
|
||||
},
|
||||
"id": {
|
||||
"type": "string",
|
||||
"optional": true,
|
||||
"unsupported": true,
|
||||
"description": "Indicates the ID of the imported shared module extension which updated. This is present only if 'reason' is 'shared_module_update'."
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
|
|||
Components.utils.import("resource://gre/modules/Task.jsm");
|
||||
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||
Components.utils.import("resource://gre/modules/Timer.jsm");
|
||||
Components.utils.import("resource://testing-common/AddonTestUtils.jsm");
|
||||
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
|
||||
"resource://gre/modules/AppConstants.jsm");
|
||||
|
|
|
@ -0,0 +1,324 @@
|
|||
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set sts=2 sw=2 et tw=80: */
|
||||
"use strict";
|
||||
|
||||
XPCOMUtils.defineLazyGetter(this, "Management", () => {
|
||||
const {Management} = Cu.import("resource://gre/modules/Extension.jsm", {});
|
||||
return Management;
|
||||
});
|
||||
|
||||
const {
|
||||
createAppInfo,
|
||||
createTempWebExtensionFile,
|
||||
promiseAddonByID,
|
||||
promiseAddonEvent,
|
||||
promiseCompleteAllInstalls,
|
||||
promiseFindAddonUpdates,
|
||||
promiseRestartManager,
|
||||
promiseShutdownManager,
|
||||
promiseStartupManager,
|
||||
} = AddonTestUtils;
|
||||
|
||||
AddonTestUtils.init(this);
|
||||
|
||||
// Allow for unsigned addons.
|
||||
AddonTestUtils.overrideCertDB();
|
||||
|
||||
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "42");
|
||||
|
||||
function awaitEvent(eventName) {
|
||||
return new Promise(resolve => {
|
||||
let listener = (_eventName, extension) => {
|
||||
if (_eventName === eventName) {
|
||||
Management.off(eventName, listener);
|
||||
resolve(extension);
|
||||
}
|
||||
};
|
||||
|
||||
Management.on(eventName, listener);
|
||||
});
|
||||
}
|
||||
|
||||
add_task(function* test_should_fire_on_addon_update() {
|
||||
const EXTENSION_ID = "test_runtime_on_installed_addon_update@tests.mozilla.org";
|
||||
|
||||
const PREF_EM_CHECK_UPDATE_SECURITY = "extensions.checkUpdateSecurity";
|
||||
|
||||
// The test extension uses an insecure update url.
|
||||
Services.prefs.setBoolPref(PREF_EM_CHECK_UPDATE_SECURITY, false);
|
||||
|
||||
const testServer = createHttpServer();
|
||||
const port = testServer.identity.primaryPort;
|
||||
|
||||
let extension = ExtensionTestUtils.loadExtension({
|
||||
useAddonManager: "permanent",
|
||||
manifest: {
|
||||
"version": "1.0",
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": EXTENSION_ID,
|
||||
"update_url": `http://localhost:${port}/test_update.json`,
|
||||
},
|
||||
},
|
||||
},
|
||||
background() {
|
||||
browser.runtime.onUpdateAvailable.addListener(details => {
|
||||
browser.test.sendMessage("reloading");
|
||||
browser.runtime.reload();
|
||||
});
|
||||
|
||||
browser.runtime.onInstalled.addListener(details => {
|
||||
browser.test.sendMessage("installed", details);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
testServer.registerPathHandler("/test_update.json", (request, response) => {
|
||||
response.write(`{
|
||||
"addons": {
|
||||
"${EXTENSION_ID}": {
|
||||
"updates": [
|
||||
{
|
||||
"version": "2.0",
|
||||
"update_link": "http://localhost:${port}/addons/test_runtime_on_installed-2.0.xpi"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}`);
|
||||
});
|
||||
|
||||
let webExtensionFile = createTempWebExtensionFile({
|
||||
manifest: {
|
||||
version: "2.0",
|
||||
applications: {
|
||||
gecko: {
|
||||
id: EXTENSION_ID,
|
||||
},
|
||||
},
|
||||
},
|
||||
background() {
|
||||
browser.runtime.onInstalled.addListener(details => {
|
||||
browser.test.sendMessage("installed", details);
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
testServer.registerFile("/addons/test_runtime_on_installed-2.0.xpi", webExtensionFile);
|
||||
|
||||
yield promiseStartupManager();
|
||||
|
||||
yield extension.startup();
|
||||
let details = yield extension.awaitMessage("installed");
|
||||
equal(details.reason, "install", "runtime.onInstalled fired with the correct reason");
|
||||
|
||||
let addon = yield promiseAddonByID(EXTENSION_ID);
|
||||
equal(addon.version, "1.0", "The installed addon has the correct version");
|
||||
|
||||
let update = yield promiseFindAddonUpdates(addon);
|
||||
let install = update.updateAvailable;
|
||||
|
||||
let promiseInstalled = promiseAddonEvent("onInstalled");
|
||||
yield promiseCompleteAllInstalls([install]);
|
||||
|
||||
yield extension.awaitMessage("reloading");
|
||||
|
||||
let startupPromise = awaitEvent("ready");
|
||||
|
||||
let [updated_addon] = yield promiseInstalled;
|
||||
equal(updated_addon.version, "2.0", "The updated addon has the correct version");
|
||||
|
||||
extension.extension = yield startupPromise;
|
||||
extension.attachListeners();
|
||||
|
||||
details = yield extension.awaitMessage("installed");
|
||||
equal(details.reason, "update", "runtime.onInstalled fired with the correct reason");
|
||||
|
||||
yield extension.unload();
|
||||
|
||||
yield updated_addon.uninstall();
|
||||
yield promiseShutdownManager();
|
||||
});
|
||||
|
||||
add_task(function* test_should_fire_on_browser_update() {
|
||||
const EXTENSION_ID = "test_runtime_on_installed_browser_update@tests.mozilla.org";
|
||||
|
||||
yield promiseStartupManager();
|
||||
|
||||
let extension = ExtensionTestUtils.loadExtension({
|
||||
useAddonManager: "permanent",
|
||||
manifest: {
|
||||
"version": "1.0",
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": EXTENSION_ID,
|
||||
},
|
||||
},
|
||||
},
|
||||
background() {
|
||||
let onInstalledDetails = null;
|
||||
|
||||
browser.runtime.onInstalled.addListener(details => {
|
||||
onInstalledDetails = details;
|
||||
});
|
||||
|
||||
browser.test.onMessage.addListener(message => {
|
||||
if (message == "get-on-installed-details") {
|
||||
browser.test.sendMessage("on-installed-details", onInstalledDetails);
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
yield extension.startup();
|
||||
|
||||
extension.sendMessage("get-on-installed-details");
|
||||
let details = yield extension.awaitMessage("on-installed-details");
|
||||
equal(details.reason, "install", "runtime.onInstalled fired with the correct reason");
|
||||
|
||||
let startupPromise = awaitEvent("ready");
|
||||
yield promiseRestartManager("1");
|
||||
extension.extension = yield startupPromise;
|
||||
extension.attachListeners();
|
||||
|
||||
extension.sendMessage("get-on-installed-details");
|
||||
details = yield extension.awaitMessage("on-installed-details");
|
||||
equal(details, null, "runtime.onInstalled should not have fired");
|
||||
|
||||
// Update the browser.
|
||||
startupPromise = awaitEvent("ready");
|
||||
yield promiseRestartManager("2");
|
||||
extension.extension = yield startupPromise;
|
||||
extension.attachListeners();
|
||||
|
||||
extension.sendMessage("get-on-installed-details");
|
||||
details = yield extension.awaitMessage("on-installed-details");
|
||||
equal(details.reason, "browser_update", "runtime.onInstalled fired with the correct reason");
|
||||
|
||||
// Restart the browser.
|
||||
startupPromise = awaitEvent("ready");
|
||||
yield promiseRestartManager("2");
|
||||
extension.extension = yield startupPromise;
|
||||
extension.attachListeners();
|
||||
|
||||
extension.sendMessage("get-on-installed-details");
|
||||
details = yield extension.awaitMessage("on-installed-details");
|
||||
equal(details, null, "runtime.onInstalled should not have fired");
|
||||
|
||||
// Update the browser again.
|
||||
startupPromise = awaitEvent("ready");
|
||||
yield promiseRestartManager("3");
|
||||
extension.extension = yield startupPromise;
|
||||
extension.attachListeners();
|
||||
|
||||
extension.sendMessage("get-on-installed-details");
|
||||
details = yield extension.awaitMessage("on-installed-details");
|
||||
equal(details.reason, "browser_update", "runtime.onInstalled fired with the correct reason");
|
||||
|
||||
yield extension.unload();
|
||||
|
||||
yield promiseShutdownManager();
|
||||
});
|
||||
|
||||
add_task(function* test_should_not_fire_on_reload() {
|
||||
const EXTENSION_ID = "test_runtime_on_installed_reload@tests.mozilla.org";
|
||||
|
||||
yield promiseStartupManager();
|
||||
|
||||
let extension = ExtensionTestUtils.loadExtension({
|
||||
useAddonManager: "permanent",
|
||||
manifest: {
|
||||
"version": "1.0",
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": EXTENSION_ID,
|
||||
},
|
||||
},
|
||||
},
|
||||
background() {
|
||||
let onInstalledDetails = null;
|
||||
|
||||
browser.runtime.onInstalled.addListener(details => {
|
||||
onInstalledDetails = details;
|
||||
});
|
||||
|
||||
browser.test.onMessage.addListener(message => {
|
||||
if (message == "reload-extension") {
|
||||
browser.runtime.reload();
|
||||
} else if (message == "get-on-installed-details") {
|
||||
browser.test.sendMessage("on-installed-details", onInstalledDetails);
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
yield extension.startup();
|
||||
|
||||
extension.sendMessage("get-on-installed-details");
|
||||
let details = yield extension.awaitMessage("on-installed-details");
|
||||
equal(details.reason, "install", "runtime.onInstalled fired with the correct reason");
|
||||
|
||||
let startupPromise = awaitEvent("ready");
|
||||
extension.sendMessage("reload-extension");
|
||||
extension.extension = yield startupPromise;
|
||||
extension.attachListeners();
|
||||
|
||||
extension.sendMessage("get-on-installed-details");
|
||||
details = yield extension.awaitMessage("on-installed-details");
|
||||
equal(details, null, "runtime.onInstalled should not have fired");
|
||||
|
||||
yield extension.unload();
|
||||
yield promiseShutdownManager();
|
||||
});
|
||||
|
||||
add_task(function* test_should_not_fire_on_restart() {
|
||||
const EXTENSION_ID = "test_runtime_on_installed_restart@tests.mozilla.org";
|
||||
|
||||
yield promiseStartupManager();
|
||||
|
||||
let extension = ExtensionTestUtils.loadExtension({
|
||||
useAddonManager: "permanent",
|
||||
manifest: {
|
||||
"version": "1.0",
|
||||
"applications": {
|
||||
"gecko": {
|
||||
"id": EXTENSION_ID,
|
||||
},
|
||||
},
|
||||
},
|
||||
background() {
|
||||
let onInstalledDetails = null;
|
||||
|
||||
browser.runtime.onInstalled.addListener(details => {
|
||||
onInstalledDetails = details;
|
||||
});
|
||||
|
||||
browser.test.onMessage.addListener(message => {
|
||||
if (message == "get-on-installed-details") {
|
||||
browser.test.sendMessage("on-installed-details", onInstalledDetails);
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
yield extension.startup();
|
||||
|
||||
extension.sendMessage("get-on-installed-details");
|
||||
let details = yield extension.awaitMessage("on-installed-details");
|
||||
equal(details.reason, "install", "runtime.onInstalled fired with the correct reason");
|
||||
|
||||
let addon = yield promiseAddonByID(EXTENSION_ID);
|
||||
addon.userDisabled = true;
|
||||
|
||||
let startupPromise = awaitEvent("ready");
|
||||
addon.userDisabled = false;
|
||||
extension.extension = yield startupPromise;
|
||||
extension.attachListeners();
|
||||
|
||||
extension.sendMessage("get-on-installed-details");
|
||||
details = yield extension.awaitMessage("on-installed-details");
|
||||
equal(details, null, "runtime.onInstalled should not have fired");
|
||||
|
||||
yield extension.markUnloaded();
|
||||
yield promiseShutdownManager();
|
||||
});
|
|
@ -46,6 +46,7 @@ skip-if = release_or_beta
|
|||
[test_ext_runtime_connect_no_receiver.js]
|
||||
[test_ext_runtime_getBrowserInfo.js]
|
||||
[test_ext_runtime_getPlatformInfo.js]
|
||||
[test_ext_runtime_onInstalled.js]
|
||||
[test_ext_runtime_sendMessage.js]
|
||||
[test_ext_runtime_sendMessage_errors.js]
|
||||
[test_ext_runtime_sendMessage_no_receiver.js]
|
||||
|
|
|
@ -85,6 +85,8 @@ XPCOMUtils.defineLazyModuleGetter(this, "Promise",
|
|||
"resource://gre/modules/Promise.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "AddonRepository",
|
||||
"resource://gre/modules/addons/AddonRepository.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "Extension",
|
||||
"resource://gre/modules/Extension.jsm");
|
||||
XPCOMUtils.defineLazyModuleGetter(this, "FileUtils",
|
||||
"resource://gre/modules/FileUtils.jsm");
|
||||
|
||||
|
@ -850,6 +852,8 @@ var AddonManagerInternal = {
|
|||
}
|
||||
catch (e) { }
|
||||
|
||||
Extension.browserUpdated = appChanged;
|
||||
|
||||
let oldPlatformVersion = null;
|
||||
try {
|
||||
oldPlatformVersion = Services.prefs.getCharPref(PREF_EM_LAST_PLATFORM_VERSION);
|
||||
|
|
|
@ -1091,6 +1091,10 @@ var AddonTestUtils = {
|
|||
* Returns a promise that will be resolved when an add-on update check is
|
||||
* complete. The value resolved will be an AddonInstall if a new version was
|
||||
* found.
|
||||
*
|
||||
* @param {object} addon The add-on to find updates for.
|
||||
* @param {integer} reason The type of update to find.
|
||||
* @return {Promise<object>} an object containing information about the update.
|
||||
*/
|
||||
promiseFindAddonUpdates(addon, reason = AddonManager.UPDATE_WHEN_PERIODIC_UPDATE) {
|
||||
let equal = this.testScope.equal;
|
||||
|
|
|
@ -8,13 +8,24 @@ Components.utils.import("resource://gre/modules/Extension.jsm");
|
|||
|
||||
var extension;
|
||||
|
||||
const BOOTSTRAP_REASON_TO_STRING_MAP = {
|
||||
1: "APP_STARTUP",
|
||||
2: "APP_SHUTDOWN",
|
||||
3: "ADDON_ENABLE",
|
||||
4: "ADDON_DISABLE",
|
||||
5: "ADDON_INSTALL",
|
||||
6: "ADDON_UNINSTALL",
|
||||
7: "ADDON_UPGRADE",
|
||||
8: "ADDON_DOWNGRADE",
|
||||
}
|
||||
|
||||
function install(data, reason)
|
||||
{
|
||||
}
|
||||
|
||||
function startup(data, reason)
|
||||
{
|
||||
extension = new Extension(data);
|
||||
extension = new Extension(data, BOOTSTRAP_REASON_TO_STRING_MAP[reason]);
|
||||
extension.startup();
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче