// 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');