Bug 1147808 - Cancel add-on installation when the tab or window closes while waiting for the user to confirm the installation. r=dtownsend

This commit is contained in:
Dão Gottwald 2015-05-16 13:28:34 +02:00
Родитель d8eae22539
Коммит 27fb633b15
2 изменённых файлов: 51 добавлений и 6 удалений

Просмотреть файл

@ -54,6 +54,22 @@ const gXPInstallObserver = {
// originatingURI might be missing or 'host' might throw for non-nsStandardURL nsIURIs. // originatingURI might be missing or 'host' might throw for non-nsStandardURL nsIURIs.
} }
let cancelInstallation = () => {
if (installInfo) {
for (let install of installInfo.installs)
install.cancel();
}
if (aTopic == "addon-install-confirmation")
this.acceptInstallation = null;
let tab = gBrowser.getTabForBrowser(browser);
if (tab)
tab.removeEventListener("TabClose", cancelInstallation);
window.removeEventListener("unload", cancelInstallation);
};
switch (aTopic) { switch (aTopic) {
case "addon-install-disabled": { case "addon-install-disabled": {
notificationID = "xpinstall-disabled"; notificationID = "xpinstall-disabled";
@ -170,11 +186,7 @@ const gXPInstallObserver = {
options.eventCallback = (aEvent) => { options.eventCallback = (aEvent) => {
switch (aEvent) { switch (aEvent) {
case "removed": case "removed":
if (installInfo) { cancelInstallation();
for (let install of installInfo.installs)
install.cancel();
}
this.acceptInstallation = null;
break; break;
case "shown": case "shown":
let addonList = document.getElementById("addon-install-confirmation-content"); let addonList = document.getElementById("addon-install-confirmation-content");
@ -247,8 +259,12 @@ const gXPInstallObserver = {
let showNotification = () => { let showNotification = () => {
let tab = gBrowser.getTabForBrowser(browser); let tab = gBrowser.getTabForBrowser(browser);
if (tab) if (tab) {
gBrowser.selectedTab = tab; gBrowser.selectedTab = tab;
tab.addEventListener("TabClose", cancelInstallation);
}
window.addEventListener("unload", cancelInstallation);
if (PopupNotifications.isPanelOpen) { if (PopupNotifications.isPanelOpen) {
let rect = document.getElementById("addon-progress-notification").getBoundingClientRect(); let rect = document.getElementById("addon-progress-notification").getBoundingClientRect();

Просмотреть файл

@ -620,6 +620,35 @@ function test_localfile() {
gBrowser.loadURI(path); gBrowser.loadURI(path);
}, },
function test_tabclose() {
if (!Preferences.get("xpinstall.customConfirmationUI", false)) {
runNextTest();
return;
}
// Wait for the progress notification
wait_for_progress_notification(aPanel => {
// Wait for the install confirmation dialog
wait_for_install_dialog(() => {
AddonManager.getAllInstalls(aInstalls => {
is(aInstalls.length, 1, "Should be one pending install");
wait_for_notification_close(() => {
AddonManager.getAllInstalls(aInstalls => {
is(aInstalls.length, 0, "Should be no pending install since the tab is closed");
runNextTest();
});
});
gBrowser.removeTab(gBrowser.selectedTab);
});
});
});
gBrowser.selectedTab = gBrowser.addTab();
gBrowser.loadURI(TESTROOT + "unsigned.xpi");
},
function test_wronghost() { function test_wronghost() {
gBrowser.selectedTab = gBrowser.addTab(); gBrowser.selectedTab = gBrowser.addTab();
gBrowser.addEventListener("load", function() { gBrowser.addEventListener("load", function() {