diff --git a/toolkit/components/extensions/Extension.jsm b/toolkit/components/extensions/Extension.jsm index c25c48bdea38..b5ba41f565ff 100644 --- a/toolkit/components/extensions/Extension.jsm +++ b/toolkit/components/extensions/Extension.jsm @@ -456,7 +456,7 @@ ParentAPIManager.init(); // For extensions that have called setUninstallURL(), send an event // so the browser can display the URL. -let UninstallObserver = { +var UninstallObserver = { initialized: false, init: function() { @@ -466,6 +466,13 @@ let UninstallObserver = { } }, + uninit: function() { + if (this.initialized) { + AddonManager.removeAddonListener(this); + this.initialized = false; + } + }, + onUninstalling: function(addon) { let extension = GlobalManager.extensionMap.get(addon.id); if (extension) { @@ -479,11 +486,13 @@ GlobalManager = { // Map[extension ID -> Extension]. Determines which extension is // responsible for content under a particular extension ID. extensionMap: new Map(), + initialized: false, init(extension) { if (this.extensionMap.size == 0) { Services.obs.addObserver(this, "content-document-global-created", false); UninstallObserver.init(); + this.initialized = true; } this.extensionMap.set(extension.id, extension); @@ -492,8 +501,10 @@ GlobalManager = { uninit(extension) { this.extensionMap.delete(extension.id); - if (this.extensionMap.size == 0) { + if (this.extensionMap.size == 0 && this.initialized) { Services.obs.removeObserver(this, "content-document-global-created"); + UninstallObserver.uninit(); + this.initialized = false; } }, diff --git a/toolkit/components/extensions/ext-alarms.js b/toolkit/components/extensions/ext-alarms.js index de8a79a4dd4e..5e94efc8caff 100644 --- a/toolkit/components/extensions/ext-alarms.js +++ b/toolkit/components/extensions/ext-alarms.js @@ -83,11 +83,13 @@ extensions.on("startup", (type, extension) => { }); extensions.on("shutdown", (type, extension) => { - for (let alarm of alarmsMap.get(extension).values()) { - alarm.clear(); + if (alarmsMap.has(extension)) { + for (let alarm of alarmsMap.get(extension).values()) { + alarm.clear(); + } + alarmsMap.delete(extension); + alarmCallbacksMap.delete(extension); } - alarmsMap.delete(extension); - alarmCallbacksMap.delete(extension); }); /* eslint-enable mozilla/balanced-listeners */ diff --git a/toolkit/components/extensions/ext-notifications.js b/toolkit/components/extensions/ext-notifications.js index 5b01671831a4..8bae71ef1fe1 100644 --- a/toolkit/components/extensions/ext-notifications.js +++ b/toolkit/components/extensions/ext-notifications.js @@ -81,10 +81,12 @@ extensions.on("startup", (type, extension) => { }); extensions.on("shutdown", (type, extension) => { - for (let notification of notificationsMap.get(extension).values()) { - notification.clear(); + if (notificationsMap.has(extension)) { + for (let notification of notificationsMap.get(extension).values()) { + notification.clear(); + } + notificationsMap.delete(extension); } - notificationsMap.delete(extension); }); /* eslint-enable mozilla/balanced-listeners */ diff --git a/toolkit/components/extensions/test/mochitest/chrome.ini b/toolkit/components/extensions/test/mochitest/chrome.ini index ebf79801605a..fb0fa4c7e78d 100644 --- a/toolkit/components/extensions/test/mochitest/chrome.ini +++ b/toolkit/components/extensions/test/mochitest/chrome.ini @@ -22,6 +22,7 @@ skip-if = (os == 'android') # browser.tabs is undefined. Bug 1258975 on android. [test_chrome_ext_trustworthy_origin.html] [test_chrome_ext_webnavigation_resolved_urls.html] skip-if = (os == 'android') # browser.tabs is undefined. Bug 1258975 on android. +[test_chrome_ext_shutdown_cleanup.html] [test_chrome_native_messaging_paths.html] skip-if = os != "mac" && os != "linux" [test_ext_cookies_expiry.html] @@ -30,4 +31,4 @@ skip-if = buildapp == 'b2g' skip-if = buildapp == 'b2g' [test_ext_jsversion.html] skip-if = buildapp == 'b2g' -[test_ext_schema.html] +[test_ext_schema.html] \ No newline at end of file diff --git a/toolkit/components/extensions/test/mochitest/test_chrome_ext_shutdown_cleanup.html b/toolkit/components/extensions/test/mochitest/test_chrome_ext_shutdown_cleanup.html new file mode 100644 index 000000000000..590c60af50bb --- /dev/null +++ b/toolkit/components/extensions/test/mochitest/test_chrome_ext_shutdown_cleanup.html @@ -0,0 +1,59 @@ + + + + WebExtension test + + + + + + + + + + + +