diff --git a/mobile/android/components/extensions/ext-android.js b/mobile/android/components/extensions/ext-android.js index 88fcc5b77543..6d0268d98be3 100644 --- a/mobile/android/components/extensions/ext-android.js +++ b/mobile/android/components/extensions/ext-android.js @@ -59,6 +59,15 @@ extensions.registerModules({ ["browserAction"], ], }, + browsingData: { + url: "chrome://browser/content/ext-browsingData.js", + schema: "chrome://browser/content/schemas/browsing_data.json", + scopes: ["addon_parent"], + manifest: ["browsing_data"], + paths: [ + ["browsingData"], + ], + }, pageAction: { url: "chrome://browser/content/ext-pageAction.js", schema: "chrome://browser/content/schemas/page_action.json", diff --git a/mobile/android/components/extensions/ext-browsingData.js b/mobile/android/components/extensions/ext-browsingData.js new file mode 100644 index 000000000000..e86d39a91c65 --- /dev/null +++ b/mobile/android/components/extensions/ext-browsingData.js @@ -0,0 +1,57 @@ +/* -*- 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, "Services", + "resource://gre/modules/Services.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "SharedPreferences", + "resource://gre/modules/SharedPreferences.jsm"); + +this.browsingData = class extends ExtensionAPI { + getAPI(context) { + return { + browsingData: { + settings() { + const PREF_DOMAIN = "android.not_a_preference.privacy.clear"; + const PREF_KEY_PREFIX = "private.data."; + // The following prefs are the only ones in Firefox that match corresponding + // values used by Chrome when returning settings. + const PREF_LIST = ["cache", "history", "formdata", "cookies_sessions", "downloadFiles"]; + + let dataTrue = SharedPreferences.forProfile().getSetPref(PREF_DOMAIN); + let name; + + let dataToRemove = {}; + let dataRemovalPermitted = {}; + + for (let item of PREF_LIST) { + // The property formData needs a different case than the + // formdata preference. + switch(item){ + case "formdata": + name = "formData"; + break; + case "cookies_sessions": + name = "cookies"; + break; + case "downloadFiles": + name = "downloads"; + break; + default: + name = item; + } + dataToRemove[name] = dataTrue.includes(`${PREF_KEY_PREFIX}${item}`); + // Firefox doesn't have the same concept of dataRemovalPermitted + // as Chrome, so it will always be true. + dataRemovalPermitted[name] = true; + } + // 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}); + }, + }, + }; + } +}; \ No newline at end of file diff --git a/mobile/android/components/extensions/jar.mn b/mobile/android/components/extensions/jar.mn index 222cfc802e6c..3dc011661dd3 100644 --- a/mobile/android/components/extensions/jar.mn +++ b/mobile/android/components/extensions/jar.mn @@ -7,6 +7,7 @@ chrome.jar: content/ext-c-android.js content/ext-c-tabs.js content/ext-browserAction.js + content/ext-browsingData.js content/ext-pageAction.js content/ext-tabs.js content/ext-utils.js diff --git a/mobile/android/components/extensions/schemas/browsing_data.json b/mobile/android/components/extensions/schemas/browsing_data.json new file mode 100644 index 000000000000..8a4a42c3cfbb --- /dev/null +++ b/mobile/android/components/extensions/schemas/browsing_data.json @@ -0,0 +1,427 @@ +// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +[ + { + "namespace": "manifest", + "types": [ + { + "$extend": "Permission", + "choices": [{ + "type": "string", + "enum": [ + "browsingData" + ] + }] + } + ] + }, + { + "namespace": "browsingData", + "description": "Use the chrome.browsingData API to remove browsing data from a user's local profile.", + "permissions": ["browsingData"], + "types": [ + { + "id": "RemovalOptions", + "type": "object", + "description": "Options that determine exactly what data will be removed.", + "properties": { + "since": { + "$ref": "extensionTypes.Date", + "optional": true, + "description": "Remove data accumulated on or after this date, represented in milliseconds since the epoch (accessible via the getTime method of the JavaScript Date object). If absent, defaults to 0 (which would remove all browsing data)." + }, + "hostnames": { + "type": "array", + "items": {"type": "string", "format": "hostname"}, + "optional": true, + "description": "Only remove data associated with these hostnames (only applies to cookies)." + }, + "originTypes": { + "type": "object", + "optional": true, + "description": "An object whose properties specify which origin types ought to be cleared. If this object isn't specified, it defaults to clearing only \"unprotected\" origins. Please ensure that you really want to remove application data before adding 'protectedWeb' or 'extensions'.", + "properties": { + "unprotectedWeb": { + "type": "boolean", + "optional": true, + "description": "Normal websites." + }, + "protectedWeb": { + "type": "boolean", + "optional": true, + "description": "Websites that have been installed as hosted applications (be careful!)." + }, + "extension": { + "type": "boolean", + "optional": true, + "description": "Extensions and packaged applications a user has installed (be _really_ careful!)." + } + } + } + } + }, + { + "id": "DataTypeSet", + "type": "object", + "description": "A set of data types. Missing data types are interpreted as false.", + "properties": { + "cache": { + "type": "boolean", + "optional": true, + "description": "The browser's cache. Note: when removing data, this clears the entire cache: it is not limited to the range you specify." + }, + "cookies": { + "type": "boolean", + "optional": true, + "description": "The browser's cookies." + }, + "downloads": { + "type": "boolean", + "optional": true, + "description": "The browser's download list." + }, + "formData": { + "type": "boolean", + "optional": true, + "description": "The browser's stored form data." + }, + "history": { + "type": "boolean", + "optional": true, + "description": "The browser's history." + }, + "indexedDB": { + "type": "boolean", + "optional": true, + "description": "Websites' IndexedDB data." + }, + "localStorage": { + "type": "boolean", + "optional": true, + "description": "Websites' local storage data." + }, + "serverBoundCertificates": { + "type": "boolean", + "optional": true, + "description": "Server-bound certificates." + }, + "passwords": { + "type": "boolean", + "optional": true, + "description": "Stored passwords." + }, + "pluginData": { + "type": "boolean", + "optional": true, + "description": "Plugins' data." + }, + "serviceWorkers": { + "type": "boolean", + "optional": true, + "description": "Service Workers." + } + } + } + ], + "functions": [ + { + "name": "settings", + "description": "Reports which types of data are currently selected in the 'Clear browsing data' settings UI. Note: some of the data types included in this API are not available in the settings UI, and some UI settings control more than one data type listed here.", + "type": "function", + "async": "callback", + "parameters": [ + { + "name": "callback", + "type": "function", + "parameters": [ + { + "name": "result", + "type": "object", + "properties": { + "options": { + "$ref": "RemovalOptions" + }, + "dataToRemove": { + "$ref": "DataTypeSet", + "description": "All of the types will be present in the result, with values of true if they are both selected to be removed and permitted to be removed, otherwise false." + }, + "dataRemovalPermitted": { + "$ref": "DataTypeSet", + "description": "All of the types will be present in the result, with values of true if they are permitted to be removed (e.g., by enterprise policy) and false if not." + } + } + } + ] + } + ] + }, + { + "name": "remove", + "description": "Clears various types of browsing data stored in a user's profile.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "dataToRemove", + "$ref": "DataTypeSet", + "description": "The set of data types to remove." + }, + { + "name": "callback", + "type": "function", + "description": "Called when deletion has completed.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeAppcache", + "description": "Clears websites' appcache data.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when websites' appcache data has been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeCache", + "description": "Clears the browser's cache.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when the browser's cache has been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeCookies", + "description": "Clears the browser's cookies and server-bound certificates modified within a particular timeframe.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when the browser's cookies and server-bound certificates have been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeDownloads", + "description": "Clears the browser's list of downloaded files (not the downloaded files themselves).", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when the browser's list of downloaded files has been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeFileSystems", + "description": "Clears websites' file system data.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when websites' file systems have been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeFormData", + "description": "Clears the browser's stored form data (autofill).", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when the browser's form data has been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeHistory", + "description": "Clears the browser's history.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when the browser's history has cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeIndexedDB", + "description": "Clears websites' IndexedDB data.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when websites' IndexedDB data has been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeLocalStorage", + "description": "Clears websites' local storage data.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when websites' local storage has been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removePluginData", + "description": "Clears plugins' data.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when plugins' data has been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removePasswords", + "description": "Clears the browser's stored passwords.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when the browser's passwords have been cleared.", + "optional": true, + "parameters": [] + } + ] + }, + { + "name": "removeWebSQL", + "description": "Clears websites' WebSQL data.", + "type": "function", + "async": "callback", + "unsupported": true, + "parameters": [ + { + "$ref": "RemovalOptions", + "name": "options" + }, + { + "name": "callback", + "type": "function", + "description": "Called when websites' WebSQL databases have been cleared.", + "optional": true, + "parameters": [] + } + ] + } + ] + } +] diff --git a/mobile/android/components/extensions/schemas/jar.mn b/mobile/android/components/extensions/schemas/jar.mn index af7577f55e61..4424ea110769 100644 --- a/mobile/android/components/extensions/schemas/jar.mn +++ b/mobile/android/components/extensions/schemas/jar.mn @@ -4,5 +4,6 @@ chrome.jar: content/schemas/browser_action.json + content/schemas/browsing_data.json content/schemas/page_action.json content/schemas/tabs.json diff --git a/mobile/android/components/extensions/test/mochitest/chrome.ini b/mobile/android/components/extensions/test/mochitest/chrome.ini index 0eda474d7328..39351d47fca4 100644 --- a/mobile/android/components/extensions/test/mochitest/chrome.ini +++ b/mobile/android/components/extensions/test/mochitest/chrome.ini @@ -6,6 +6,7 @@ tags = webextensions [test_ext_browserAction_getTitle_setTitle.html] [test_ext_browserAction_onClicked.html] +[test_ext_browsingData_settings.html] [test_ext_pageAction_show_hide.html] [test_ext_pageAction_getPopup_setPopup.html] skip-if = os == 'android' # bug 1373170 diff --git a/mobile/android/components/extensions/test/mochitest/test_ext_browsingData_settings.html b/mobile/android/components/extensions/test/mochitest/test_ext_browsingData_settings.html new file mode 100644 index 000000000000..8eaee771a2a3 --- /dev/null +++ b/mobile/android/components/extensions/test/mochitest/test_ext_browsingData_settings.html @@ -0,0 +1,101 @@ + + + + BrowsingData Settings test + + + + + + + + + + + + \ No newline at end of file