summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/xpcshell/test_ext_tab_teardown.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/xpcshell/test_ext_tab_teardown.js')
-rw-r--r--toolkit/components/extensions/test/xpcshell/test_ext_tab_teardown.js97
1 files changed, 97 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_tab_teardown.js b/toolkit/components/extensions/test/xpcshell/test_ext_tab_teardown.js
new file mode 100644
index 0000000000..538ce9d8fc
--- /dev/null
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_tab_teardown.js
@@ -0,0 +1,97 @@
+"use strict";
+
+add_task(async function test_extension_page_tabs_create_reload_and_close() {
+ 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 extension = ExtensionTestUtils.loadExtension({
+ background() {
+ browser.test.sendMessage("tab-url", browser.runtime.getURL("page.html"));
+ },
+ files: {
+ "page.html": `<!DOCTYPE html><meta charset="utf-8"><script src="page.js"></script>`,
+ "page.js"() {
+ browser.test.sendMessage("extension page loaded", document.URL);
+ },
+ },
+ });
+
+ await extension.startup();
+ let tabURL = await extension.awaitMessage("tab-url");
+ events.splice(0);
+
+ let contentPage = await ExtensionTestUtils.loadContentPage(tabURL, {
+ extension,
+ });
+ let extensionPageURL = await extension.awaitMessage("extension page loaded");
+ equal(extensionPageURL, tabURL, "Loaded the expected URL");
+
+ let contextEvents = events.splice(0);
+ equal(contextEvents.length, 1, "ExtensionContext change for opening a tab");
+ equal(contextEvents[0].eventType, "load", "create ExtensionContext for tab");
+ equal(
+ contextEvents[0].url,
+ extensionPageURL,
+ "ExtensionContext URL after tab creation should be tab URL"
+ );
+
+ await contentPage.spawn([], () => {
+ this.content.location.reload();
+ });
+ let extensionPageURL2 = await extension.awaitMessage("extension page loaded");
+
+ equal(
+ extensionPageURL,
+ extensionPageURL2,
+ "The tab's URL is expected to not change after a page reload"
+ );
+
+ contextEvents = events.splice(0);
+ equal(contextEvents.length, 2, "ExtensionContext change after tab reload");
+ equal(contextEvents[0].eventType, "unload", "unload old ExtensionContext");
+ equal(
+ contextEvents[0].url,
+ extensionPageURL,
+ "ExtensionContext URL before reload should be tab URL"
+ );
+ equal(
+ contextEvents[1].eventType,
+ "load",
+ "create new ExtensionContext for tab"
+ );
+ equal(
+ contextEvents[1].url,
+ extensionPageURL2,
+ "ExtensionContext URL after reload should be tab URL"
+ );
+
+ await contentPage.close();
+
+ contextEvents = events.splice(0);
+ equal(contextEvents.length, 1, "ExtensionContext after closing tab");
+ equal(contextEvents[0].eventType, "unload", "unload tab's ExtensionContext");
+ equal(
+ contextEvents[0].url,
+ extensionPageURL2,
+ "ExtensionContext URL at closing tab should be tab URL"
+ );
+
+ await extension.unload();
+});