Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android'
- Manifest: toolkit/components/satchel/test/unit/xpcshell.toml
/*
* Test suite for satchel notifications
*
* Tests notifications dispatched when modifying form history.
*
*/
ChromeUtils.defineESModuleGetters(this, {
Preferences: "resource://gre/modules/Preferences.sys.mjs",
setTimeout: "resource://gre/modules/Timer.sys.mjs",
});
const TestObserver = {
observed: [],
QueryInterface: ChromeUtils.generateQI([
"nsIObserver",
"nsISupportsWeakReference",
]),
observe(subject, topic, data) {
if (subject instanceof Ci.nsISupportsString) {
subject = subject.toString();
}
this.observed.push({ subject, topic, data });
},
reset() {
this.observed = [];
},
};
const entry1 = ["entry1", "value1"];
const entry2 = ["entry2", "value2"];
const entry3 = ["entry3", "value3"];
add_setup(async () => {
await promiseUpdateEntry("remove", null, null);
const count = await promiseCountEntries(null, null);
Assert.ok(!count, "Checking initial DB is empty");
// Add the observer
Services.obs.addObserver(TestObserver, "satchel-storage-changed");
});
add_task(async function addAndUpdateEntry() {
// Add
await promiseUpdateEntry("add", entry1[0], entry1[1]);
Assert.equal(TestObserver.observed.length, 1);
let { subject, data } = TestObserver.observed[0];
Assert.equal(data, "formhistory-add");
Assert.ok(isGUID.test(subject));
let count = await promiseCountEntries(entry1[0], entry1[1]);
Assert.equal(count, 1);
// Update
TestObserver.reset();
await promiseUpdateEntry("update", entry1[0], entry1[1]);
Assert.equal(TestObserver.observed.length, 1);
({ subject, data } = TestObserver.observed[0]);
Assert.equal(data, "formhistory-update");
Assert.ok(isGUID.test(subject));
count = await promiseCountEntries(entry1[0], entry1[1]);
Assert.equal(count, 1);
// Clean-up
await promiseUpdateEntry("remove", null, null);
});
add_task(async function removeEntry() {
TestObserver.reset();
await promiseUpdateEntry("add", entry1[0], entry1[1]);
const guid = TestObserver.observed[0].subject;
TestObserver.reset();
await FormHistory.update({
op: "remove",
fieldname: entry1[0],
value: entry1[1],
guid,
});
Assert.equal(TestObserver.observed.length, 1);
const { subject, data } = TestObserver.observed[0];
Assert.equal(data, "formhistory-remove");
Assert.ok(isGUID.test(subject));
const count = await promiseCountEntries(entry1[0], entry1[1]);
Assert.equal(count, 0, "doesn't exist after remove");
});
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();
await promiseUpdateEntry("remove", null, null);
Assert.equal(TestObserver.observed.length, 3);
for (const notification of TestObserver.observed) {
const { subject, data } = notification;
Assert.equal(data, "formhistory-remove");
Assert.ok(isGUID.test(subject));
}
const count = await promiseCountEntries(null, null);
Assert.equal(count, 0);
});
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();
await promiseUpdateEntry("remove", entry2[0], null);
Assert.equal(TestObserver.observed.length, 1);
const { subject, data } = TestObserver.observed[0];
Assert.equal(data, "formhistory-remove");
Assert.ok(isGUID.test(subject));
let count = await promiseCountEntries(entry2[0], entry2[1]);
Assert.equal(count, 0);
count = await promiseCountEntries(null, null);
Assert.equal(count, 2, "the other entries are still there");
// Clean-up
await promiseUpdateEntry("remove", null, null);
});
add_task(async function removeEntriesByTimeframe() {
let timerPrecision = Preferences.get("privacy.reduceTimerPrecision");
Preferences.set("privacy.reduceTimerPrecision", false);
registerCleanupFunction(function () {
Preferences.set("privacy.reduceTimerPrecision", timerPrecision);
});
await promiseAddEntry(entry1[0], entry1[1]);
await promiseAddEntry(entry2[0], entry2[1]);
const cutoffDate = Date.now();
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
await new Promise(res => setTimeout(res, 10));
await promiseAddEntry(entry3[0], entry3[1]);
TestObserver.reset();
await FormHistory.update({
op: "remove",
firstUsedStart: 10,
firstUsedEnd: cutoffDate * 1000,
});
Assert.equal(TestObserver.observed.length, 2);
for (const notification of TestObserver.observed) {
const { subject, data } = notification;
Assert.equal(data, "formhistory-remove");
Assert.ok(isGUID.test(subject));
}
const count = await promiseCountEntries(null, null);
Assert.equal(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");
});