fune/toolkit/components/url-classifier/tests/mochitest/classifierCommon.js
Tim Huang 6caab45817 Bug 1781397 - Fix the intermittent issue of test_bug1254766. r=dimi
To fix the intermittent issue, the patch ensures the safebrowsing
database is initiated after reload the database before we load the
test frame.

It also fixes the issue that classifierHelper doesn't properly clean up
the prefs used in the test.

Differential Revision: https://phabricator.services.mozilla.com/D196548
2023-12-18 10:06:01 +00:00

108 lines
2.5 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-env mozilla/chrome-script */
var dbService = Cc["@mozilla.org/url-classifier/dbservice;1"].getService(
Ci.nsIUrlClassifierDBService
);
var listmanager = Cc["@mozilla.org/url-classifier/listmanager;1"].getService(
Ci.nsIUrlListManager
);
var timer;
function setTimeout(callback, delay) {
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
timer.initWithCallback(
{ notify: callback },
delay,
Ci.nsITimer.TYPE_ONE_SHOT
);
}
function doUpdate(update) {
let listener = {
QueryInterface: ChromeUtils.generateQI(["nsIUrlClassifierUpdateObserver"]),
updateUrlRequested(url) {},
streamFinished(status) {},
updateError(errorCode) {
sendAsyncMessage("updateError", errorCode);
},
updateSuccess(requestedTimeout) {
sendAsyncMessage("updateSuccess");
},
};
try {
dbService.beginUpdate(
listener,
"test-malware-simple,test-unwanted-simple",
""
);
dbService.beginStream("", "");
dbService.updateStream(update);
dbService.finishStream();
dbService.finishUpdate();
} catch (e) {
// beginUpdate may fail if there's an existing update in progress
// retry until success or testcase timeout.
setTimeout(() => {
doUpdate(update);
}, 1000);
}
}
function doReload() {
try {
dbService.reloadDatabase();
sendAsyncMessage("reloadSuccess");
} catch (e) {
setTimeout(() => {
doReload();
}, 1000);
}
}
// SafeBrowsing.jsm is initialized after mozEntries are added. Add observer
// to receive "finished" event. For the case when this function is called
// after the event had already been notified, we lookup entries to see if
// they are already added to database.
function waitForInit() {
if (listmanager.isRegistered()) {
sendAsyncMessage("safeBrowsingInited");
} else {
setTimeout(() => {
waitForInit();
}, 1000);
}
}
function doGetTables() {
const callback = tables => {
sendAsyncMessage("GetTableSuccess", tables);
};
try {
dbService.getTables(callback);
} catch (e) {
setTimeout(() => {
doGetTables();
}, 1000);
}
}
addMessageListener("doUpdate", ({ testUpdate }) => {
doUpdate(testUpdate);
});
addMessageListener("doReload", () => {
doReload();
});
addMessageListener("waitForInit", () => {
waitForInit();
});
addMessageListener("doGetTables", () => {
doGetTables();
});