1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/
*/
const { CookieXPCShellUtils } = ChromeUtils.importESModule(
"resource://testing-common/CookieXPCShellUtils.sys.mjs"
);
CookieXPCShellUtils.init(this);
let gHits = 0;
add_task(async function () {
do_get_profile();
info("Disable predictor and accept all");
Services.prefs.setBoolPref("network.predictor.enabled", false);
Services.prefs.setBoolPref("network.predictor.enable-prefetch", false);
Services.prefs.setBoolPref("network.http.rcwn.enabled", false);
Services.prefs.setIntPref("network.cookie.cookieBehavior", 0);
const server = CookieXPCShellUtils.createServer({
hosts: ["example.org", "foo.com", "bar.com"],
});
server.registerFile(
"/font.woff",
do_get_file("data/font.woff"),
(_, response) => {
response.setHeader("Access-Control-Allow-Origin", "*", false);
gHits++;
}
);
server.registerPathHandler("/font", (request, response) => {
response.setStatusLine(request.httpVersion, 200, "OK");
response.setHeader("Content-Type", "text/html", false);
let body = `
<style type="text/css">
@font-face {
font-family: foo;
src: url("http://example.org/font.woff") format('woff');
}
body { font-family: foo }
</style>
<iframe src="http://example.org/font-iframe">
</iframe>`;
response.bodyOutputStream.write(body, body.length);
});
server.registerPathHandler("/font-iframe", (request, response) => {
response.setStatusLine(request.httpVersion, 200, "OK");
response.setHeader("Content-Type", "text/html", false);
let body = `
<style type="text/css">
@font-face {
font-family: foo;
src: url("http://example.org/font.woff") format('woff');
}
body { font-family: foo }
</style>`;
response.bodyOutputStream.write(body, body.length);
});
const tests = [
{
prefValue: true,
hitsCount: 5,
},
{
prefValue: false,
// The font in page B/C is CORS, the channel will be flagged with
// nsIRequest::LOAD_ANONYMOUS.
// The flag makes the font in A and B/C use different cache key.
hitsCount: 2,
},
];
for (let test of tests) {
info("Clear network caches");
Services.cache2.clear();
info("Reset the hits count");
gHits = 0;
info("Enabling network state partitioning");
Services.prefs.setBoolPref(
"privacy.partition.network_state",
test.prefValue
);
info("Let's load a page with origin A");
let contentPage = await CookieXPCShellUtils.loadContentPage(
"http://example.org/font"
);
await contentPage.close();
info("Let's load a page with origin B");
contentPage = await CookieXPCShellUtils.loadContentPage(
"http://foo.com/font"
);
await contentPage.close();
info("Let's load a page with origin C");
contentPage = await CookieXPCShellUtils.loadContentPage(
"http://bar.com/font"
);
await contentPage.close();
Assert.equal(gHits, test.hitsCount, "The number of hits match");
}
});
|