Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
Services.prefs.setBoolPref("network.early-hints.enabled", true);
// This verifies hints, requests server-side and client-side that the image actually loaded
async function test_image_preload_hint_request_loaded(
input,
expected_results,
image_should_load
) {
// reset the count
let headers = new Headers();
headers.append("X-Early-Hint-Count-Start", "");
await fetch(
{ headers }
);
input.resource_type
}&hinted=${input.hinted ? "1" : "0"}${input.csp ? "&csp=" + input.csp : ""}${
input.csp_in_early_hint
? "&csp_in_early_hint=" + input.csp_in_early_hint
: ""
}${input.host ? "&host=" + input.host : ""}`;
console.log("requestUrl: " + requestUrl);
await BrowserTestUtils.withNewTab(
{
gBrowser,
url: requestUrl,
waitForLoad: true,
},
async function (browser) {
let imageLoaded = await ContentTask.spawn(browser, [], function () {
let image = content.document.getElementById("test_image");
return image && image.complete && image.naturalHeight !== 0;
});
await Assert.ok(
image_should_load == imageLoaded,
"test_image_preload_hint_request_loaded: the image can be loaded as expected " +
requestUrl
);
}
);
let gotRequestCount = await fetch(
).then(response => response.json());
await Assert.deepEqual(gotRequestCount, expected_results, input.test_name);
Services.cache2.clear();
}
// These tests verify whether or not the image actually loaded in the document
add_task(async function test_images_loaded_with_csp() {
let tests = [
{
input: {
test_name: "image loaded - no csp",
resource_type: "image",
csp: "",
csp_in_early_hint: "",
host: "",
hinted: true,
},
expected: { hinted: 1, normal: 0 },
image_should_load: true,
},
{
input: {
test_name: "image loaded - img-src none",
resource_type: "image",
csp: "img-src 'none';",
csp_in_early_hint: "",
host: "",
hinted: true,
},
expected: { hinted: 1, normal: 0 },
image_should_load: false,
},
{
input: {
test_name: "image loaded - img-src none in EH response",
resource_type: "image",
csp: "",
csp_in_early_hint: "img-src 'none';",
host: "",
hinted: true,
},
expected: { hinted: 0, normal: 1 },
image_should_load: true,
},
{
input: {
test_name: "image loaded - img-src none in both headers",
resource_type: "image",
csp: "img-src 'none';",
csp_in_early_hint: "img-src 'none';",
host: "",
hinted: true,
},
expected: { hinted: 0, normal: 0 },
image_should_load: false,
},
{
input: {
test_name: "image loaded - img-src self",
resource_type: "image",
csp: "img-src 'self';",
csp_in_early_hint: "",
host: "",
hinted: true,
},
expected: { hinted: 1, normal: 0 },
image_should_load: true,
},
{
input: {
test_name: "image loaded - img-src self in EH response",
resource_type: "image",
csp: "",
csp_in_early_hint: "img-src 'self';",
host: "",
hinted: true,
},
expected: { hinted: 1, normal: 0 },
image_should_load: true,
},
{
input: {
test_name: "image loaded - conflicting csp, early hint skipped",
resource_type: "image",
csp: "img-src 'self';",
csp_in_early_hint: "img-src 'none';",
host: "",
hinted: true,
},
expected: { hinted: 0, normal: 1 },
image_should_load: true,
},
{
input: {
test_name:
"image loaded - conflicting csp, resource not loaded in document",
resource_type: "image",
csp: "img-src 'none';",
csp_in_early_hint: "img-src 'self';",
host: "",
hinted: true,
},
expected: { hinted: 1, normal: 0 },
image_should_load: false,
},
];
for (let test of tests) {
await test_image_preload_hint_request_loaded(
test.input,
test.expected,
test.image_should_load
);
}
});