forked from mirrors/gecko-dev
185 lines
4.9 KiB
JavaScript
185 lines
4.9 KiB
JavaScript
/* 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"
|
|
);
|
|
});
|