Bug 1362996 - Implement browsingData.removeCache WebExtension API method on android. r?grisha, bsilverberg draft
authorTushar Saini (:shatur) <tushar.saini1285@gmail.com>
Tue, 25 Jul 2017 15:05:59 +0530
changeset 615042 f733a5f6e72ec9d2476654b83130232b80d964ac
parent 615040 102be94d80ed28c8598c6668625ce277e71d6caf
child 639067 071a6943592a93c39ff7550491e4532efaffc195
push id70230
push userbmo:tushar.saini1285@gmail.com
push dateTue, 25 Jul 2017 10:45:35 +0000
reviewersgrisha, bsilverberg
bugs1362996
milestone56.0a1
Bug 1362996 - Implement browsingData.removeCache WebExtension API method on android. r?grisha, bsilverberg MozReview-Commit-ID: ECRCqbdiGd0
mobile/android/components/extensions/ext-browsingData.js
mobile/android/components/extensions/schemas/browsing_data.json
mobile/android/components/extensions/test/mochitest/chrome.ini
mobile/android/components/extensions/test/mochitest/test_ext_browsingData_cookies.html
mobile/android/components/extensions/test/mochitest/test_ext_browsingData_cookies_cache.html
--- a/mobile/android/components/extensions/ext-browsingData.js
+++ b/mobile/android/components/extensions/ext-browsingData.js
@@ -1,14 +1,16 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
 Cu.import("resource://gre/modules/Task.jsm");
 
+XPCOMUtils.defineLazyModuleGetter(this, "Sanitizer",
+                                  "resource://gre/modules/Sanitizer.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "Services",
                                   "resource://gre/modules/Services.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "SharedPreferences",
                                   "resource://gre/modules/SharedPreferences.jsm");
 
 let clearCookies = async function(options) {
   if (options.originTypes &&
       (options.originTypes.protectedWeb || options.originTypes.extension)) {
@@ -84,12 +86,15 @@ this.browsingData = class extends Extens
           }
           // We do not provide option to delete history by time
           // so, since value is given 0, which means Everything
           return Promise.resolve({options: {since: 0}, dataToRemove, dataRemovalPermitted});
         },
         removeCookies(options) {
           return clearCookies(options);
         },
+        removeCache(options) {
+          return Sanitizer.clearItem("cache");
+        },
       },
     };
   }
 };
\ No newline at end of file
--- a/mobile/android/components/extensions/schemas/browsing_data.json
+++ b/mobile/android/components/extensions/schemas/browsing_data.json
@@ -202,17 +202,16 @@
           }
         ]
       },
       {
         "name": "removeCache",
         "description": "Clears the browser's cache.",
         "type": "function",
         "async": "callback",
-        "unsupported": true,
         "parameters": [
           {
             "$ref": "RemovalOptions",
             "name": "options"
           },
           {
             "name": "callback",
             "type": "function",
--- a/mobile/android/components/extensions/test/mochitest/chrome.ini
+++ b/mobile/android/components/extensions/test/mochitest/chrome.ini
@@ -1,13 +1,13 @@
 [DEFAULT]
 support-files =
   head.js
   ../../../../../../toolkit/components/extensions/test/mochitest/chrome_cleanup_script.js
 tags = webextensions
 
 [test_ext_browserAction_getTitle_setTitle.html]
 [test_ext_browserAction_onClicked.html]
-[test_ext_browsingData_cookies.html]
+[test_ext_browsingData_cookies_cache.html]
 [test_ext_browsingData_settings.html]
 [test_ext_pageAction_show_hide.html]
 [test_ext_pageAction_getPopup_setPopup.html]
 skip-if = os == 'android' # bug 1373170
rename from mobile/android/components/extensions/test/mochitest/test_ext_browsingData_cookies.html
rename to mobile/android/components/extensions/test/mochitest/test_ext_browsingData_cookies_cache.html
--- a/mobile/android/components/extensions/test/mochitest/test_ext_browsingData_cookies.html
+++ b/mobile/android/components/extensions/test/mochitest/test_ext_browsingData_cookies_cache.html
@@ -87,12 +87,56 @@ add_task(async function testCookies() {
   }
 
   await extension.startup();
 
   await testRemovalMethod("removeCookies");
 
   await extension.unload();
 });
+
+add_task(async function testCache() {
+  function background() {
+    browser.test.onMessage.addListener(async msg => {
+      if (msg == "removeCache") {
+        await browser.browsingData.removeCache({});
+      }
+      browser.test.sendMessage("cacheRemoved");
+    });
+  }
+
+  let extension = ExtensionTestUtils.loadExtension({
+    background,
+    manifest: {
+      permissions: ["browsingData"],
+    },
+  });
+
+  // Returns a promise when 'cacheservice:empty-cache' event is fired
+  function topicObserved() {
+    return new Promise(resolve => {
+      let observe = (subject, topic, data) => {
+        Services.obs.removeObserver(observe, "cacheservice:empty-cache");
+        resolve(data);
+      };
+      Services.obs.addObserver(observe, "cacheservice:empty-cache");
+    });
+  }
+
+  async function testRemovalMethod(method) {
+    // We can assume the notification works properly, so we only need to observe
+    // the notification to know the cache was cleared.
+    let awaitNotification = topicObserved();
+    extension.sendMessage(method);
+    await awaitNotification;
+    await extension.awaitMessage("cacheRemoved");
+  }
+
+  await extension.startup();
+
+  await testRemovalMethod("removeCache");
+
+  await extension.unload();
+});
 </script>
 
 </body>
 </html>
\ No newline at end of file