Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* 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/. */
add_task(async function test_cached_messages() {
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, TEST_PAGE);
await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => {
const innerWindowId = content.windowGlobalChild.innerWindowId;
const { ConsoleAPIListener } = ChromeUtils.importESModule(
);
info("Log two messages before starting the ConsoleAPIListener");
content.console.log("message_1");
content.console.log("message_2");
const listener = new ConsoleAPIListener(innerWindowId);
const messages = [];
// We will keep the onMessage callback attached to the ConsoleAPIListener
// during the whole test to catch all the emitted events.
const onMessage = (evtName, message) => messages.push(message.arguments[0]);
listener.on("message", onMessage);
listener.startListening();
info("Wait until the 2 cached messages have been emitted");
await ContentTaskUtils.waitForCondition(() => messages.length == 2);
is(messages[0], "message_1");
is(messages[1], "message_2");
info("Stop listening and log another message");
listener.stopListening();
content.backup = { listener, messages, onMessage };
});
// Force a GC to check that old cached messages which have been garbage
// collected are not re-displayed.
await doGC();
await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => {
const { listener, messages, onMessage } = content.backup;
content.console.log("message_3");
info("Start listening again and check the previous message is emitted");
listener.startListening();
await ContentTaskUtils.waitForCondition(() => messages.length == 3);
is(messages[2], "message_3");
info("Log another message and wait until it is emitted");
content.console.log("message_4");
await ContentTaskUtils.waitForCondition(() => messages.length == 4);
is(messages[3], "message_4");
listener.off("message", onMessage);
listener.destroy();
is(messages.length, 4, "Received 4 messages in total");
});
info("Reload the current tab and check only new messages are emitted");
await BrowserTestUtils.reloadTab(gBrowser.selectedTab);
await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => {
const innerWindowId = content.windowGlobalChild.innerWindowId;
const { ConsoleAPIListener } = ChromeUtils.importESModule(
);
info("Log a message before creating the ConsoleAPIListener");
content.console.log("new_message_1");
const listener = new ConsoleAPIListener(innerWindowId);
const newMessages = [];
const onMessage = (evtName, message) =>
newMessages.push(message.arguments[0]);
listener.on("message", onMessage);
info("Start listening and wait for the cached message");
listener.startListening();
await ContentTaskUtils.waitForCondition(() => newMessages.length == 1);
is(newMessages[0], "new_message_1");
info("Log another message and wait until it is emitted");
content.console.log("new_message_2");
await ContentTaskUtils.waitForCondition(() => newMessages.length == 2);
is(newMessages[1], "new_message_2");
listener.off("message", onMessage);
listener.destroy();
is(newMessages.length, 2, "Received 2 messages in total");
});
gBrowser.removeTab(gBrowser.selectedTab);
});