diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/browser/browser_uninstalling.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/browser/browser_uninstalling.js | 1098 |
1 files changed, 1098 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/browser/browser_uninstalling.js b/toolkit/mozapps/extensions/test/browser/browser_uninstalling.js new file mode 100644 index 000000000..a9329e496 --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/browser_uninstalling.js @@ -0,0 +1,1098 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// Tests that searching for add-ons works correctly + +var gManagerWindow; +var gDocument; +var gCategoryUtilities; +var gProvider; + +function test() { + requestLongerTimeout(2); + waitForExplicitFinish(); + + gProvider = new MockProvider(); + + gProvider.createAddons([{ + id: "addon1@tests.mozilla.org", + name: "Uninstall needs restart", + type: "extension", + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_UNINSTALL + }, { + id: "addon2@tests.mozilla.org", + name: "Uninstall doesn't need restart 1", + type: "extension", + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_NONE + }, { + id: "addon3@tests.mozilla.org", + name: "Uninstall doesn't need restart 2", + type: "extension", + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_NONE + }, { + id: "addon4@tests.mozilla.org", + name: "Uninstall doesn't need restart 3", + type: "extension", + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_NONE + }, { + id: "addon5@tests.mozilla.org", + name: "Uninstall doesn't need restart 4", + type: "extension", + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_NONE + }, { + id: "addon6@tests.mozilla.org", + name: "Uninstall doesn't need restart 5", + type: "extension", + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_NONE + }, { + id: "addon7@tests.mozilla.org", + name: "Uninstall doesn't need restart 6", + type: "extension", + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_NONE + }, { + id: "addon8@tests.mozilla.org", + name: "Uninstall doesn't need restart 7", + type: "extension", + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_NONE + }, { + id: "addon9@tests.mozilla.org", + name: "Uninstall doesn't need restart 8", + type: "extension", + operationsRequiringRestart: AddonManager.OP_NEEDS_RESTART_NONE + }]); + + open_manager(null, function(aWindow) { + gManagerWindow = aWindow; + gDocument = gManagerWindow.document; + gCategoryUtilities = new CategoryUtilities(gManagerWindow); + run_next_test(); + }); +} + +function end_test() { + close_manager(gManagerWindow, function() { + finish(); + }); +} + +function get_item_in_list(aId, aList) { + var item = aList.firstChild; + while (item) { + if ("mAddon" in item && item.mAddon.id == aId) { + aList.ensureElementIsVisible(item); + return item; + } + item = item.nextSibling; + } + return null; +} + +// Tests that uninstalling a normal add-on from the list view can be undone +add_test(function() { + var ID = "addon1@tests.mozilla.org"; + var list = gDocument.getElementById("addon-list"); + + // Select the extensions category + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + ok(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL, "Add-on should require a restart to uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(!button.hidden, "Restart button should not be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + run_next_test(); + }); + }); +}); + +// Tests that uninstalling a restartless add-on from the list view can be undone +add_test(function() { + var ID = "addon2@tests.mozilla.org"; + var list = gDocument.getElementById("addon-list"); + + // Select the extensions category + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(aAddon.isActive, "Add-on should be active"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL, "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + ok(aAddon.isActive, "Add-on should be active"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + run_next_test(); + }); + }); +}); + +// Tests that uninstalling a disabled restartless add-on from the list view can +// be undone and doesn't re-enable +add_test(function() { + var ID = "addon2@tests.mozilla.org"; + var list = gDocument.getElementById("addon-list"); + + // Select the extensions category + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + AddonManager.getAddonByID(ID, function(aAddon) { + aAddon.userDisabled = true; + + ok(!aAddon.isActive, "Add-on should be inactive"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL, "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + ok(!aAddon.isActive, "Add-on should be inactive"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + aAddon.userDisabled = false; + ok(aAddon.isActive, "Add-on should be active"); + + run_next_test(); + }); + }); +}); + +// Tests that uninstalling a normal add-on from the search view can be undone +add_test(function() { + var ID = "addon1@tests.mozilla.org"; + var list = gDocument.getElementById("search-list"); + + var searchBox = gManagerWindow.document.getElementById("header-search"); + searchBox.value = "Uninstall"; + + EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "search", "View should have changed to search"); + + // Make sure to show local add-ons + EventUtils.synthesizeMouseAtCenter(gDocument.getElementById("search-filter-local"), { }, gManagerWindow); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + ok(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL, "Add-on should require a restart to uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(!button.hidden, "Restart button should not be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + run_next_test(); + }); + }); +}); + +// Tests that uninstalling a restartless add-on from the search view can be undone +add_test(function() { + var ID = "addon2@tests.mozilla.org"; + var list = gDocument.getElementById("search-list"); + + var searchBox = gManagerWindow.document.getElementById("header-search"); + searchBox.value = "Uninstall"; + + EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "search", "View should have changed to search"); + + // Make sure to show local add-ons + EventUtils.synthesizeMouseAtCenter(gDocument.getElementById("search-filter-local"), { }, gManagerWindow); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(aAddon.isActive, "Add-on should be active"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL, "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + ok(aAddon.isActive, "Add-on should be active"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + run_next_test(); + }); + }); +}); + +// Tests that uninstalling a disabled restartless add-on from the search view can +// be undone and doesn't re-enable +add_test(function() { + var ID = "addon2@tests.mozilla.org"; + var list = gDocument.getElementById("search-list"); + + var searchBox = gManagerWindow.document.getElementById("header-search"); + searchBox.value = "Uninstall"; + + EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "search", "View should have changed to search"); + + // Make sure to show local add-ons + EventUtils.synthesizeMouseAtCenter(gDocument.getElementById("search-filter-local"), { }, gManagerWindow); + + AddonManager.getAddonByID(ID, function(aAddon) { + aAddon.userDisabled = true; + + ok(!aAddon.isActive, "Add-on should be inactive"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + ok(!aAddon.isActive, "Add-on should be inactive"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + aAddon.userDisabled = false; + ok(aAddon.isActive, "Add-on should be active"); + + run_next_test(); + }); + }); +}); + +// Tests that uninstalling a normal add-on from the details view switches back +// to the list view and can be undone +add_test(function() { + var ID = "addon1@tests.mozilla.org"; + var list = gDocument.getElementById("addon-list"); + + // Select the extensions category + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + ok(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL, "Add-on should require a restart to uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 1 }, gManagerWindow); + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 2 }, gManagerWindow); + wait_for_view_load(gManagerWindow, function() { + is(get_current_view(gManagerWindow).id, "detail-view", "Should be in the detail view"); + + var button = gDocument.getElementById("detail-uninstall-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + + // Force XBL to apply + item.clientTop; + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(!button.hidden, "Restart button should not be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + run_next_test(); + }); + }); + }); + }); +}); + +// Tests that uninstalling a restartless add-on from the details view switches +// back to the list view and can be undone +add_test(function() { + var ID = "addon2@tests.mozilla.org"; + var list = gDocument.getElementById("addon-list"); + + // Select the extensions category + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(aAddon.isActive, "Add-on should be active"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 1 }, gManagerWindow); + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 2 }, gManagerWindow); + wait_for_view_load(gManagerWindow, function() { + is(get_current_view(gManagerWindow).id, "detail-view", "Should be in the detail view"); + + var button = gDocument.getElementById("detail-uninstall-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + // Force XBL to apply + item.clientTop; + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + ok(aAddon.isActive, "Add-on should be active"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + run_next_test(); + }); + }); + }); + }); +}); + +// Tests that uninstalling a restartless add-on from the details view switches +// back to the list view and can be undone and doesn't re-enable +add_test(function() { + var ID = "addon2@tests.mozilla.org"; + var list = gDocument.getElementById("addon-list"); + + // Select the extensions category + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + AddonManager.getAddonByID(ID, function(aAddon) { + aAddon.userDisabled = true; + + ok(!aAddon.isActive, "Add-on should be inactive"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 1 }, gManagerWindow); + EventUtils.synthesizeMouseAtCenter(item, { clickCount: 2 }, gManagerWindow); + wait_for_view_load(gManagerWindow, function() { + is(get_current_view(gManagerWindow).id, "detail-view", "Should be in the detail view"); + + var button = gDocument.getElementById("detail-uninstall-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + // Force XBL to apply + item.clientTop; + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + ok(!aAddon.isActive, "Add-on should be inactive"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + aAddon.userDisabled = false; + ok(aAddon.isActive, "Add-on should be active"); + + run_next_test(); + }); + }); + }); + }); +}); + +// Tests that a normal add-on pending uninstall shows up in the list view +add_test(function() { + var ID = "addon1@tests.mozilla.org"; + var list = gDocument.getElementById("addon-list"); + + // Select the extensions category + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + ok(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL, "Add-on should require a restart to uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(!button.hidden, "Restart button should not be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + gCategoryUtilities.openType("plugin", function() { + is(gCategoryUtilities.selectedCategory, "plugin", "View should have changed to plugin"); + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(!button.hidden, "Restart button should not be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + run_next_test(); + }); + }); + }); + }); +}); + +// Tests that a normal add-on pending uninstall shows up in the search view +add_test(function() { + var ID = "addon1@tests.mozilla.org"; + var list = gDocument.getElementById("search-list"); + + var searchBox = gManagerWindow.document.getElementById("header-search"); + searchBox.value = "Uninstall"; + + EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "search", "View should have changed to search"); + + // Make sure to show local add-ons + EventUtils.synthesizeMouseAtCenter(gDocument.getElementById("search-filter-local"), { }, gManagerWindow); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + ok(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL, "Add-on should require a restart to uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(!button.hidden, "Restart button should not be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + gCategoryUtilities.openType("plugin", function() { + is(gCategoryUtilities.selectedCategory, "plugin", "View should have changed to plugin"); + searchBox.value = "Uninstall"; + + EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "search", "View should have changed to search"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(!!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(!button.hidden, "Restart button should not be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + run_next_test(); + }); + }); + }); + }); +}); + +// Tests that switching away from the list view finalises the uninstall of +// multiple restartless add-ons +add_test(function() { + var ID = "addon2@tests.mozilla.org"; + var ID2 = "addon6@tests.mozilla.org"; + var list = gDocument.getElementById("addon-list"); + + // Select the extensions category + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(aAddon.isActive, "Add-on should be active"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + ok(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL, "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + item = get_item_in_list(ID2, list); + isnot(item, null, "Should have found the add-on in the list"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + gCategoryUtilities.openType("plugin", function() { + is(gCategoryUtilities.selectedCategory, "plugin", "View should have changed to extension"); + + AddonManager.getAddonsByIDs([ID, ID2], function([aAddon, aAddon2]) { + is(aAddon, null, "Add-on should no longer be installed"); + is(aAddon2, null, "Second add-on should no longer be installed"); + + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + var item = get_item_in_list(ID, list); + is(item, null, "Should not have found the add-on in the list"); + item = get_item_in_list(ID2, list); + is(item, null, "Should not have found the second add-on in the list"); + + run_next_test(); + }); + }); + }); + }); + }); +}); + +// Tests that switching away from the search view finalises the uninstall of +// multiple restartless add-ons +add_test(function() { + var ID = "addon3@tests.mozilla.org"; + var ID2 = "addon7@tests.mozilla.org"; + var list = gDocument.getElementById("search-list"); + + var searchBox = gManagerWindow.document.getElementById("header-search"); + searchBox.value = "Uninstall"; + + EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "search", "View should have changed to search"); + + // Make sure to show local add-ons + EventUtils.synthesizeMouseAtCenter(gDocument.getElementById("search-filter-local"), { }, gManagerWindow); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(aAddon.isActive, "Add-on should be active"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL, "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + item = get_item_in_list(ID2, list); + isnot(item, null, "Should have found the add-on in the list"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + gCategoryUtilities.openType("plugin", function() { + is(gCategoryUtilities.selectedCategory, "plugin", "View should have changed to extension"); + + AddonManager.getAddonsByIDs([ID, ID2], function([aAddon, aAddon2]) { + is(aAddon, null, "Add-on should no longer be installed"); + is(aAddon2, null, "Second add-on should no longer be installed"); + + searchBox.value = "Uninstall"; + + EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "search", "View should have changed to search"); + + var item = get_item_in_list(ID, list); + is(item, null, "Should not have found the add-on in the list"); + item = get_item_in_list(ID2, list); + is(item, null, "Should not have found the second add-on in the list"); + + run_next_test(); + }); + }); + }); + }); + }); +}); + +// Tests that closing the manager from the list view finalises the uninstall of +// multiple restartless add-ons +add_test(function() { + var ID = "addon4@tests.mozilla.org"; + var ID2 = "addon8@tests.mozilla.org"; + var list = gDocument.getElementById("addon-list"); + + // Select the extensions category + gCategoryUtilities.openType("extension", function() { + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(aAddon.isActive, "Add-on should be active"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL, "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + item = get_item_in_list(ID2, list); + isnot(item, null, "Should have found the add-on in the list"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + close_manager(gManagerWindow, function() { + AddonManager.getAddonsByIDs([ID, ID2], function([aAddon, aAddon2]) { + is(aAddon, null, "Add-on should no longer be installed"); + is(aAddon2, null, "Second add-on should no longer be installed"); + + open_manager(null, function(aWindow) { + gManagerWindow = aWindow; + gDocument = gManagerWindow.document; + gCategoryUtilities = new CategoryUtilities(gManagerWindow); + var list = gDocument.getElementById("addon-list"); + + is(gCategoryUtilities.selectedCategory, "extension", "View should have changed to extension"); + + var item = get_item_in_list(ID, list); + is(item, null, "Should not have found the add-on in the list"); + item = get_item_in_list(ID2, list); + is(item, null, "Should not have found the second add-on in the list"); + + run_next_test(); + }); + }); + }); + }); + }); +}); + +// Tests that closing the manager from the search view finalises the uninstall +// of multiple restartless add-ons +add_test(function() { + var ID = "addon5@tests.mozilla.org"; + var ID2 = "addon9@tests.mozilla.org"; + var list = gDocument.getElementById("search-list"); + + var searchBox = gManagerWindow.document.getElementById("header-search"); + searchBox.value = "Uninstall"; + + EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "search", "View should have changed to search"); + + // Make sure to show local add-ons + EventUtils.synthesizeMouseAtCenter(gDocument.getElementById("search-filter-local"), { }, gManagerWindow); + + AddonManager.getAddonByID(ID, function(aAddon) { + ok(aAddon.isActive, "Add-on should be active"); + ok(!(aAddon.operationsRequiringRestart & AddonManager.OP_NEEDS_RESTART_UNINSTALL), "Add-on should not require a restart to uninstall"); + ok(!(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should not be pending uninstall"); + + var item = get_item_in_list(ID, list); + isnot(item, null, "Should have found the add-on in the list"); + + var button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + // Force XBL to apply + item.clientTop; + + is(item.getAttribute("pending"), "uninstall", "Add-on should be uninstalling"); + + ok(aAddon.pendingOperations & AddonManager.PENDING_UNINSTALL, "Add-on should be pending uninstall"); + ok(!aAddon.isActive, "Add-on should be inactive"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "restart-btn"); + isnot(button, null, "Should have a restart button"); + ok(button.hidden, "Restart button should be hidden"); + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "undo-btn"); + isnot(button, null, "Should have an undo button"); + + item = get_item_in_list(ID2, list); + isnot(item, null, "Should have found the add-on in the list"); + + button = gDocument.getAnonymousElementByAttribute(item, "anonid", "remove-btn"); + isnot(button, null, "Should have a remove button"); + ok(!button.disabled, "Button should not be disabled"); + + EventUtils.synthesizeMouseAtCenter(button, { }, gManagerWindow); + + close_manager(gManagerWindow, function() { + AddonManager.getAddonsByIDs([ID, ID2], function([aAddon, aAddon2]) { + is(aAddon, null, "Add-on should no longer be installed"); + is(aAddon2, null, "Second add-on should no longer be installed"); + + open_manager("addons://list/extension", function(aWindow) { + gManagerWindow = aWindow; + gDocument = gManagerWindow.document; + gCategoryUtilities = new CategoryUtilities(gManagerWindow); + var list = gDocument.getElementById("search-list"); + var searchBox = gManagerWindow.document.getElementById("header-search"); + + searchBox.value = "Uninstall"; + + EventUtils.synthesizeMouseAtCenter(searchBox, { }, gManagerWindow); + EventUtils.synthesizeKey("VK_RETURN", { }, gManagerWindow); + + wait_for_view_load(gManagerWindow, function() { + is(gCategoryUtilities.selectedCategory, "search", "View should have changed to search"); + + var item = get_item_in_list(ID, list); + is(item, null, "Should not have found the add-on in the list"); + item = get_item_in_list(ID2, list); + is(item, null, "Should not have found the second add-on in the list"); + + run_next_test(); + }); + }); + }); + }); + }); + }); +}); |