291 lines
7.3 KiB
JavaScript
291 lines
7.3 KiB
JavaScript
var tests = [
|
|
// Config is an array with 4 elements:
|
|
// - annotation blocklist
|
|
// - annotation entitylist
|
|
// - tracking blocklist
|
|
// - tracking entitylist
|
|
|
|
// All disabled.
|
|
{
|
|
config: [false, false, false, false],
|
|
loadExpected: true,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// Just entitylisted.
|
|
{
|
|
config: [false, false, false, true],
|
|
loadExpected: true,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// Just blocklisted.
|
|
{
|
|
config: [false, false, true, false],
|
|
loadExpected: false,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// entitylist + blocklist => entitylist wins
|
|
{
|
|
config: [false, false, true, true],
|
|
loadExpected: true,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// just annotated in entitylist.
|
|
{
|
|
config: [false, true, false, false],
|
|
loadExpected: true,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// TP and annotation entitylisted.
|
|
{
|
|
config: [false, true, false, true],
|
|
loadExpected: true,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// Annotation entitylisted, but TP blocklisted.
|
|
{
|
|
config: [false, true, true, false],
|
|
loadExpected: false,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// Annotation entitylisted. TP blocklisted and entitylisted: entitylist wins.
|
|
{
|
|
config: [false, true, true, true],
|
|
loadExpected: true,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// Just blocklist annotated.
|
|
{
|
|
config: [true, false, false, false],
|
|
loadExpected: true,
|
|
annotationExpected: true,
|
|
},
|
|
|
|
// annotated but TP entitylisted.
|
|
{
|
|
config: [true, false, false, true],
|
|
loadExpected: true,
|
|
annotationExpected: true,
|
|
},
|
|
|
|
// annotated and blocklisted.
|
|
{
|
|
config: [true, false, true, false],
|
|
loadExpected: false,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// annotated, TP blocklisted and entitylisted: entitylist wins.
|
|
{
|
|
config: [true, false, true, true],
|
|
loadExpected: true,
|
|
annotationExpected: true,
|
|
},
|
|
|
|
// annotated in white and blocklist.
|
|
{
|
|
config: [true, true, false, false],
|
|
loadExpected: true,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// annotated in white and blocklist. TP Whiteslited
|
|
{
|
|
config: [true, true, false, true],
|
|
loadExpected: true,
|
|
annotationExpected: false,
|
|
},
|
|
|
|
// everywhere. TP entitylist wins.
|
|
{
|
|
config: [true, true, true, true],
|
|
loadExpected: true,
|
|
annotationExpected: false,
|
|
},
|
|
];
|
|
|
|
function prefBlacklistValue(value) {
|
|
return value ? "example.com" : "";
|
|
}
|
|
|
|
function prefWhitelistValue(value) {
|
|
return value ? "mochi.test,mochi.xorigin-test" : "";
|
|
}
|
|
|
|
async function runTest(test, expectedFlag, expectedTrackingResource, prefs) {
|
|
let config = [
|
|
[
|
|
"urlclassifier.trackingAnnotationTable.testEntries",
|
|
prefBlacklistValue(test.config[0]),
|
|
],
|
|
[
|
|
"urlclassifier.features.fingerprinting.annotate.blacklistHosts",
|
|
prefBlacklistValue(test.config[0]),
|
|
],
|
|
[
|
|
"urlclassifier.features.cryptomining.annotate.blacklistHosts",
|
|
prefBlacklistValue(test.config[0]),
|
|
],
|
|
[
|
|
"urlclassifier.features.socialtracking.annotate.blacklistHosts",
|
|
prefBlacklistValue(test.config[0]),
|
|
],
|
|
|
|
[
|
|
"urlclassifier.trackingAnnotationWhitelistTable.testEntries",
|
|
prefWhitelistValue(test.config[1]),
|
|
],
|
|
[
|
|
"urlclassifier.features.fingerprinting.annotate.whitelistHosts",
|
|
prefWhitelistValue(test.config[1]),
|
|
],
|
|
[
|
|
"urlclassifier.features.cryptomining.annotate.whitelistHosts",
|
|
prefWhitelistValue(test.config[1]),
|
|
],
|
|
[
|
|
"urlclassifier.features.socialtracking.annotate.whitelistHosts",
|
|
prefWhitelistValue(test.config[1]),
|
|
],
|
|
|
|
[
|
|
"urlclassifier.trackingTable.testEntries",
|
|
prefBlacklistValue(test.config[2]),
|
|
],
|
|
[
|
|
"urlclassifier.features.fingerprinting.blacklistHosts",
|
|
prefBlacklistValue(test.config[2]),
|
|
],
|
|
[
|
|
"urlclassifier.features.cryptomining.blacklistHosts",
|
|
prefBlacklistValue(test.config[2]),
|
|
],
|
|
[
|
|
"urlclassifier.features.socialtracking.blacklistHosts",
|
|
prefBlacklistValue(test.config[2]),
|
|
],
|
|
|
|
[
|
|
"urlclassifier.trackingWhitelistTable.testEntries",
|
|
prefWhitelistValue(test.config[3]),
|
|
],
|
|
[
|
|
"urlclassifier.features.fingerprinting.whitelistHosts",
|
|
prefWhitelistValue(test.config[3]),
|
|
],
|
|
[
|
|
"urlclassifier.features.cryptomining.whitelistHosts",
|
|
prefWhitelistValue(test.config[3]),
|
|
],
|
|
[
|
|
"urlclassifier.features.socialtracking.whitelistHosts",
|
|
prefWhitelistValue(test.config[3]),
|
|
],
|
|
];
|
|
|
|
info("Testing: " + JSON.stringify(config) + "\n");
|
|
|
|
await SpecialPowers.pushPrefEnv({ set: config.concat(prefs) });
|
|
|
|
// This promise will be resolved when the chromeScript knows if the channel
|
|
// is annotated or not.
|
|
let annotationPromise;
|
|
if (test.loadExpected) {
|
|
info("We want to have annotation information");
|
|
annotationPromise = new Promise(resolve => {
|
|
chromeScript.addMessageListener(
|
|
"last-channel-flags",
|
|
data => resolve(data),
|
|
{ once: true }
|
|
);
|
|
});
|
|
}
|
|
|
|
// Let's load a script with a random query string to avoid network cache.
|
|
// Using a script as the fingerprinting feature does not block display content
|
|
let result = await new Promise(resolve => {
|
|
let script = document.createElement("script");
|
|
script.setAttribute(
|
|
"src",
|
|
"http://example.com/tests/toolkit/components/url-classifier/tests/mochitest/evil.js?" +
|
|
Math.random()
|
|
);
|
|
script.onload = _ => resolve(true);
|
|
script.onerror = _ => resolve(false);
|
|
document.body.appendChild(script);
|
|
});
|
|
|
|
is(result, test.loadExpected, "The loading happened correctly");
|
|
|
|
if (annotationPromise) {
|
|
let data = await annotationPromise;
|
|
is(
|
|
!!data.classificationFlags,
|
|
test.annotationExpected,
|
|
"The annotation happened correctly"
|
|
);
|
|
if (test.annotationExpected) {
|
|
is(data.classificationFlags, expectedFlag, "Correct flag");
|
|
is(
|
|
data.isThirdPartyTrackingResource,
|
|
expectedTrackingResource,
|
|
"Tracking resource flag matches"
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
var chromeScript;
|
|
|
|
function runTests(flag, prefs, trackingResource) {
|
|
chromeScript = SpecialPowers.loadChromeScript(_ => {
|
|
/* eslint-env mozilla/chrome-script */
|
|
function onExamResp(subject) {
|
|
let channel = subject.QueryInterface(Ci.nsIHttpChannel);
|
|
let classifiedChannel = subject.QueryInterface(Ci.nsIClassifiedChannel);
|
|
if (
|
|
!channel ||
|
|
!classifiedChannel ||
|
|
!channel.URI.spec.startsWith(
|
|
"http://example.com/tests/toolkit/components/url-classifier/tests/mochitest/evil.js"
|
|
)
|
|
) {
|
|
return;
|
|
}
|
|
|
|
sendAsyncMessage("last-channel-flags", {
|
|
classificationFlags: classifiedChannel.classificationFlags,
|
|
isThirdPartyTrackingResource:
|
|
classifiedChannel.isThirdPartyTrackingResource(),
|
|
});
|
|
}
|
|
|
|
addMessageListener("done", __ => {
|
|
Services.obs.removeObserver(onExamResp, "http-on-examine-response");
|
|
});
|
|
|
|
Services.obs.addObserver(onExamResp, "http-on-examine-response");
|
|
|
|
sendAsyncMessage("start-test");
|
|
});
|
|
|
|
chromeScript.addMessageListener(
|
|
"start-test",
|
|
async _ => {
|
|
for (let test in tests) {
|
|
await runTest(tests[test], flag, trackingResource, prefs);
|
|
}
|
|
|
|
chromeScript.sendAsyncMessage("done");
|
|
SimpleTest.finish();
|
|
},
|
|
{ once: true }
|
|
);
|
|
}
|