Bug 1321303 - Part 5: Implement browsingData.removeFormData, r=aswan

MozReview-Commit-ID: aK6m7vl3i1
This commit is contained in:
Bob Silverberg
2016-12-14 14:29:57 -05:00
parent c8b6355fd6
commit 56cc7b6721
4 changed files with 149 additions and 1 deletions

View File

@@ -72,6 +72,10 @@ function clearDownloads(options) {
return sanitizer.items.downloads.clear(makeRange(options));
}
function clearFormData(options) {
return sanitizer.items.formdata.clear(makeRange(options));
}
function clearHistory(options) {
return sanitizer.items.history.clear(makeRange(options));
}
@@ -97,6 +101,9 @@ function doRemoval(options, dataToRemove, extension) {
case "downloads":
removalPromises.push(clearDownloads(options));
break;
case "formData":
removalPromises.push(clearFormData(options));
break;
case "history":
removalPromises.push(clearHistory(options));
break;
@@ -154,6 +161,9 @@ extensions.registerSchemaAPI("browsingData", "addon_parent", context => {
removeDownloads(options) {
return doRemoval(options, {downloads: true});
},
removeFormData(options) {
return doRemoval(options, {formData: true});
},
removeHistory(options) {
return doRemoval(options, {history: true});
},

View File

@@ -277,7 +277,6 @@
"description": "Clears the browser's stored form data (autofill).",
"type": "function",
"async": "callback",
"unsupported": true,
"parameters": [
{
"$ref": "RemovalOptions",

View File

@@ -28,6 +28,7 @@ support-files =
[browser_ext_browserAction_popup_preload.js]
[browser_ext_browserAction_popup_resize.js]
[browser_ext_browserAction_simple.js]
[browser_ext_browsingData_formData.js]
[browser_ext_browsingData_history.js]
[browser_ext_commands_execute_browser_action.js]
[browser_ext_commands_execute_page_action.js]

View File

@@ -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();
});