Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
/* eslint max-len: ["error", 80] */
let htmlAboutAddonsWindow;
const HTML_NS = "http://www.w3.org/1999/xhtml";
function clickElement(el) {
el.dispatchEvent(new CustomEvent("click"));
}
function createMessageBar(messageBarStack, { attrs, children, onclose } = {}) {
const win = messageBarStack.ownerGlobal;
const messageBar = win.document.createElementNS(HTML_NS, "message-bar");
if (attrs) {
for (const [k, v] of Object.entries(attrs)) {
messageBar.setAttribute(k, v);
}
}
if (children) {
if (Array.isArray(children)) {
messageBar.append(...children);
} else {
messageBar.append(children);
}
}
messageBar.addEventListener("message-bar:close", onclose, { once: true });
messageBarStack.append(messageBar);
return messageBar;
}
add_setup(async function () {
htmlAboutAddonsWindow = await loadInitialView("extension");
registerCleanupFunction(() => closeView(htmlAboutAddonsWindow));
});
add_task(async function test_message_bar_stack() {
const win = htmlAboutAddonsWindow;
let messageBarStack = win.document.getElementById("abuse-reports-messages");
ok(messageBarStack, "Got a message-bar-stack in HTML about:addons page");
is(
messageBarStack.maxMessageBarCount,
3,
"Got the expected max-message-bar-count property"
);
is(
messageBarStack.childElementCount,
0,
"message-bar-stack is initially empty"
);
});
add_task(async function test_create_message_bar_create_and_onclose() {
const win = htmlAboutAddonsWindow;
const messageBarStack = win.document.getElementById("abuse-reports-messages");
let messageEl = win.document.createElementNS(HTML_NS, "span");
messageEl.textContent = "A message bar text";
let buttonEl = win.document.createElementNS(HTML_NS, "button");
buttonEl.textContent = "An action button";
let messageBar;
let onceMessageBarClosed = new Promise(resolve => {
messageBar = createMessageBar(messageBarStack, {
children: [messageEl, buttonEl],
onclose: resolve,
});
});
is(
messageBarStack.childElementCount,
1,
"message-bar-stack has a child element"
);
is(
messageBarStack.firstElementChild,
messageBar,
"newly created message-bar added as message-bar-stack child element"
);
const slot = messageBar.shadowRoot.querySelector("slot");
is(
slot.assignedNodes()[0],
messageEl,
"Got the expected span element assigned to the message-bar slot"
);
is(
slot.assignedNodes()[1],
buttonEl,
"Got the expected button element assigned to the message-bar slot"
);
let dismissed = BrowserTestUtils.waitForEvent(
messageBar,
"message-bar:user-dismissed"
);
info("Click the close icon on the newly created message-bar");
clickElement(messageBar.closeButton);
await dismissed;
info("Expect the onclose function to be called");
await onceMessageBarClosed;
is(
messageBarStack.childElementCount,
0,
"message-bar-stack has no child elements"
);
});
add_task(async function test_max_message_bar_count() {
const win = htmlAboutAddonsWindow;
const messageBarStack = win.document.getElementById("abuse-reports-messages");
info("Create a new message-bar");
let messageElement = document.createElementNS(HTML_NS, "span");
messageElement = "message bar label";
let onceMessageBarClosed = new Promise(resolve => {
createMessageBar(messageBarStack, {
children: messageElement,
onclose: resolve,
});
});
is(
messageBarStack.childElementCount,
1,
"message-bar-stack has the expected number of children"
);
info("Create 3 more message bars");
const allBarsPromises = [];
for (let i = 2; i <= 4; i++) {
allBarsPromises.push(
new Promise(resolve => {
createMessageBar(messageBarStack, {
attrs: { dismissable: "" },
children: [messageElement, i],
onclose: resolve,
});
})
);
}
info("Expect first message-bar to closed automatically");
await onceMessageBarClosed;
is(
messageBarStack.childElementCount,
3,
"message-bar-stack has the expected number of children"
);
info("Click on close icon for the second message-bar");
clickElement(messageBarStack.firstElementChild.closeButton);
info("Expect the second message-bar to be closed");
await allBarsPromises[0];
is(
messageBarStack.childElementCount,
2,
"message-bar-stack has the expected number of children"
);
info("Clear the entire message-bar-stack content");
messageBarStack.textContent = "";
info("Expect all the created message-bar to be closed automatically");
await Promise.all(allBarsPromises);
is(
messageBarStack.childElementCount,
0,
"message-bar-stack has no child elements"
);
});