Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
function pngArrayBuffer(size) {
const canvas = document.createElementNS(
"canvas"
);
canvas.height = canvas.width = size;
const ctx = canvas.getContext("2d");
ctx.fillStyle = "blue";
ctx.fillRect(0, 0, size, size);
return new Promise(resolve => {
canvas.toBlob(blob => {
const fileReader = new FileReader();
fileReader.onload = () => {
resolve(fileReader.result);
};
fileReader.readAsArrayBuffer(blob);
});
});
}
async function checkIconInView(view, name, findIcon) {
const manager = await open_manager(view);
const icon = findIcon(manager.document);
const size = Number(icon.src.match(/icon(\d+)\.png/)[1]);
is(
icon.clientWidth,
icon.clientHeight,
`The icon should be square in ${name}`
);
is(
size,
icon.clientWidth * window.devicePixelRatio,
`The correct icon size should have been chosen in ${name}`
);
await close_manager(manager);
}
add_task(async function test_addon_icon() {
// This test loads an extension with a variety of icon sizes, and checks that the
// fitting one is chosen. If this fails it's because you changed the icon size in
// about:addons but didn't update some AddonManager.getPreferredIconURL call.
const id = "@test-addon-icon";
const icons = {};
const files = {};
const file = await pngArrayBuffer(256);
for (let size = 1; size <= 256; ++size) {
let fileName = `icon${size}.png`;
icons[size] = fileName;
files[fileName] = file;
}
const extensionDefinition = {
useAddonManager: "temporary",
manifest: {
browser_specific_settings: {
gecko: { id },
},
icons,
},
files,
};
const extension = ExtensionTestUtils.loadExtension(extensionDefinition);
await extension.startup();
await checkIconInView("addons://list/extension", "list", doc => {
return getAddonCard(doc.defaultView, id).querySelector(".addon-icon");
});
await checkIconInView(
"addons://detail/" + encodeURIComponent(id),
"details",
doc => {
return getAddonCard(doc.defaultView, id).querySelector(".addon-icon");
}
);
await extension.unload();
});