Skip to content

Commit 5923206

Browse files
Bug 1859353 - Part 2: Create a mechanism to combine multiple query parameter lists into one. r=timhuang
Depends on D203080 Differential Revision: https://phabricator.services.mozilla.com/D203081
1 parent be515dd commit 5923206

File tree

4 files changed

+134
-63
lines changed

4 files changed

+134
-63
lines changed

browser/base/content/test/static/browser_all_files_referenced.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ var gExceptionPaths = [
8181

8282
// CSS files are referenced inside JS in an html template
8383
"chrome://browser/content/aboutlogins/components/",
84+
85+
// Strip on Share parameter lists
86+
"chrome://global/content/antitracking/",
8487
];
8588

8689
// These are not part of the omni.ja file, so we find them only when running

toolkit/components/antitracking/URLQueryStrippingListService.sys.mjs

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,9 @@ XPCOMUtils.defineLazyPreferenceGetter(
3131
PREF_STRIP_IS_TEST
3232
);
3333

34-
// Lazy getter for the strip-on-share strip list.
35-
ChromeUtils.defineLazyGetter(lazy, "StripOnShareList", async () => {
34+
async function fetchAndParseList(fileName) {
3635
let response = await fetch(
37-
"chrome://global/content/antitracking/StripOnShare.json"
36+
"chrome://global/content/antitracking/" + fileName
3837
);
3938
if (!response.ok) {
4039
lazy.logger.error(
@@ -44,7 +43,48 @@ ChromeUtils.defineLazyGetter(lazy, "StripOnShareList", async () => {
4443
"Error fetching strip-on-share strip list" + response.status
4544
);
4645
}
47-
return response.json();
46+
return await response.json();
47+
}
48+
49+
// Lazy getter for the strip-on-share strip list.
50+
ChromeUtils.defineLazyGetter(lazy, "StripOnShareList", async () => {
51+
let [stripOnShareList, stripOnShareLGPLParams] = await Promise.all([
52+
fetchAndParseList("StripOnShare.json"),
53+
fetchAndParseList("StripOnShareLGPL.json"),
54+
]);
55+
56+
if (!stripOnShareList || !stripOnShareLGPLParams) {
57+
lazy.logger.error("Error strip-on-share strip list were not loaded");
58+
throw new Error("Error fetching strip-on-share strip list were not loaded");
59+
}
60+
61+
// Combines the mozilla licensed strip on share param
62+
// list and the LGPL licensed strip on share param list
63+
for (const key in stripOnShareLGPLParams) {
64+
if (Object.hasOwn(stripOnShareList, key)) {
65+
stripOnShareList[key].queryParams.push(
66+
...stripOnShareLGPLParams[key].queryParams
67+
);
68+
69+
stripOnShareList[key].topLevelSites.push(
70+
...stripOnShareLGPLParams[key].topLevelSites
71+
);
72+
73+
// Removes duplicates topLevelSitres
74+
stripOnShareList[key].topLevelSites = [
75+
...new Set(stripOnShareList[key].topLevelSites),
76+
];
77+
78+
// Removes duplicates queryParams
79+
stripOnShareList[key].queryParams = [
80+
...new Set(stripOnShareList[key].queryParams),
81+
];
82+
} else {
83+
stripOnShareList[key] = stripOnShareLGPLParams[key];
84+
}
85+
}
86+
87+
return stripOnShareList;
4888
});
4989

5090
export class URLQueryStrippingListService {

toolkit/components/antitracking/jar.mn

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,7 @@ toolkit.jar:
99
# domain1: {queryParams: [param1, param2, ..], topLevelSites: [www.site.de, www.site.com,...]}, domain2: {...}
1010
# This list will be consumed from the nsIQueryStrippingListService and
1111
# later be dispatched to the nsIURLQueryStringStripper in a further processed form.
12-
content/global/antitracking/StripOnShare.json (data/StripOnShare.json)
12+
content/global/antitracking/StripOnShare.json (StripOnShareLists/MPL2/StripOnShare.json)
13+
14+
# Separate StripOnShare list for parameters that are covered in the LGPL License
15+
content/global/antitracking/StripOnShareLGPL.json (StripOnShareLists/LGPL/StripOnShareLGPL.json)

toolkit/components/antitracking/test/xpcshell/test_validate_strip_on_share_list.js

Lines changed: 83 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -7,67 +7,19 @@ const { JsonSchema } = ChromeUtils.importESModule(
77
"resource://gre/modules/JsonSchema.sys.mjs"
88
);
99

10-
let stripOnShareList;
10+
let stripOnShareMergedList, stripOnShareLGPLParams, stripOnShareList;
1111

12-
// Fetching strip on share list
13-
add_setup(async function () {
14-
/* globals fetch */
15-
let response = await fetch(
16-
"chrome://global/content/antitracking/StripOnShare.json"
17-
);
12+
async function fetchAndParseList(fileName) {
13+
let response = await fetch("chrome://global/content/" + fileName);
1814
if (!response.ok) {
1915
throw new Error(
2016
"Error fetching strip-on-share strip list" + response.status
2117
);
2218
}
23-
stripOnShareList = await response.json();
24-
});
25-
26-
// Check if the Strip on Share list contains any duplicate params
27-
add_task(async function test_check_duplicates() {
28-
let stripOnShareParams = stripOnShareList;
29-
30-
const allQueryParams = [];
31-
32-
for (const domain in stripOnShareParams) {
33-
for (let param in stripOnShareParams[domain].queryParams) {
34-
allQueryParams.push(stripOnShareParams[domain].queryParams[param]);
35-
}
36-
}
37-
38-
let setOfParams = new Set(allQueryParams);
39-
40-
if (setOfParams.size != allQueryParams.length) {
41-
let setToCheckDupes = new Set();
42-
let dupeList = new Set();
43-
for (const domain in stripOnShareParams) {
44-
for (let param in stripOnShareParams[domain].queryParams) {
45-
let tempParam = stripOnShareParams[domain].queryParams[param];
46-
47-
if (setToCheckDupes.has(tempParam)) {
48-
dupeList.add(tempParam);
49-
} else {
50-
setToCheckDupes.add(tempParam);
51-
}
52-
}
53-
}
54-
55-
Assert.equal(
56-
setOfParams.size,
57-
allQueryParams.length,
58-
"There are duplicates rules. The duplicate rules are " + [...dupeList]
59-
);
60-
}
19+
return await response.json();
20+
}
6121

62-
Assert.equal(
63-
setOfParams.size,
64-
allQueryParams.length,
65-
"There are no duplicates rules."
66-
);
67-
});
68-
69-
// Validate the format of Strip on Share list with Schema
70-
add_task(async function test_check_schema() {
22+
async function validateSchema(paramList, nameOfList) {
7123
let schema = {
7224
$schema: "http://json-schema.org/draft-07/schema#",
7325
type: "object",
@@ -88,13 +40,86 @@ add_task(async function test_check_schema() {
8840
required: ["global"],
8941
};
9042

91-
let stripOnShareParams = stripOnShareList;
9243
let validator = new JsonSchema.Validator(schema);
93-
let { valid, errors } = validator.validate(stripOnShareParams);
44+
let { valid, errors } = validator.validate(paramList);
9445

9546
if (!valid) {
96-
info("validation errors: " + JSON.stringify(errors, null, 2));
47+
info(
48+
nameOfList +
49+
" JSON contains these validation errors: " +
50+
JSON.stringify(errors, null, 2)
51+
);
52+
}
53+
54+
Assert.ok(valid, nameOfList + " JSON is valid");
55+
}
56+
57+
// Fetching strip on share list
58+
add_setup(async function () {
59+
/* globals fetch */
60+
61+
[stripOnShareList, stripOnShareLGPLParams] = await Promise.all([
62+
fetchAndParseList("antitracking/StripOnShare.json"),
63+
fetchAndParseList("antitracking/StripOnShareLGPL.json"),
64+
]);
65+
66+
stripOnShareMergedList = stripOnShareList;
67+
68+
// Combines the mozilla licensed strip on share param
69+
// list and the LGPL licensed strip on share param list
70+
for (const key in stripOnShareLGPLParams) {
71+
if (Object.hasOwn(stripOnShareMergedList, key)) {
72+
stripOnShareMergedList[key].queryParams.push(
73+
...stripOnShareLGPLParams[key].queryParams
74+
);
75+
} else {
76+
stripOnShareMergedList[key] = stripOnShareLGPLParams[key];
77+
}
78+
}
79+
});
80+
81+
// Check if the Strip on Share list contains any duplicate params
82+
add_task(async function test_check_duplicates() {
83+
for (const domain in stripOnShareMergedList) {
84+
// Creates a set of query parameters for a given domain to check
85+
// for duplicates
86+
let setOfParams = new Set(stripOnShareMergedList[domain].queryParams);
87+
88+
// If there are duplicates which is known because the sizes of the set
89+
// and array don't match, then we check which parameters are duplciates
90+
if (setOfParams.size != stripOnShareMergedList[domain].queryParams.length) {
91+
let setToCheckDupes = new Set();
92+
let dupeList = new Set();
93+
for (let param in stripOnShareMergedList[domain].queryParams) {
94+
let tempParam = stripOnShareMergedList[domain].queryParams[param];
95+
96+
if (setToCheckDupes.has(tempParam)) {
97+
dupeList.add(tempParam);
98+
} else {
99+
setToCheckDupes.add(tempParam);
100+
}
101+
}
102+
103+
Assert.equal(
104+
setOfParams.size,
105+
stripOnShareMergedList[domain].queryParams.length,
106+
"There are duplicates rules in " +
107+
domain +
108+
". The duplicate rules are " +
109+
[...dupeList]
110+
);
111+
}
112+
113+
Assert.equal(
114+
setOfParams.size,
115+
stripOnShareMergedList[domain].queryParams.length,
116+
"There are no duplicates rules."
117+
);
97118
}
119+
});
98120

99-
Assert.ok(valid, "Strip on share JSON is valid");
121+
// Validate the format of Strip on Share list with Schema
122+
add_task(async function test_check_schema() {
123+
validateSchema(stripOnShareLGPLParams, "Strip On Share LGPL");
124+
validateSchema(stripOnShareList, "Strip On Share");
100125
});

0 commit comments

Comments
 (0)