Bug 1321303 - Part 5: Implement browsingData.removeFormData, r=aswan
MozReview-Commit-ID: aK6m7vl3i1
This commit is contained in:
@@ -72,6 +72,10 @@ function clearDownloads(options) {
|
|||||||
return sanitizer.items.downloads.clear(makeRange(options));
|
return sanitizer.items.downloads.clear(makeRange(options));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function clearFormData(options) {
|
||||||
|
return sanitizer.items.formdata.clear(makeRange(options));
|
||||||
|
}
|
||||||
|
|
||||||
function clearHistory(options) {
|
function clearHistory(options) {
|
||||||
return sanitizer.items.history.clear(makeRange(options));
|
return sanitizer.items.history.clear(makeRange(options));
|
||||||
}
|
}
|
||||||
@@ -97,6 +101,9 @@ function doRemoval(options, dataToRemove, extension) {
|
|||||||
case "downloads":
|
case "downloads":
|
||||||
removalPromises.push(clearDownloads(options));
|
removalPromises.push(clearDownloads(options));
|
||||||
break;
|
break;
|
||||||
|
case "formData":
|
||||||
|
removalPromises.push(clearFormData(options));
|
||||||
|
break;
|
||||||
case "history":
|
case "history":
|
||||||
removalPromises.push(clearHistory(options));
|
removalPromises.push(clearHistory(options));
|
||||||
break;
|
break;
|
||||||
@@ -154,6 +161,9 @@ extensions.registerSchemaAPI("browsingData", "addon_parent", context => {
|
|||||||
removeDownloads(options) {
|
removeDownloads(options) {
|
||||||
return doRemoval(options, {downloads: true});
|
return doRemoval(options, {downloads: true});
|
||||||
},
|
},
|
||||||
|
removeFormData(options) {
|
||||||
|
return doRemoval(options, {formData: true});
|
||||||
|
},
|
||||||
removeHistory(options) {
|
removeHistory(options) {
|
||||||
return doRemoval(options, {history: true});
|
return doRemoval(options, {history: true});
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -277,7 +277,6 @@
|
|||||||
"description": "Clears the browser's stored form data (autofill).",
|
"description": "Clears the browser's stored form data (autofill).",
|
||||||
"type": "function",
|
"type": "function",
|
||||||
"async": "callback",
|
"async": "callback",
|
||||||
"unsupported": true,
|
|
||||||
"parameters": [
|
"parameters": [
|
||||||
{
|
{
|
||||||
"$ref": "RemovalOptions",
|
"$ref": "RemovalOptions",
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ support-files =
|
|||||||
[browser_ext_browserAction_popup_preload.js]
|
[browser_ext_browserAction_popup_preload.js]
|
||||||
[browser_ext_browserAction_popup_resize.js]
|
[browser_ext_browserAction_popup_resize.js]
|
||||||
[browser_ext_browserAction_simple.js]
|
[browser_ext_browserAction_simple.js]
|
||||||
|
[browser_ext_browsingData_formData.js]
|
||||||
[browser_ext_browsingData_history.js]
|
[browser_ext_browsingData_history.js]
|
||||||
[browser_ext_commands_execute_browser_action.js]
|
[browser_ext_commands_execute_browser_action.js]
|
||||||
[browser_ext_commands_execute_page_action.js]
|
[browser_ext_commands_execute_page_action.js]
|
||||||
|
|||||||
@@ -0,0 +1,138 @@
|
|||||||
|
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||||
|
/* vim: set sts=2 sw=2 et tw=80: */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyModuleGetter(this, "FormHistory",
|
||||||
|
"resource://gre/modules/FormHistory.jsm");
|
||||||
|
XPCOMUtils.defineLazyModuleGetter(this, "PlacesUtils",
|
||||||
|
"resource://gre/modules/PlacesUtils.jsm");
|
||||||
|
|
||||||
|
const REFERENCE_DATE = Date.now();
|
||||||
|
|
||||||
|
function countEntries(fieldname, message, expected) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let callback = {
|
||||||
|
handleResult: result => {
|
||||||
|
is(result, expected, message);
|
||||||
|
resolve();
|
||||||
|
},
|
||||||
|
handleError: reject,
|
||||||
|
};
|
||||||
|
|
||||||
|
FormHistory.count({fieldname}, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function setupFormHistory() {
|
||||||
|
function searchEntries(terms, params) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let callback = {
|
||||||
|
handleResult: resolve,
|
||||||
|
handleError: reject,
|
||||||
|
};
|
||||||
|
|
||||||
|
FormHistory.search(terms, params, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function update(changes) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let callback = {
|
||||||
|
handleError: reject,
|
||||||
|
handleCompletion: resolve,
|
||||||
|
};
|
||||||
|
FormHistory.update(changes, callback);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make sure we've got a clean DB to start with, then add the entries we'll be testing.
|
||||||
|
await update([
|
||||||
|
{op: "remove"},
|
||||||
|
{
|
||||||
|
op: "add",
|
||||||
|
fieldname: "reference",
|
||||||
|
value: "reference",
|
||||||
|
}, {
|
||||||
|
op: "add",
|
||||||
|
fieldname: "10secondsAgo",
|
||||||
|
value: "10s",
|
||||||
|
}, {
|
||||||
|
op: "add",
|
||||||
|
fieldname: "10minutesAgo",
|
||||||
|
value: "10m",
|
||||||
|
}]);
|
||||||
|
|
||||||
|
// Age the entries to the proper vintage.
|
||||||
|
let timestamp = PlacesUtils.toPRTime(REFERENCE_DATE);
|
||||||
|
let result = await searchEntries(["guid"], {fieldname: "reference"});
|
||||||
|
await update({op: "update", firstUsed: timestamp, guid: result.guid});
|
||||||
|
|
||||||
|
timestamp = PlacesUtils.toPRTime(REFERENCE_DATE - 10000);
|
||||||
|
result = await searchEntries(["guid"], {fieldname: "10secondsAgo"});
|
||||||
|
await update({op: "update", firstUsed: timestamp, guid: result.guid});
|
||||||
|
|
||||||
|
timestamp = PlacesUtils.toPRTime(REFERENCE_DATE - 10000 * 60);
|
||||||
|
result = await searchEntries(["guid"], {fieldname: "10minutesAgo"});
|
||||||
|
await update({op: "update", firstUsed: timestamp, guid: result.guid});
|
||||||
|
|
||||||
|
// Sanity check.
|
||||||
|
await countEntries("reference", "Checking for 10minutes form history entry creation", 1);
|
||||||
|
await countEntries("10secondsAgo", "Checking for 1hour form history entry creation", 1);
|
||||||
|
await countEntries("10minutesAgo", "Checking for 1hour10minutes form history entry creation", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
add_task(async function testFormData() {
|
||||||
|
function background() {
|
||||||
|
browser.test.onMessage.addListener(async (msg, options) => {
|
||||||
|
if (msg == "removeFormData") {
|
||||||
|
await browser.browsingData.removeFormData(options);
|
||||||
|
} else {
|
||||||
|
await browser.browsingData.remove(options, {formData: true});
|
||||||
|
}
|
||||||
|
browser.test.sendMessage("formDataRemoved");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
let extension = ExtensionTestUtils.loadExtension({
|
||||||
|
background,
|
||||||
|
manifest: {
|
||||||
|
permissions: ["browsingData"],
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
async function testRemovalMethod(method) {
|
||||||
|
// Clear form data with no since value.
|
||||||
|
await setupFormHistory();
|
||||||
|
extension.sendMessage(method, {});
|
||||||
|
await extension.awaitMessage("formDataRemoved");
|
||||||
|
|
||||||
|
await countEntries("reference", "reference form entry should be deleted.", 0);
|
||||||
|
await countEntries("10secondsAgo", "10secondsAgo form entry should be deleted.", 0);
|
||||||
|
await countEntries("10minutesAgo", "10minutesAgo form entry should be deleted.", 0);
|
||||||
|
|
||||||
|
// Clear form data with recent since value.
|
||||||
|
await setupFormHistory();
|
||||||
|
extension.sendMessage(method, {since: REFERENCE_DATE});
|
||||||
|
await extension.awaitMessage("formDataRemoved");
|
||||||
|
|
||||||
|
await countEntries("reference", "reference form entry should be deleted.", 0);
|
||||||
|
await countEntries("10secondsAgo", "10secondsAgo form entry should still exist.", 1);
|
||||||
|
await countEntries("10minutesAgo", "10minutesAgo form entry should still exist.", 1);
|
||||||
|
|
||||||
|
// Clear form data with old since value.
|
||||||
|
await setupFormHistory();
|
||||||
|
extension.sendMessage(method, {since: REFERENCE_DATE - 1000000});
|
||||||
|
await extension.awaitMessage("formDataRemoved");
|
||||||
|
|
||||||
|
await countEntries("reference", "reference form entry should be deleted.", 0);
|
||||||
|
await countEntries("10secondsAgo", "10secondsAgo form entry should be deleted.", 0);
|
||||||
|
await countEntries("10minutesAgo", "10minutesAgo form entry should be deleted.", 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
await extension.startup();
|
||||||
|
|
||||||
|
await testRemovalMethod("removeFormData");
|
||||||
|
await testRemovalMethod("remove");
|
||||||
|
|
||||||
|
await extension.unload();
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user