Bug 1551490 - Fix browser_reinstall.js with HTML about:addons r=robwu

Differential Revision: https://phabricator.services.mozilla.com/D31496

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Luca Greco 2019-06-10 00:03:42 +00:00
Родитель 6e4fdcf355
Коммит 0da35261b6
3 изменённых файлов: 347 добавлений и 148 удалений

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

@ -8,10 +8,38 @@
const {AddonTestUtils} = ChromeUtils.import("resource://testing-common/AddonTestUtils.jsm");
const ID = "reinstall@tests.mozilla.org";
const testIdSuffix = "@tests.mozilla.org";
let gManagerWindow, xpi1, xpi2;
function get_test_items_in_list(aManager) {
let item = aManager.document.getElementById("addon-list").firstChild;
let items = [];
while (item) {
if (item.localName != "richlistitem") {
item = item.nextSibling;
continue;
}
if (!item.mAddon || item.mAddon.id.substring(item.mAddon.id.length - testIdSuffix.length) == testIdSuffix)
items.push(item);
item = item.nextSibling;
}
return items;
}
function htmlDoc() {
return gManagerWindow.document.getElementById("html-view-browser").contentDocument;
}
function get_list_item_count() {
if (gManagerWindow.useHtmlViews) {
return htmlDoc()
.querySelectorAll(`addon-card[addon-id$="${testIdSuffix}"]`)
.length;
}
return get_test_items_in_list(gManagerWindow).length;
}
@ -19,16 +47,36 @@ function get_node(parent, anonid) {
return parent.ownerDocument.getAnonymousElementByAttribute(parent, "anonid", anonid);
}
function removeItem(item) {
let button;
if (gManagerWindow.useHtmlViews) {
button = item.querySelector('[action="remove"]');
button.click();
} else {
button = get_node(item, "remove-btn");
EventUtils.synthesizeMouseAtCenter(button, { }, button.ownerGlobal);
}
}
function get_class_node(parent, cls) {
return parent.ownerDocument.getAnonymousElementByAttribute(parent, "class", cls);
}
function hasPendingMessage(item, msg) {
if (gManagerWindow.useHtmlViews) {
let messageBar = htmlDoc().querySelector(`message-bar[addon-id="${item.addon.id}"`);
is_element_visible(messageBar, msg);
} else {
is_element_visible(get_class_node(item, "pending"), msg);
}
}
async function install_addon(xpi) {
let install = await AddonManager.getInstallForFile(xpi, "application/x-xpinstall");
return install.install();
}
var check_addon = async function(aAddon, aVersion) {
async function check_addon(aAddon, aVersion) {
is(get_list_item_count(), 1, "Should be one item in the list");
is(aAddon.version, aVersion, "Add-on should have the right version");
@ -38,18 +86,214 @@ var check_addon = async function(aAddon, aVersion) {
// Force XBL to apply
item.clientTop;
let { version } = await get_tooltip_info(item);
let { version } = await get_tooltip_info(item, gManagerWindow);
is(version, aVersion, "Version should be correct");
if (aAddon.userDisabled)
if (gManagerWindow.useHtmlViews) {
const l10nAttrs = item.ownerDocument.l10n.getAttributes(item.querySelector(".addon-name"));
if (aAddon.userDisabled) {
Assert.deepEqual(l10nAttrs, {id: "addon-name-disabled", args: {name: aAddon.name}},
"localized addon name is marked as disabled");
} else {
Assert.deepEqual(l10nAttrs, {id: null, args: null},
"localized addon name is not marked as disabled");
}
return;
}
if (aAddon.userDisabled) {
is_element_visible(get_class_node(item, "disabled-postfix"), "Disabled postfix should be hidden");
else
} else {
is_element_hidden(get_class_node(item, "disabled-postfix"), "Disabled postfix should be hidden");
};
}
}
async function wait_for_addon_item_added(addonId) {
if (gManagerWindow.useHtmlViews) {
await BrowserTestUtils.waitForEvent(htmlDoc().querySelector("addon-list"), "add");
const item = get_addon_element(gManagerWindow, addonId);
ok(item, `Found addon card for ${addonId}`);
}
}
async function wait_for_addon_item_removed(addonId) {
if (gManagerWindow.useHtmlViews) {
await BrowserTestUtils.waitForEvent(htmlDoc().querySelector("addon-list"), "remove");
const item = get_addon_element(gManagerWindow, addonId);
ok(!item, `There shouldn't be an addon card for ${addonId}`);
}
}
async function wait_for_addon_item_updated(addonId) {
if (gManagerWindow.useHtmlViews) {
await BrowserTestUtils.waitForEvent(get_addon_element(gManagerWindow, addonId), "update");
}
}
// Install version 1 then upgrade to version 2 with the manager open
async function test_upgrade_v1_to_v2() {
let promiseItemAdded = wait_for_addon_item_added(ID);
await install_addon(xpi1);
await promiseItemAdded;
let addon = await promiseAddonByID(ID);
await check_addon(addon, "1.0");
ok(!addon.userDisabled, "Add-on should not be disabled");
let promiseItemUpdated = wait_for_addon_item_updated(ID);
await install_addon(xpi2);
await promiseItemUpdated;
addon = await promiseAddonByID(ID);
await check_addon(addon, "2.0");
ok(!addon.userDisabled, "Add-on should not be disabled");
let promiseItemRemoved = wait_for_addon_item_removed(ID);
await addon.uninstall();
await promiseItemRemoved;
is(get_list_item_count(), 0, "Should be no items in the list");
}
// Install version 1 mark it as disabled then upgrade to version 2 with the
// manager open
async function test_upgrade_disabled_v1_to_v2() {
let promiseItemAdded = wait_for_addon_item_added(ID);
await install_addon(xpi1);
await promiseItemAdded;
let promiseItemUpdated = wait_for_addon_item_updated(ID);
let addon = await promiseAddonByID(ID);
await addon.disable();
await promiseItemUpdated;
await check_addon(addon, "1.0");
ok(addon.userDisabled, "Add-on should be disabled");
promiseItemUpdated = wait_for_addon_item_updated(ID);
await install_addon(xpi2);
await promiseItemUpdated;
addon = await promiseAddonByID(ID);
await check_addon(addon, "2.0");
ok(addon.userDisabled, "Add-on should be disabled");
let promiseItemRemoved = wait_for_addon_item_removed(ID);
await addon.uninstall();
await promiseItemRemoved;
is(get_list_item_count(), 0, "Should be no items in the list");
}
// Install version 1 click the remove button and then upgrade to version 2 with
// the manager open
async function test_upgrade_pending_uninstall_v1_to_v2() {
let promiseItemAdded = wait_for_addon_item_added(ID);
await install_addon(xpi1);
await promiseItemAdded;
let addon = await promiseAddonByID(ID);
await check_addon(addon, "1.0");
ok(!addon.userDisabled, "Add-on should not be disabled");
let item = get_addon_element(gManagerWindow, ID);
let promiseItemRemoved = wait_for_addon_item_removed(ID);
removeItem(item);
// Force XBL to apply
item.clientTop;
await promiseItemRemoved;
ok(!!(addon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall");
hasPendingMessage(item, "Pending message should be visible");
promiseItemAdded = wait_for_addon_item_added(ID);
await install_addon(xpi2);
await promiseItemAdded;
addon = await promiseAddonByID(ID);
await check_addon(addon, "2.0");
ok(!addon.userDisabled, "Add-on should not be disabled");
promiseItemRemoved = wait_for_addon_item_removed(ID);
await addon.uninstall();
await promiseItemRemoved;
is(get_list_item_count(), 0, "Should be no items in the list");
}
// Install version 1, disable it, click the remove button and then upgrade to
// version 2 with the manager open
async function test_upgrade_pending_uninstall_disabled_v1_to_v2() {
let promiseItemAdded = wait_for_addon_item_added(ID);
await install_addon(xpi1);
await promiseItemAdded;
let promiseItemUpdated = wait_for_addon_item_updated(ID);
let addon = await promiseAddonByID(ID);
await addon.disable();
await promiseItemUpdated;
await check_addon(addon, "1.0");
ok(addon.userDisabled, "Add-on should be disabled");
let item = get_addon_element(gManagerWindow, ID);
let promiseItemRemoved = wait_for_addon_item_removed(ID);
removeItem(item);
// Force XBL to apply
item.clientTop;
await promiseItemRemoved;
ok(!!(addon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall");
hasPendingMessage(item, "Pending message should be visible");
promiseItemAdded = wait_for_addon_item_added(ID);
await install_addon(xpi2);
addon = await promiseAddonByID(ID);
await promiseItemAdded;
await check_addon(addon, "2.0");
ok(addon.userDisabled, "Add-on should be disabled");
promiseItemRemoved = wait_for_addon_item_removed(ID);
await addon.uninstall();
await promiseItemRemoved;
is(get_list_item_count(), 0, "Should be no items in the list");
}
async function test_upgrades(useHtmlViews) {
await SpecialPowers.pushPrefEnv({
set: [["extensions.htmlaboutaddons.enabled", useHtmlViews]],
});
// Close existing about:addons tab if a test failure has
// prevented it from being closed.
if (gManagerWindow) {
await close_manager(gManagerWindow);
}
gManagerWindow = await open_manager("addons://list/extension");
is(gManagerWindow.useHtmlViews, useHtmlViews,
"Got about:addons window in the expected mode");
await test_upgrade_v1_to_v2();
await test_upgrade_disabled_v1_to_v2();
await test_upgrade_pending_uninstall_v1_to_v2();
await test_upgrade_pending_uninstall_disabled_v1_to_v2();
await close_manager(gManagerWindow);
gManagerWindow = null;
// No popPrefEnv because of bug 1557397.
}
add_task(async function setup() {
gManagerWindow = await open_manager("addons://list/extension");
xpi1 = await AddonTestUtils.createTempWebExtensionFile({
manifest: {
version: "1.0",
@ -63,99 +307,15 @@ add_task(async function setup() {
applications: {gecko: {id: ID}},
},
});
// Accept all prompts.
mockPromptService()._response = 0;
});
// Install version 1 then upgrade to version 2 with the manager open
add_task(async function() {
await install_addon(xpi1);
let addon = await promiseAddonByID(ID);
await check_addon(addon, "1.0");
ok(!addon.userDisabled, "Add-on should not be disabled");
await install_addon(xpi2);
addon = await promiseAddonByID(ID);
await check_addon(addon, "2.0");
ok(!addon.userDisabled, "Add-on should not be disabled");
await addon.uninstall();
is(get_list_item_count(), 0, "Should be no items in the list");
add_task(function run_tests_on_XUL_aboutaddons() {
return test_upgrades(false);
});
// Install version 1 mark it as disabled then upgrade to version 2 with the
// manager open
add_task(async function() {
await install_addon(xpi1);
let addon = await promiseAddonByID(ID);
await addon.disable();
await check_addon(addon, "1.0");
ok(addon.userDisabled, "Add-on should be disabled");
await install_addon(xpi2);
addon = await promiseAddonByID(ID);
await check_addon(addon, "2.0");
ok(addon.userDisabled, "Add-on should be disabled");
await addon.uninstall();
is(get_list_item_count(), 0, "Should be no items in the list");
});
// Install version 1 click the remove button and then upgrade to version 2 with
// the manager open
add_task(async function() {
await install_addon(xpi1);
let addon = await promiseAddonByID(ID);
await check_addon(addon, "1.0");
ok(!addon.userDisabled, "Add-on should not be disabled");
let item = get_addon_element(gManagerWindow, ID);
EventUtils.synthesizeMouseAtCenter(get_node(item, "remove-btn"), { }, gManagerWindow);
// Force XBL to apply
item.clientTop;
ok(!!(addon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall");
is_element_visible(get_class_node(item, "pending"), "Pending message should be visible");
await install_addon(xpi2);
addon = await promiseAddonByID(ID);
await check_addon(addon, "2.0");
ok(!addon.userDisabled, "Add-on should not be disabled");
await addon.uninstall();
is(get_list_item_count(), 0, "Should be no items in the list");
});
// Install version 1, disable it, click the remove button and then upgrade to
// version 2 with the manager open
add_task(async function() {
await install_addon(xpi1);
let addon = await promiseAddonByID(ID);
await addon.disable();
await check_addon(addon, "1.0");
ok(addon.userDisabled, "Add-on should be disabled");
let item = get_addon_element(gManagerWindow, ID);
EventUtils.synthesizeMouseAtCenter(get_node(item, "remove-btn"), { }, gManagerWindow);
// Force XBL to apply
item.clientTop;
ok(!!(addon.pendingOperations & AddonManager.PENDING_UNINSTALL), "Add-on should be pending uninstall");
is_element_visible(get_class_node(item, "pending"), "Pending message should be visible");
await install_addon(xpi2);
addon = await promiseAddonByID(ID);
await check_addon(addon, "2.0");
ok(addon.userDisabled, "Add-on should be disabled");
await addon.uninstall();
is(get_list_item_count(), 0, "Should be no items in the list");
});
add_task(function end_test() {
return close_manager(gManagerWindow);
add_task(function run_tests_on_HTML_aboutaddons() {
return test_upgrades(true);
});

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

@ -8,8 +8,34 @@ var gProvider;
var gManagerWindow;
var gCategoryUtilities;
async function test() {
waitForExplicitFinish();
function getName(item) {
if (gManagerWindow.useHtmlViews) {
return item.querySelector(".addon-name").textContent;
}
return gManagerWindow.document.getAnonymousElementByAttribute(item, "anonid", "name").textContent;
}
async function getUpdateButton(item) {
if (gManagerWindow.useHtmlViews) {
let button = item.querySelector('[action="install-update"]');
let panel = button.closest("panel-list");
let shown = BrowserTestUtils.waitForEvent(panel, "shown");
panel.show();
await shown;
return button;
}
return gManagerWindow.document.getAnonymousElementByAttribute(item, "anonid", "update-btn");
}
async function test_updateid() {
// Close the existing about:addons tab and unrestier the existing MockProvider
// instance if a previous failed test has not been able to clear them.
if (gManagerWindow) {
await close_manager(gManagerWindow);
}
if (gProvider) {
gProvider.unregister();
}
gProvider = new MockProvider();
@ -20,19 +46,10 @@ async function test() {
applyBackgroundUpdates: AddonManager.AUTOUPDATE_DISABLE,
}]);
let aWindow = await open_manager("addons://list/extension");
gManagerWindow = aWindow;
gManagerWindow = await open_manager("addons://list/extension");
gCategoryUtilities = new CategoryUtilities(gManagerWindow);
run_next_test();
}
async function end_test() {
await close_manager(gManagerWindow);
finish();
}
add_test(async function() {
await gCategoryUtilities.openType("extension");
gProvider.createInstalls([{
name: "updated add-on",
existingAddon: gProvider.addons[0],
@ -45,18 +62,39 @@ add_test(async function() {
gProvider.installs[0]._addonToInstall = newAddon;
var item = get_addon_element(gManagerWindow, "addon1@tests.mozilla.org");
var name = gManagerWindow.document.getAnonymousElementByAttribute(item, "anonid", "name");
is(name.textContent, "manually updating addon", "Should show the old name in the list");
get_tooltip_info(item).then(({ name, version }) => {
is(name, "manually updating addon", "Should show the old name in the tooltip");
is(version, "1.0", "Should still show the old version in the tooltip");
is(getName(item), "manually updating addon", "Should show the old name in the list");
const {name, version} = await get_tooltip_info(item, gManagerWindow);
is(name, "manually updating addon", "Should show the old name in the tooltip");
is(version, "1.0", "Should still show the old version in the tooltip");
var update = gManagerWindow.document.getAnonymousElementByAttribute(item, "anonid", "update-btn");
is_element_visible(update, "Update button should be visible");
var update = await getUpdateButton(item);
is_element_visible(update, "Update button should be visible");
item = get_addon_element(gManagerWindow, "addon2@tests.mozilla.org");
is(item, null, "Should not show the new version in the list");
item = get_addon_element(gManagerWindow, "addon2@tests.mozilla.org");
is(item, null, "Should not show the new version in the list");
run_next_test();
await close_manager(gManagerWindow);
gManagerWindow = null;
gProvider.unregister();
gProvider = null;
}
add_task(async function test_XUL_updateid() {
await SpecialPowers.pushPrefEnv({
set: [["extensions.htmlaboutaddons.enabled", false]],
});
await test_updateid();
// No popPrefEnv because of bug 1557397.
});
add_task(async function test_HTML_updateid() {
await SpecialPowers.pushPrefEnv({
set: [["extensions.htmlaboutaddons.enabled", true]],
});
await test_updateid();
// No popPrefEnv because of bug 1557397.
});

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

@ -212,16 +212,37 @@ function run_next_test() {
executeSoon(() => log_exceptions(test));
}
var get_tooltip_info = async function(addon) {
let managerWindow = addon.ownerGlobal;
var get_tooltip_info = async function(addonEl, managerWindow) {
if (managerWindow && managerWindow.useHtmlViews) {
// Extract from title attribute.
const {addon} = addonEl;
const name = addon.name;
const nameEl = addonEl.querySelector(".addon-name");
// The popup code uses a triggering event's target to set the
let nameWithVersion = nameEl.title;
if (addonEl.addon.userDisabled) {
// TODO - Bug 1558077: Currently Fluent is clearing the addon title
// when the addon is disabled, fixing it requires changes to the
// HTML about:addons localized strings, and then remove this
// workaround.
nameWithVersion = `${name} ${addon.version}`;
}
return {
name,
version: nameWithVersion.substring(name.length + 1),
};
}
// Retrieve the tooltip from the XUL about:addons view,
// the popup code uses a triggering event's target to set the
// document.tooltipNode property.
let nameNode = addon.ownerDocument.getAnonymousElementByAttribute(addon, "anonid", "name");
let event = new managerWindow.CustomEvent("TriggerEvent");
let doc = addonEl.ownerDocument;
let nameNode = doc.getAnonymousElementByAttribute(addonEl, "anonid", "name");
let event = new doc.ownerGlobal.CustomEvent("TriggerEvent");
nameNode.dispatchEvent(event);
let tooltip = managerWindow.document.getElementById("addonitem-tooltip");
let tooltip = doc.getElementById("addonitem-tooltip");
let promise = BrowserTestUtils.waitForEvent(tooltip, "popupshown");
tooltip.openPopup(nameNode, "after_start", 0, 0, false, false, event);
@ -233,7 +254,7 @@ var get_tooltip_info = async function(addon) {
tooltip.hidePopup();
await promise;
let expectedName = addon.getAttribute("name");
let expectedName = addonEl.getAttribute("name");
is(tiptext.substring(0, expectedName.length), expectedName,
"Tooltip should always start with the expected name");
@ -273,26 +294,6 @@ function get_current_view(aManager) {
return view;
}
function get_test_items_in_list(aManager) {
var tests = "@tests.mozilla.org";
let item = aManager.document.getElementById("addon-list").firstChild;
let items = [];
while (item) {
if (item.localName != "richlistitem") {
item = item.nextSibling;
continue;
}
if (!item.mAddon || item.mAddon.id.substring(item.mAddon.id.length - tests.length) == tests)
items.push(item);
item = item.nextSibling;
}
return items;
}
function check_all_in_list(aManager, aIds, aIgnoreExtras) {
var doc = aManager.document;
var list = doc.getElementById("addon-list");