/*
* 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" );
});
Messung V0.5 in Prozent C=95 H=92 G=93
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-06-06)
¤
*© Formatika GbR, Deutschland