forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			173 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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 }
 | |
| );
 | 
