summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/xpcshell/test_ext_storage_session.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/xpcshell/test_ext_storage_session.js')
-rw-r--r--toolkit/components/extensions/test/xpcshell/test_ext_storage_session.js165
1 files changed, 165 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/xpcshell/test_ext_storage_session.js b/toolkit/components/extensions/test/xpcshell/test_ext_storage_session.js
new file mode 100644
index 0000000000..631edc5492
--- /dev/null
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_storage_session.js
@@ -0,0 +1,165 @@
+"use strict";
+
+AddonTestUtils.init(this);
+
+const server = createHttpServer({ hosts: ["example.com"] });
+server.registerDirectory("/data/", do_get_file("data"));
+
+add_setup(async function setup() {
+ await ExtensionTestUtils.startAddonManager();
+});
+
+const CAN_CRASH_EXTENSIONS = WebExtensionPolicy.useRemoteWebExtensions;
+
+add_setup(
+ // Crash dumps are only generated when MOZ_CRASHREPORTER is set.
+ // Crashes are only generated if tests can crash the extension process.
+ { skip_if: () => !AppConstants.MOZ_CRASHREPORTER || !CAN_CRASH_EXTENSIONS },
+ setup_crash_reporter_override_and_cleaner
+);
+
+add_task(async function test_storage_session() {
+ await test_background_page_storage("session");
+});
+
+add_task(async function test_storage_session_onChanged_event_page() {
+ await test_storage_change_event_page("session");
+});
+
+add_task(async function test_storage_session_persistance() {
+ await test_storage_after_reload("session", { expectPersistency: false });
+});
+
+add_task(async function test_storage_session_empty_events() {
+ await test_storage_empty_events("session");
+});
+
+add_task(async function test_storage_session_contentscript() {
+ let extensionData = {
+ manifest: {
+ content_scripts: [
+ {
+ matches: ["http://example.com/data/file_sample.html"],
+ js: ["content_script.js"],
+ },
+ ],
+ permissions: ["storage"],
+ },
+ background() {
+ let events = [];
+ browser.storage.onChanged.addListener((_, area) => {
+ events.push(area);
+ });
+ browser.test.onMessage.addListener(_msg => {
+ browser.test.sendMessage("bg-events", events.join());
+ });
+ browser.runtime.onMessage.addListener(async _msg => {
+ await browser.storage.local.set({ foo: "local" });
+ await browser.storage.session.set({ foo: "session" });
+ await browser.storage.sync.set({ foo: "sync" });
+ browser.test.sendMessage("done");
+ });
+ },
+ files: {
+ "content_script.js"() {
+ let events = [];
+ browser.storage.onChanged.addListener((_, area) => {
+ events.push(area);
+ });
+ browser.test.onMessage.addListener(_msg => {
+ browser.test.sendMessage("cs-events", events.join());
+ });
+
+ browser.test.assertEq(
+ typeof browser.storage.session,
+ "undefined",
+ "Expect storage.session to not be available in content scripts"
+ );
+ browser.runtime.sendMessage("ready");
+ },
+ },
+ };
+
+ let extension = ExtensionTestUtils.loadExtension(extensionData);
+ await extension.startup();
+
+ let contentPage = await ExtensionTestUtils.loadContentPage(
+ "http://example.com/data/file_sample.html"
+ );
+
+ await extension.awaitMessage("done");
+ extension.sendMessage("_getEvents");
+
+ equal(
+ "local,sync",
+ await extension.awaitMessage("cs-events"),
+ "Content script doesn't see storage.onChanged events from the session area."
+ );
+ equal(
+ "local,session,sync",
+ await extension.awaitMessage("bg-events"),
+ "Background receives onChanged events from all storage areas."
+ );
+
+ await extension.unload();
+ await contentPage.close();
+});
+
+async function test_storage_session_after_crash({ persistent }) {
+ async function background() {
+ let before = await browser.storage.session.get();
+
+ browser.storage.session.set({ count: (before.count ?? 0) + 1 });
+
+ // Roundtrip the data through the parent process.
+ let after = await browser.storage.session.get();
+
+ browser.test.sendMessage("data", { before, after });
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ permissions: ["storage"],
+ background: { persistent },
+ },
+ background,
+ });
+
+ await extension.startup();
+
+ info(`Testing storage.session after crash with persistent=${persistent}`);
+
+ {
+ let { before, after } = await extension.awaitMessage("data");
+
+ equal(JSON.stringify(before), "{}", "Initial before storage is empty.");
+ equal(after.count, 1, "After storage counter is correct.");
+ }
+
+ info("Crashing the extension process.");
+ await crashExtensionBackground(extension);
+ await extension.wakeupBackground();
+
+ {
+ let { before, after } = await extension.awaitMessage("data");
+
+ equal(before.count, 1, "Before storage counter is correct.");
+ equal(after.count, 2, "After storage counter is correct.");
+ }
+
+ await extension.unload();
+}
+
+add_task(
+ { skip_if: () => !CAN_CRASH_EXTENSIONS },
+ function test_storage_session_after_crash_persistent() {
+ return test_storage_session_after_crash({ persistent: true });
+ }
+);
+
+add_task(
+ { skip_if: () => !CAN_CRASH_EXTENSIONS },
+ function test_storage_session_after_crash_event_page() {
+ return test_storage_session_after_crash({ persistent: false });
+ }
+);