diff options
Diffstat (limited to 'toolkit/mozapps/extensions/test/browser/browser_select_selection.js')
-rw-r--r-- | toolkit/mozapps/extensions/test/browser/browser_select_selection.js | 268 |
1 files changed, 268 insertions, 0 deletions
diff --git a/toolkit/mozapps/extensions/test/browser/browser_select_selection.js b/toolkit/mozapps/extensions/test/browser/browser_select_selection.js new file mode 100644 index 0000000000..cf83e7c1ee --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/browser_select_selection.js @@ -0,0 +1,268 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// Tests the selection part of the post-app-update dialog + +var gProvider; +var gWin; + +const PROFILE = AddonManager.SCOPE_PROFILE; +const USER = AddonManager.SCOPE_USER; +const APP = AddonManager.SCOPE_APPLICATION; +const SYSTEM = AddonManager.SCOPE_SYSTEM; +const DIST = -1; + +// The matrix of testcases for the selection part of the UI +// Note that the isActive flag has the value it had when the previous version +// of the application ran with this add-on. +var ADDONS = [ + //userDisabled wasAppDisabled isAppDisabled isActive hasUpdate autoUpdate scope defaultKeep position keepString disableString + [false, true, false, false, false, true, PROFILE, true, 42, "enabled", ""], // 0 + [false, true, false, false, true, true, PROFILE, true, 43, "enabled", ""], // 1 + [false, true, false, false, true, false, PROFILE, true, 52, "unneededupdate", ""], // 2 + [false, false, false, true, false, true, PROFILE, true, 53, "", "disabled"], // 3 + [false, false, false, true, true, true, PROFILE, true, 54, "", "disabled"], // 4 + [false, false, false, true, true, false, PROFILE, true, 55, "unneededupdate", "disabled"], // 5 + [false, true, true, false, false, true, PROFILE, true, 56, "incompatible", ""], // 6 + [false, true, true, false, true, true, PROFILE, true, 57, "autoupdate", ""], // 7 + [false, true, true, false, true, false, PROFILE, true, 58, "neededupdate", ""], // 8 + [false, false, true, true, false, true, PROFILE, true, 59, "incompatible", "disabled"], // 9 + [false, true, true, true, true, true, PROFILE, true, 44, "autoupdate", "disabled"], // 10 + [false, true, true, true, true, false, PROFILE, true, 45, "neededupdate", "disabled"], // 11 + [true, false, false, false, false, true, PROFILE, false, 46, "enabled", ""], // 12 + [true, false, false, false, true, true, PROFILE, false, 47, "enabled", ""], // 13 + [true, false, false, false, true, false, PROFILE, false, 48, "unneededupdate", ""], // 14 + + // userDisabled and isActive cannot be true on startup + + [true, true, true, false, false, true, PROFILE, false, 49, "incompatible", ""], // 15 + [true, true, true, false, true, true, PROFILE, false, 50, "autoupdate", ""], // 16 + [true, true, true, false, true, false, PROFILE, false, 51, "neededupdate", ""], // 17 + + // userDisabled and isActive cannot be true on startup + + // Being in a different scope should make little difference except no updates are possible so don't exhaustively test each + [false, false, false, true, true, false, USER, false, 0, "", "disabled"], // 18 + [true, true, false, false, true, false, USER, false, 1, "enabled", ""], // 19 + [false, true, true, true, true, false, USER, false, 2, "incompatible", "disabled"], // 20 + [true, true, true, false, true, false, USER, false, 3, "incompatible", ""], // 21 + [false, false, false, true, true, false, SYSTEM, false, 4, "", "disabled"], // 22 + [true, true, false, false, true, false, SYSTEM, false, 5, "enabled", ""], // 23 + [false, true, true, true, true, false, SYSTEM, false, 6, "incompatible", "disabled"], // 24 + [true, true, true, false, true, false, SYSTEM, false, 7, "incompatible", ""], // 25 + [false, false, false, true, true, false, APP, false, 8, "", "disabled"], // 26 + [true, true, false, false, true, false, APP, false, 9, "enabled", ""], // 27 + [false, true, true, true, true, false, APP, false, 10, "incompatible", "disabled"], // 28 + [true, true, true, false, true, false, APP, false, 11, "incompatible", ""], // 29 +]; + +function waitForView(aView, aCallback) { + var view = gWin.document.getElementById(aView); + if (view.parentNode.selectedPanel == view) { + aCallback(); + return; + } + + view.addEventListener("ViewChanged", function() { + view.removeEventListener("ViewChanged", arguments.callee, false); + aCallback(); + }, false); +} + +function getString(aName) { + if (!aName) + return ""; + + var strings = Services.strings.createBundle("chrome://mozapps/locale/extensions/selectAddons.properties"); + return strings.GetStringFromName("action." + aName); +} + +function getSourceString(aSource) { + if (!aSource) + return ""; + + var strings = Services.strings.createBundle("chrome://mozapps/locale/extensions/selectAddons.properties"); + switch (aSource) { + case PROFILE: + return strings.GetStringFromName("source.profile"); + case DIST: + return strings.GetStringFromName("source.bundled"); + default: + return strings.GetStringFromName("source.other"); + } +} + +function test() { + waitForExplicitFinish(); + + gProvider = new MockProvider(); + + // Set prefs for Distributed Extension Source tests. + Services.prefs.setBoolPref("extensions.installedDistroAddon.test3@tests.mozilla.org", true); + Services.prefs.setBoolPref("extensions.installedDistroAddon.test12@tests.mozilla.org", true); + Services.prefs.setBoolPref("extensions.installedDistroAddon.test15@tests.mozilla.org", true); + + for (let pos in ADDONS) { + let addonItem = ADDONS[pos]; + let addon = new MockAddon("test" + pos + "@tests.mozilla.org", + "Test Add-on " + pos, "extension"); + addon.version = "1.0"; + addon.userDisabled = addonItem[0]; + addon.appDisabled = addonItem[1]; + addon.isActive = addonItem[3]; + addon.applyBackgroundUpdates = addonItem[5] ? AddonManager.AUTOUPDATE_ENABLE + : AddonManager.AUTOUPDATE_DISABLE; + addon.scope = addonItem[6]; + + // Remove the upgrade permission from non-profile add-ons + if (addon.scope != AddonManager.SCOPE_PROFILE) + addon._permissions -= AddonManager.PERM_CAN_UPGRADE; + + addon.findUpdates = function(aListener, aReason, aAppVersion, aPlatformVersion) { + addon.appDisabled = addonItem[2]; + addon.isActive = addon.shouldBeActive; + + if (addonItem[4]) { + var newAddon = new MockAddon(this.id, this.name, "extension"); + newAddon.version = "2.0"; + var install = new MockInstall(this.name, this.type, newAddon); + install.existingAddon = this; + aListener.onUpdateAvailable(this, install); + } + + aListener.onUpdateFinished(this, AddonManager.UPDATE_STATUS_NO_ERROR); + }; + + gProvider.addAddon(addon); + } + + gWin = Services.ww.openWindow(null, + "chrome://mozapps/content/extensions/selectAddons.xul", + "", + "chrome,centerscreen,dialog,titlebar", + null); + waitForFocus(function() { + waitForView("select", run_next_test); + }, gWin); +} + +function end_test() { + gWin.close(); + finish(); +} + +// Minimal test for the checking UI +add_test(function checking_test() { + // By the time we're here the progress bar should be full + var progress = gWin.document.getElementById("checking-progress"); + is(progress.mode, "determined", "Should be a determined progress bar"); + is(progress.value, progress.max, "Should be at full progress"); + + run_next_test(); +}); + +// Tests that the selection UI behaves correctly +add_test(function selection_test() { + function check_state() { + var str = addon[keep.checked ? 9 : 10]; + var expected = getString(str); + var showCheckbox = str == "neededupdate" || str == "unneededupdate"; + is(action.textContent, expected, "Action message should have the right text"); + is(!is_hidden(update), showCheckbox, "Checkbox should have the right visibility"); + is(is_hidden(action), showCheckbox, "Message should have the right visibility"); + if (showCheckbox) + ok(update.checked, "Optional update checkbox should be checked"); + + if (keep.checked) { + is(row.hasAttribute("active"), !addon[2] || hasUpdate, + "Add-on will be active if it isn't appDisabled or an update is available"); + + if (showCheckbox) { + info("Flipping update checkbox"); + EventUtils.synthesizeMouseAtCenter(update, { }, gWin); + is(row.hasAttribute("active"), str == "unneededupdate", + "If the optional update isn't needed then the add-on will still be active"); + + info("Flipping update checkbox"); + EventUtils.synthesizeMouseAtCenter(update, { }, gWin); + is(row.hasAttribute("active"), !addon[2] || hasUpdate, + "Add-on will be active if it isn't appDisabled or an update is available"); + } + } + else { + ok(!row.hasAttribute("active"), "Add-on won't be active when not keeping"); + + if (showCheckbox) { + info("Flipping update checkbox"); + EventUtils.synthesizeMouseAtCenter(update, { }, gWin); + ok(!row.hasAttribute("active"), + "Unchecking the update checkbox shouldn't make the add-on active"); + + info("Flipping update checkbox"); + EventUtils.synthesizeMouseAtCenter(update, { }, gWin); + ok(!row.hasAttribute("active"), + "Re-checking the update checkbox shouldn't make the add-on active"); + } + } + } + + is(gWin.document.getElementById("view-deck").selectedPanel.id, "select", + "Should be on the right view"); + + var pos = 0; + var scrollbox = gWin.document.getElementById("select-scrollbox"); + var scrollBoxObject = scrollbox.boxObject; + for (var row = gWin.document.getElementById("select-rows").firstChild; row; row = row.nextSibling) { + // Ignore separators but increase the position by a large amount so we + // can verify they were in the right place + if (row.localName == "separator") { + pos += 30; + continue; + } + + is(row._addon.type, "extension", "Should only be listing extensions"); + + // Ignore non-test add-ons that may be present + if (row.id.substr(-18) != "@tests.mozilla.org") + continue; + + var id = parseInt(row.id.substring(4, row.id.length - 18)); + var addon = ADDONS[id]; + + info("Testing add-on " + id); + scrollBoxObject.ensureElementIsVisible(row); + var keep = gWin.document.getAnonymousElementByAttribute(row, "anonid", "keep"); + var action = gWin.document.getAnonymousElementByAttribute(row, "class", "addon-action-message"); + var update = gWin.document.getAnonymousElementByAttribute(row, "anonid", "update"); + var source = gWin.document.getAnonymousElementByAttribute(row, "class", "addon-source"); + + if (id == 3 || id == 12 || id == 15) { + // Distro Installed To Profile + is(source.textContent, getSourceString(DIST), "Source message should have the right text for Distributed Addons"); + } else { + is(source.textContent, getSourceString(addon[6]), "Source message should have the right text"); + } + + // Non-profile add-ons don't appear to have updates since we won't install + // them + var hasUpdate = addon[4] && addon[6] == PROFILE; + + is(pos, addon[8], "Should have been in the right position"); + is(keep.checked, addon[7], "Keep checkbox should be in the right state"); + + check_state(); + + info("Flipping keep"); + EventUtils.synthesizeMouseAtCenter(keep, { }, gWin); + is(keep.checked, !addon[7], "Keep checkbox should be in the right state"); + + check_state(); + + pos++; + } + + is(pos, 60, "Should have seen the right number of add-ons"); + + run_next_test(); +}); |