summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js')
-rw-r--r--testing/web-platform/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js87
1 files changed, 87 insertions, 0 deletions
diff --git a/testing/web-platform/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js b/testing/web-platform/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js
new file mode 100644
index 0000000000..1f433aeb94
--- /dev/null
+++ b/testing/web-platform/tests/cookie-store/serviceworker_cookiechange_eventhandler_overlapping_subscriptions.https.any.js
@@ -0,0 +1,87 @@
+// META: title=Cookie Store API: cookiechange event in ServiceWorker with overlapping subscriptions
+// META: global=serviceworker
+
+'use strict';
+
+const kScope = '/cookie-store/does/not/exist';
+
+// Resolves when the service worker receives the 'activate' event.
+const kServiceWorkerActivatedPromise = new Promise((resolve) => {
+ self.addEventListener('activate', event => { resolve(); });
+});
+
+// Accumulates cookiechange events dispatched to the service worker.
+let g_cookie_changes = [];
+
+// Resolved when a cookiechange event is received. Rearmed by
+// RearmCookieChangeReceivedPromise().
+let g_cookie_change_received_promise = null;
+let g_cookie_change_received_promise_resolver = null;
+self.addEventListener('cookiechange', (event) => {
+ g_cookie_changes.push(event);
+ if (g_cookie_change_received_promise_resolver) {
+ g_cookie_change_received_promise_resolver();
+ RearmCookieChangeReceivedPromise();
+ }
+});
+function RearmCookieChangeReceivedPromise() {
+ g_cookie_change_received_promise = new Promise((resolve) => {
+ g_cookie_change_received_promise_resolver = resolve;
+ });
+}
+RearmCookieChangeReceivedPromise();
+
+promise_test(async testCase => {
+ await kServiceWorkerActivatedPromise;
+
+ const subscriptions = [
+ { name: 'cookie-name' },
+ { url: `${kScope}/path` }
+ ];
+ await registration.cookies.subscribe(subscriptions);
+ testCase.add_cleanup(() => registration.cookies.unsubscribe(subscriptions));
+
+ await cookieStore.set('cookie-name', 'cookie-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('cookie-name');
+ });
+ testCase.add_cleanup(() => { g_cookie_changes = []; });
+
+ await g_cookie_change_received_promise;
+ testCase.add_cleanup(() => RearmCookieChangeReceivedPromise());
+
+ // To ensure that we are accounting for all events dispatched by the first
+ // cookie change, we initiate and listen for a final cookie change that we
+ // know will dispatch a single event.
+ await cookieStore.set('coo', 'coo-value');
+ testCase.add_cleanup(async () => {
+ await cookieStore.delete('coo');
+ });
+ testCase.add_cleanup(() => { g_cookie_changes = []; });
+
+ await g_cookie_change_received_promise;
+ testCase.add_cleanup(() => RearmCookieChangeReceivedPromise());
+
+ assert_equals(g_cookie_changes.length, 2);
+ {
+ const event = g_cookie_changes[0];
+ assert_equals(event.type, 'cookiechange');
+ assert_equals(event.changed.length, 1);
+ assert_equals(event.changed[0].name, 'cookie-name');
+ assert_equals(event.changed[0].value, 'cookie-value');
+ assert_equals(event.deleted.length, 0);
+ assert_true(event instanceof ExtendableCookieChangeEvent);
+ assert_true(event instanceof ExtendableEvent);
+ }
+ {
+ const event = g_cookie_changes[1];
+ assert_equals(event.type, 'cookiechange');
+ assert_equals(event.changed.length, 1);
+ assert_equals(event.changed[0].name, 'coo');
+ assert_equals(event.changed[0].value, 'coo-value');
+ assert_equals(event.deleted.length, 0);
+ assert_true(event instanceof ExtendableCookieChangeEvent);
+ assert_true(event instanceof ExtendableEvent);
+ }
+}, '1 cookiechange event dispatched with cookie change that matches multiple ' +
+ 'subscriptions');