diff options
Diffstat (limited to 'toolkit/content/aboutServiceWorkers.js')
-rw-r--r-- | toolkit/content/aboutServiceWorkers.js | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/toolkit/content/aboutServiceWorkers.js b/toolkit/content/aboutServiceWorkers.js new file mode 100644 index 0000000000..f57753239c --- /dev/null +++ b/toolkit/content/aboutServiceWorkers.js @@ -0,0 +1,173 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +var gSWM; +var gSWCount = 0; + +function init() { + let enabled = Services.prefs.getBoolPref("dom.serviceWorkers.enabled"); + if (!enabled) { + let div = document.getElementById("warning_not_enabled"); + div.classList.add("active"); + return; + } + + gSWM = Cc["@mozilla.org/serviceworkers/manager;1"].getService( + Ci.nsIServiceWorkerManager + ); + if (!gSWM) { + dump( + "AboutServiceWorkers: Failed to get the ServiceWorkerManager service!\n" + ); + return; + } + + let data = gSWM.getAllRegistrations(); + if (!data) { + dump("AboutServiceWorkers: Failed to retrieve the registrations.\n"); + return; + } + + let length = data.length; + if (!length) { + let div = document.getElementById("warning_no_serviceworkers"); + div.classList.add("active"); + return; + } + + let ps = undefined; + try { + ps = Cc["@mozilla.org/push/Service;1"].getService(Ci.nsIPushService); + } catch (e) { + dump("Could not acquire PushService\n"); + } + + for (let i = 0; i < length; ++i) { + let info = data.queryElementAt(i, Ci.nsIServiceWorkerRegistrationInfo); + if (!info) { + dump( + "AboutServiceWorkers: Invalid nsIServiceWorkerRegistrationInfo interface.\n" + ); + continue; + } + + display(info, ps); + } +} + +async function display(info, pushService) { + let parent = document.getElementById("serviceworkers"); + + let div = document.createElement("div"); + parent.appendChild(div); + + let title = document.createElement("h2"); + document.l10n.setAttributes(title, "origin-title", { + originTitle: info.principal.origin, + }); + div.appendChild(title); + + let list = document.createElement("ul"); + div.appendChild(list); + + function createItem(l10nId, value, makeLink) { + let item = document.createElement("li"); + list.appendChild(item); + let bold = document.createElement("strong"); + bold.setAttribute("data-l10n-name", "item-label"); + item.appendChild(bold); + // Falsey values like "" are still valid values, so check exactly against + // undefined for the cases where the caller did not provide any value. + if (value === undefined) { + document.l10n.setAttributes(item, l10nId); + } else if (makeLink) { + let link = document.createElement("a"); + link.setAttribute("target", "_blank"); + link.setAttribute("data-l10n-name", "link"); + link.setAttribute("href", value); + item.appendChild(link); + document.l10n.setAttributes(item, l10nId, { url: value }); + } else { + document.l10n.setAttributes(item, l10nId, { name: value }); + } + return item; + } + + createItem("scope", info.scope); + createItem("script-spec", info.scriptSpec, true); + let currentWorkerURL = info.activeWorker ? info.activeWorker.scriptSpec : ""; + createItem("current-worker-url", currentWorkerURL, true); + let activeCacheName = info.activeWorker ? info.activeWorker.cacheName : ""; + createItem("active-cache-name", activeCacheName); + let waitingCacheName = info.waitingWorker ? info.waitingWorker.cacheName : ""; + createItem("waiting-cache-name", waitingCacheName); + + let pushItem = createItem("push-end-point-waiting"); + if (pushService) { + pushService.getSubscription( + info.scope, + info.principal, + (status, pushRecord) => { + if (Components.isSuccessCode(status)) { + document.l10n.setAttributes(pushItem, "push-end-point-result", { + name: JSON.stringify(pushRecord), + }); + } else { + dump("about:serviceworkers - retrieving push registration failed\n"); + } + } + ); + } + + let unregisterButton = document.createElement("button"); + document.l10n.setAttributes(unregisterButton, "unregister-button"); + div.appendChild(unregisterButton); + + let loadingMessage = document.createElement("span"); + document.l10n.setAttributes(loadingMessage, "waiting"); + loadingMessage.classList.add("inactive"); + div.appendChild(loadingMessage); + + unregisterButton.onclick = function () { + let cb = { + unregisterSucceeded() { + parent.removeChild(div); + + if (!--gSWCount) { + let div = document.getElementById("warning_no_serviceworkers"); + div.classList.add("active"); + } + }, + + async unregisterFailed() { + let [alertMsg] = await document.l10n.formatValues([ + { id: "unregister-error" }, + ]); + alert(alertMsg); + }, + + QueryInterface: ChromeUtils.generateQI([ + "nsIServiceWorkerUnregisterCallback", + ]), + }; + + loadingMessage.classList.remove("inactive"); + gSWM.propagateUnregister(info.principal, cb, info.scope); + }; + + let sep = document.createElement("hr"); + div.appendChild(sep); + + ++gSWCount; +} + +window.addEventListener( + "DOMContentLoaded", + function () { + init(); + }, + { once: true } +); |