From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- ...aboutdebugging_serviceworker_pushservice_url.js | 118 +++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_pushservice_url.js (limited to 'devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_pushservice_url.js') diff --git a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_pushservice_url.js b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_pushservice_url.js new file mode 100644 index 0000000000..9581a493d9 --- /dev/null +++ b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_serviceworker_pushservice_url.js @@ -0,0 +1,118 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/* import-globals-from helper-serviceworker.js */ +Services.scriptloader.loadSubScript( + CHROME_URL_ROOT + "helper-serviceworker.js", + this +); + +const SERVICE_WORKER = URL_ROOT_SSL + "resources/service-workers/push-sw.js"; +const TAB_URL = URL_ROOT_SSL + "resources/service-workers/push-sw.html"; + +const FAKE_ENDPOINT = "https://fake/endpoint"; + +// Test that the push service url is displayed for service workers subscribed to a push +// service. +add_task(async function () { + await enableServiceWorkerDebugging(); + + info("Mock the push service"); + mockPushService(FAKE_ENDPOINT); + + const { document, tab, window } = await openAboutDebugging({ + enableWorkerUpdates: true, + }); + await selectThisFirefoxPage(document, window.AboutDebugging.store); + + // Open a tab that registers a push service worker. + const swTab = await addTab(TAB_URL); + + info( + "Wait for the service worker to claim the test window before proceeding." + ); + await SpecialPowers.spawn( + swTab.linkedBrowser, + [], + () => content.wrappedJSObject.onSwClaimed + ); + + info("Wait until the service worker appears and is running"); + const targetElement = await waitForServiceWorkerRunning( + SERVICE_WORKER, + document + ); + + info("Subscribe from the push service"); + SpecialPowers.spawn(swTab.linkedBrowser, [], () => { + content.wrappedJSObject.subscribeToPush(); + }); + + info("Wait until the push service appears"); + await waitUntil(() => + targetElement.querySelector(".qa-worker-push-service-value") + ); + const pushUrl = targetElement.querySelector(".qa-worker-push-service-value"); + + ok(!!pushUrl, "Push URL is displayed for the serviceworker"); + is(pushUrl.textContent, FAKE_ENDPOINT, "Push URL shows the expected content"); + + info("Unsubscribe from the push service"); + SpecialPowers.spawn(swTab.linkedBrowser, [], () => { + content.wrappedJSObject.unsubscribeToPush(); + }); + + info("Wait until the push service disappears"); + await waitUntil( + () => !targetElement.querySelector(".qa-worker-push-service-value") + ); + + info("Unregister the service worker"); + await unregisterServiceWorker(swTab); + + info("Wait until the service worker disappears from about:debugging"); + await waitUntil(() => !findDebugTargetByText(SERVICE_WORKER, document)); + + info("Remove the service worker tab"); + await removeTab(swTab); + + await removeTab(tab); +}); + +function mockPushService(endpoint) { + const PushService = Cc["@mozilla.org/push/Service;1"].getService( + Ci.nsIPushService + ).wrappedJSObject; + + PushService.service = { + _registrations: new Map(), + _notify(scope) { + Services.obs.notifyObservers( + null, + PushService.subscriptionModifiedTopic, + scope + ); + }, + init() {}, + register(pageRecord) { + const registration = { + endpoint, + }; + this._registrations.set(pageRecord.scope, registration); + this._notify(pageRecord.scope); + return Promise.resolve(registration); + }, + registration(pageRecord) { + return Promise.resolve(this._registrations.get(pageRecord.scope)); + }, + unregister(pageRecord) { + const deleted = this._registrations.delete(pageRecord.scope); + if (deleted) { + this._notify(pageRecord.scope); + } + return Promise.resolve(deleted); + }, + }; +} -- cgit v1.2.3