summaryrefslogtreecommitdiffstats
path: root/toolkit/components/extensions/test/browser/browser_ext_eventpage_disableResetIdleForTest.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/extensions/test/browser/browser_ext_eventpage_disableResetIdleForTest.js')
-rw-r--r--toolkit/components/extensions/test/browser/browser_ext_eventpage_disableResetIdleForTest.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/toolkit/components/extensions/test/browser/browser_ext_eventpage_disableResetIdleForTest.js b/toolkit/components/extensions/test/browser/browser_ext_eventpage_disableResetIdleForTest.js
new file mode 100644
index 0000000000..8178411e80
--- /dev/null
+++ b/toolkit/components/extensions/test/browser/browser_ext_eventpage_disableResetIdleForTest.js
@@ -0,0 +1,83 @@
+"use strict";
+
+const { PromiseTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/PromiseTestUtils.sys.mjs"
+);
+
+const { AppUiTestDelegate } = ChromeUtils.importESModule(
+ "resource://testing-common/AppUiTestDelegate.sys.mjs"
+);
+
+// Ignore error "Actor 'Conduits' destroyed before query 'RunListener' was resolved"
+PromiseTestUtils.allowMatchingRejectionsGlobally(
+ /Actor 'Conduits' destroyed before query 'RunListener'/
+);
+
+async function run_test_disableResetIdleForTest(options) {
+ const extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ manifest_version: 3,
+ action: {},
+ },
+ background() {
+ browser.action.onClicked.addListener(async () => {
+ browser.test.notifyPass("action-clicked");
+ // Deliberately keep this listener active to simulate a still active listener
+ // callback, while calling extension.terminateBackground().
+ await new Promise(() => {});
+ });
+
+ browser.test.sendMessage("background-ready");
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitMessage("background-ready");
+ // After startup, the listener should be persistent but not primed.
+ assertPersistentListeners(extension, "browserAction", "onClicked", {
+ primed: false,
+ });
+
+ // Terminating the background should prime the persistent listener.
+ await extension.terminateBackground();
+ assertPersistentListeners(extension, "browserAction", "onClicked", {
+ primed: true,
+ });
+
+ // Wake up the background, and verify the listener is no longer primed.
+ await AppUiTestDelegate.clickBrowserAction(window, extension.id);
+ await extension.awaitFinish("action-clicked");
+ await AppUiTestDelegate.closeBrowserAction(window, extension.id);
+ await extension.awaitMessage("background-ready");
+ assertPersistentListeners(extension, "browserAction", "onClicked", {
+ primed: false,
+ });
+
+ // Terminate the background again, while the onClicked listener is still
+ // being executed.
+ // With options.disableResetIdleForTest = true, the termination should NOT
+ // be skipped and the listener should become primed again.
+ // With options.disableResetIdleForTest = false or unset, the termination
+ // should be skipped and the listener should not become primed.
+ await extension.terminateBackground(options);
+ assertPersistentListeners(extension, "browserAction", "onClicked", {
+ primed: !!options?.disableResetIdleForTest,
+ });
+
+ await extension.unload();
+}
+
+// Verify default behaviour when terminating a background while a
+// listener is still running: The background should not be terminated
+// and the listener should not become primed. Not specifyiny a value
+// for disableResetIdleForTest defauls to disableResetIdleForTest:false.
+add_task(async function test_disableResetIdleForTest_default() {
+ await run_test_disableResetIdleForTest();
+});
+
+// Verify that disableResetIdleForTest:true is honoured and terminating
+// a background while a listener is still running is enforced: The
+// background should be terminated and the listener should become primed.
+add_task(async function test_disableResetIdleForTest_true() {
+ await run_test_disableResetIdleForTest({ disableResetIdleForTest: true });
+});