Bug 1415342 - Part 2 - Copy offlineApps sanitizing code from desktop implementation. r?esawin draft
authorJan Henning <jh+bugzilla@buttercookie.de>
Thu, 12 Apr 2018 20:49:50 +0200
changeset 785164 56d6e3ac981a5e4aa37acdc4db1ac9064d401a21
parent 785163 28f6a97f3f0ce213520600b41f91a9b38a11bb99
child 785165 c813ea1d75271bc1f6fb1008a63e442a196d2c0f
push id107162
push usermozilla@buttercookie.de
push dateThu, 19 Apr 2018 19:01:06 +0000
reviewersesawin
bugs1415342
milestone61.0a1
Bug 1415342 - Part 2 - Copy offlineApps sanitizing code from desktop implementation. r?esawin This is a straight copy-and-paste of the non-range-based desktop code in Sanitizer.jsm. MozReview-Commit-ID: 71r8LO4xzYF
mobile/android/modules/Sanitizer.jsm
--- a/mobile/android/modules/Sanitizer.jsm
+++ b/mobile/android/modules/Sanitizer.jsm
@@ -10,20 +10,26 @@ ChromeUtils.import("resource://gre/modul
 XPCOMUtils.defineLazyModuleGetters(this, {
   Accounts: "resource://gre/modules/Accounts.jsm",
   DownloadIntegration: "resource://gre/modules/DownloadIntegration.jsm",
   Downloads: "resource://gre/modules/Downloads.jsm",
   EventDispatcher: "resource://gre/modules/Messaging.jsm",
   FormHistory: "resource://gre/modules/FormHistory.jsm",
   OfflineAppCacheHelper: "resource://gre/modules/offlineAppCache.jsm",
   OS: "resource://gre/modules/osfile.jsm",
+  ServiceWorkerCleanUp: "resource://gre/modules/ServiceWorkerCleanUp.jsm",
   Task: "resource://gre/modules/Task.jsm",
   TelemetryStopwatch: "resource://gre/modules/TelemetryStopwatch.jsm",
 });
 
+XPCOMUtils.defineLazyServiceGetters(this, {
+  quotaManagerService: ["@mozilla.org/dom/quota-manager-service;1", "nsIQuotaManagerService"],
+});
+
+
 var EXPORTED_SYMBOLS = ["Sanitizer"];
 
 function Sanitizer() {}
 Sanitizer.prototype = {
   clearItem: function(aItemName, startTime) {
     // Only a subset of items support deletion with startTime.
     // Those who do not will be rejected with error message.
     if (typeof startTime != "undefined") {
@@ -141,24 +147,53 @@ Sanitizer.prototype = {
       }),
 
       get canClear() {
         return true;
       }
     },
 
     offlineApps: {
-      clear: function() {
-        return new Promise(function(resolve, reject) {
-          // AppCache
-          // This doesn't wait for the cleanup to be complete.
-          OfflineAppCacheHelper.clear();
+      async clear() {
+        // AppCache
+        // This doesn't wait for the cleanup to be complete.
+        OfflineAppCacheHelper.clear();
+
+        // LocalStorage
+        Services.obs.notifyObservers(null, "extension:purge-localStorage");
+
+        // ServiceWorkers
+        await ServiceWorkerCleanUp.removeAll();
 
-          resolve();
+        // QuotaManager
+        let promises = [];
+        await new Promise(resolve => {
+          quotaManagerService.getUsage(request => {
+            if (request.resultCode != Cr.NS_OK) {
+              // We are probably shutting down. We don't want to propagate the
+              // error, rejecting the promise.
+              resolve();
+              return;
+            }
+
+            for (let item of request.result) {
+              let principal = Services.scriptSecurityManager.createCodebasePrincipalFromOrigin(item.origin);
+              let uri = principal.URI;
+              if (uri.scheme == "http" || uri.scheme == "https" || uri.scheme == "file") {
+                promises.push(new Promise(r => {
+                  let req = quotaManagerService.clearStoragesForPrincipal(principal, null, false);
+                  req.callback = () => { r(); };
+                }));
+              }
+            }
+            resolve();
+          });
         });
+
+        return Promise.all(promises);
       },
 
       get canClear() {
           return true;
       }
     },
 
     history: {