Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

"use strict";
const server = createHttpServer({ hosts: ["example.com"] });
server.registerDirectory("/data/", do_get_file("data"));
add_task(async function test_contentscript_reload_and_unload() {
let extensionData = {
manifest: {
content_scripts: [
{
js: ["contentscript.js"],
},
],
},
files: {
"contentscript.js"() {
browser.test.sendMessage("contentscript-run");
},
},
};
let extension = ExtensionTestUtils.loadExtension(extensionData);
await extension.startup();
let events = [];
{
const { Management } = ChromeUtils.importESModule(
"resource://gre/modules/Extension.sys.mjs"
);
let record = (type, extensionContext) => {
let eventType = type == "proxy-context-load" ? "load" : "unload";
let url = extensionContext.uri.spec;
let extensionId = extensionContext.extension.id;
events.push({ eventType, url, extensionId });
};
Management.on("proxy-context-load", record);
Management.on("proxy-context-unload", record);
registerCleanupFunction(() => {
Management.off("proxy-context-load", record);
Management.off("proxy-context-unload", record);
});
}
let contentPage = await ExtensionTestUtils.loadContentPage(tabUrl);
await extension.awaitMessage("contentscript-run");
let contextEvents = events.splice(0);
equal(
contextEvents.length,
1,
"ExtensionContext state change after loading a content script"
);
equal(
contextEvents[0].eventType,
"load",
"Create ExtensionContext for content script"
);
equal(contextEvents[0].url, tabUrl, "ExtensionContext URL = page");
await contentPage.spawn([], () => {
this.content.location.reload();
});
await extension.awaitMessage("contentscript-run");
contextEvents = events.splice(0);
equal(
contextEvents.length,
2,
"ExtensionContext state changes after reloading a content script"
);
equal(contextEvents[0].eventType, "unload", "Unload old ExtensionContext");
equal(contextEvents[0].url, tabUrl, "ExtensionContext URL = page");
equal(
contextEvents[1].eventType,
"load",
"Create new ExtensionContext for content script"
);
equal(contextEvents[1].url, tabUrl, "ExtensionContext URL = page");
await contentPage.close();
contextEvents = events.splice(0);
equal(
contextEvents.length,
1,
"ExtensionContext state change after unloading a content script"
);
equal(
contextEvents[0].eventType,
"unload",
"Unload ExtensionContext after closing the tab with the content script"
);
equal(contextEvents[0].url, tabUrl, "ExtensionContext URL = page");
await extension.unload();
});