Backed out changeset d9a7e2fba868 (bug 1404427) on suspicion of causing failures in browser_sanitize-timespans.js at some times of the day. r=backout a=backout on a CLOSED TREE

This commit is contained in:
Sebastian Hengst 2017-11-10 15:28:16 +02:00
Родитель 96b3be2c0d
Коммит e26417e1b1
4 изменённых файлов: 142 добавлений и 176 удалений

Просмотреть файл

@ -249,10 +249,7 @@ add_task(async function testClearHistory() {
let controller = searchBar.textbox.controllers.getControllerForCommand("cmd_clearhistory");
ok(controller.isCommandEnabled("cmd_clearhistory"), "Clear history command enabled");
let historyCleared = promiseObserver("satchel-storage-changed");
controller.doCommand("cmd_clearhistory");
await historyCleared;
let count = await countEntries();
ok(count == 0, "History cleared");
});
@ -265,13 +262,3 @@ add_task(async function asyncCleanup() {
gBrowser.selectedBrowser.loadURI("about:blank");
await promiseRemoveEngine();
});
function promiseObserver(topic) {
return new Promise(resolve => {
let obs = (aSubject, aTopic, aData) => {
Services.obs.removeObserver(obs, aTopic);
resolve(aSubject);
};
Services.obs.addObserver(obs, topic);
});
}

Просмотреть файл

@ -619,7 +619,7 @@ function dbClose(aShutdown) {
* @param {Array.<Object>} aChanges changes to form history
* @param {Object} aCallbacks
*/
async function updateFormHistoryWrite(aChanges, aCallbacks) {
function updateFormHistoryWrite(aChanges, aCallbacks) {
log("updateFormHistoryWrite " + aChanges.length);
// pass 'now' down so that every entry in the batch has the same timestamp
@ -648,30 +648,7 @@ async function updateFormHistoryWrite(aChanges, aCallbacks) {
delete change.timeDeleted;
}
stmt = makeRemoveStatement(change, bindingArrays);
// Fetch the GUIDs we are going to delete.
try {
await new Promise((res, rej) => {
let selectStmt = makeSearchStatement(change, ["guid"]);
let selectHandlers = {
handleCompletion() {
res();
},
handleError() {
log("remove select guids failure");
},
handleResult(aResultSet) {
for (let row = aResultSet.getNextRow(); row; row = aResultSet.getNextRow()) {
notifications.push(["formhistory-remove", row.getResultByName("guid")]);
}
},
};
dbConnection.executeAsync([selectStmt], 1, selectHandlers);
});
} catch (e) {
log("Error in select statement: " + e);
}
notifications.push(["formhistory-remove", change.guid]);
break;
case "update":
log("Update form history " + change);

Просмотреть файл

@ -102,24 +102,6 @@ function addEntry(name, value, then) {
}, then);
}
function promiseCountEntries(name, value) {
return new Promise(res => {
countEntries(name, value, res);
});
}
function promiseUpdateEntry(op, name, value) {
return new Promise(res => {
updateEntry(op, name, value, res);
});
}
function promiseAddEntry(name, value) {
return new Promise(res => {
addEntry(name, value, res);
});
}
// Wrapper around FormHistory.update which handles errors. Calls then() when done.
function updateFormHistory(changes, then) {
FormHistory.update(changes, {

Просмотреть файл

@ -5,176 +5,196 @@
*
*/
XPCOMUtils.defineLazyModuleGetter(this, "setTimeout", "resource://gre/modules/Timer.jsm");
let expectedNotification;
let expectedData;
let subjectIsGuid = false;
let lastGUID;
const TestObserver = {
observed: [],
let TestObserver = {
QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver, Ci.nsISupportsWeakReference]),
observe(subject, topic, data) {
if (subject instanceof Ci.nsISupportsString) {
subject = subject.toString();
do_check_eq(topic, "satchel-storage-changed");
do_check_eq(data, expectedNotification);
let verifySubjectIsGuid = () => {
do_check_true(subject instanceof Ci.nsISupportsString);
do_check_true(isGUID.test(subject.toString()));
lastGUID = subject.toString();
};
switch (data) {
case "formhistory-add":
case "formhistory-update":
verifySubjectIsGuid();
break;
case "formhistory-remove":
if (subjectIsGuid) {
verifySubjectIsGuid();
} else {
do_check_eq(null, subject);
}
break;
default:
do_throw("Unhandled notification: " + data + " / " + topic);
}
this.observed.push({subject, topic, data});
},
reset() {
this.observed = [];
expectedNotification = null;
expectedData = null;
},
};
const entry1 = ["entry1", "value1"];
const entry2 = ["entry2", "value2"];
const entry3 = ["entry3", "value3"];
let testIterator = null;
add_task(async function setup() {
await promiseUpdateEntry("remove", null, null);
const count = await promiseCountEntries(null, null);
do_check_false(count, "Checking initial DB is empty");
function run_test() {
do_test_pending();
testIterator = run_test_steps();
testIterator.next();
}
// Add the observer
Services.obs.addObserver(TestObserver, "satchel-storage-changed");
});
function next_test() {
testIterator.next();
}
add_task(async function addAndUpdateEntry() {
// Add
await promiseUpdateEntry("add", entry1[0], entry1[1]);
do_check_eq(TestObserver.observed.length, 1);
let {subject, data} = TestObserver.observed[0];
do_check_eq(data, "formhistory-add");
do_check_true(isGUID.test(subject));
function* run_test_steps() {
let testnum = 0;
let testdesc = "Setup of test form history entries";
let count = await promiseCountEntries(entry1[0], entry1[1]);
do_check_eq(count, 1);
try {
let entry1 = ["entry1", "value1"];
// Update
TestObserver.reset();
/* ========== 1 ========== */
testnum = 1;
testdesc = "Initial connection to storage module";
await promiseUpdateEntry("update", entry1[0], entry1[1]);
do_check_eq(TestObserver.observed.length, 1);
({subject, data} = TestObserver.observed[0]);
do_check_eq(data, "formhistory-update");
do_check_true(isGUID.test(subject));
yield updateEntry("remove", null, null, next_test);
yield countEntries(null, null, function(num) {
do_check_false(num, "Checking initial DB is empty");
next_test();
});
count = await promiseCountEntries(entry1[0], entry1[1]);
do_check_eq(count, 1);
// Add the observer
Services.obs.addObserver(TestObserver, "satchel-storage-changed");
// Clean-up
await promiseUpdateEntry("remove", null, null);
});
/* ========== 2 ========== */
testnum++;
testdesc = "addEntry";
add_task(async function removeEntry() {
TestObserver.reset();
await promiseUpdateEntry("add", entry1[0], entry1[1]);
const guid = TestObserver.observed[0].subject;
TestObserver.reset();
expectedNotification = "formhistory-add";
expectedData = entry1;
await new Promise(res => {
FormHistory.update({
yield updateEntry("add", entry1[0], entry1[1], next_test);
do_check_eq(expectedNotification, null); // check that observer got a notification
yield countEntries(entry1[0], entry1[1], function(num) {
do_check_true(num > 0);
next_test();
});
/* ========== 3 ========== */
testnum++;
testdesc = "modifyEntry";
expectedNotification = "formhistory-update";
expectedData = entry1;
// will update previous entry
yield updateEntry("update", entry1[0], entry1[1], next_test);
yield countEntries(entry1[0], entry1[1], function(num) {
do_check_true(num > 0);
next_test();
});
do_check_eq(expectedNotification, null);
/* ========== 4 ========== */
testnum++;
testdesc = "removeEntry";
expectedNotification = "formhistory-remove";
expectedData = entry1;
subjectIsGuid = true;
yield FormHistory.update({
op: "remove",
fieldname: entry1[0],
value: entry1[1],
guid,
guid: lastGUID,
}, {
handleError(error) {
do_throw("Error occurred updating form history: " + error);
},
handleCompletion(reason) {
if (!reason) {
res();
next_test();
}
},
});
});
do_check_eq(TestObserver.observed.length, 1);
const {subject, data} = TestObserver.observed[0];
do_check_eq(data, "formhistory-remove");
do_check_true(isGUID.test(subject));
subjectIsGuid = false;
const count = await promiseCountEntries(entry1[0], entry1[1]);
do_check_eq(count, 0, "doesn't exist after remove");
});
do_check_eq(expectedNotification, null);
yield countEntries(entry1[0], entry1[1], function(num) {
do_check_false(num, "doesn't exist after remove");
next_test();
});
add_task(async function removeAllEntries() {
await promiseAddEntry(entry1[0], entry1[1]);
await promiseAddEntry(entry2[0], entry2[1]);
await promiseAddEntry(entry3[0], entry3[1]);
TestObserver.reset();
/* ========== 5 ========== */
testnum++;
testdesc = "removeAllEntries";
await promiseUpdateEntry("remove", null, null);
do_check_eq(TestObserver.observed.length, 3);
for (const notification of TestObserver.observed) {
const {subject, data} = notification;
do_check_eq(data, "formhistory-remove");
do_check_true(isGUID.test(subject));
}
expectedNotification = "formhistory-remove";
expectedData = null; // no data expected
yield updateEntry("remove", null, null, next_test);
const count = await promiseCountEntries(null, null);
do_check_eq(count, 0);
});
do_check_eq(expectedNotification, null);
add_task(async function removeEntriesForName() {
await promiseAddEntry(entry1[0], entry1[1]);
await promiseAddEntry(entry2[0], entry2[1]);
await promiseAddEntry(entry3[0], entry3[1]);
TestObserver.reset();
/* ========== 6 ========== */
testnum++;
testdesc = "removeAllEntries (again)";
await promiseUpdateEntry("remove", entry2[0], null);
do_check_eq(TestObserver.observed.length, 1);
const {subject, data} = TestObserver.observed[0];
do_check_eq(data, "formhistory-remove");
do_check_true(isGUID.test(subject));
expectedNotification = "formhistory-remove";
expectedData = null;
yield updateEntry("remove", null, null, next_test);
let count = await promiseCountEntries(entry2[0], entry2[1]);
do_check_eq(count, 0);
do_check_eq(expectedNotification, null);
count = await promiseCountEntries(null, null);
do_check_eq(count, 2, "the other entries are still there");
/* ========== 7 ========== */
testnum++;
testdesc = "removeEntriesForName";
// Clean-up
await promiseUpdateEntry("remove", null, null);
});
expectedNotification = "formhistory-remove";
expectedData = "field2";
yield updateEntry("remove", null, "field2", next_test);
add_task(async function removeEntriesByTimeframe() {
await promiseAddEntry(entry1[0], entry1[1]);
await promiseAddEntry(entry2[0], entry2[1]);
do_check_eq(expectedNotification, null);
const cutoffDate = Date.now();
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
await new Promise(res => setTimeout(res, 10));
/* ========== 8 ========== */
testnum++;
testdesc = "removeEntriesByTimeframe";
await promiseAddEntry(entry3[0], entry3[1]);
TestObserver.reset();
expectedNotification = "formhistory-remove";
expectedData = [10, 99999999999];
await new Promise(res => {
FormHistory.update({
yield FormHistory.update({
op: "remove",
firstUsedStart: 10,
firstUsedEnd: cutoffDate * 1000,
firstUsedStart: expectedData[0],
firstUsedEnd: expectedData[1],
}, {
handleCompletion(reason) {
if (!reason) {
res();
next_test();
}
},
handleErrors(error) {
do_throw("Error occurred updating form history: " + error);
},
});
});
do_check_eq(TestObserver.observed.length, 2);
for (const notification of TestObserver.observed) {
const {subject, data} = notification;
do_check_eq(data, "formhistory-remove");
do_check_true(isGUID.test(subject));
do_check_eq(expectedNotification, null);
Services.obs.removeObserver(TestObserver, "satchel-storage-changed");
do_test_finished();
} catch (e) {
throw new Error(`FAILED in test #${testnum} -- ${testdesc}: ${e}`);
}
const count = await promiseCountEntries(null, null);
do_check_eq(count, 1, "entry2 should still be there");
// Clean-up
await promiseUpdateEntry("remove", null, null);
});
add_task(async function teardown() {
await promiseUpdateEntry("remove", null, null);
Services.obs.removeObserver(TestObserver, "satchel-storage-changed");
});
}