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/. */
// On debug osx test machine, verify chaos mode takes slightly too long
requestLongerTimeout(2);
Services.prefs.setBoolPref("network.early-hints.enabled", true);
const { request_count_checking } = ChromeUtils.importESModule(
);
// - testName is just there to be printed during Asserts when failing
// - asset is the asset type, see early_hint_asset_html.sjs for possible values
// for the asset type fetch see test_hint_fetch due to timing issues
// - variant:
// - "normal": no early hints, expects one normal request expected
// - "hinted": early hints sent, expects one hinted request
// - "reload": early hints sent, resources non-cacheable, two early-hint requests expected
// - "cached": same as reload, but resources are cacheable, so only one hinted network request expected
async function test_hint_asset(testName, asset, variant) {
// reset the count
let headers = new Headers();
headers.append("X-Early-Hint-Count-Start", "");
await fetch(
{ headers }
);
variant !== "normal" ? "1" : "0"
}&cached=${variant === "cached" ? "1" : "0"}`;
let numConnectBackRemaining = 0;
if (variant === "hinted") {
numConnectBackRemaining = 1;
} else if (variant === "reload" || variant === "cached") {
numConnectBackRemaining = 2;
}
let observer = {
QueryInterface: ChromeUtils.generateQI(["nsIObserver"]),
observe(aSubject, aTopic) {
if (aTopic == "earlyhints-connectback") {
numConnectBackRemaining -= 1;
}
},
};
Services.obs.addObserver(observer, "earlyhints-connectback");
await BrowserTestUtils.withNewTab(
{
gBrowser,
url: requestUrl,
waitForLoad: true,
},
async function (browser) {
if (asset === "fetch") {
// wait until the fetch is complete
await TestUtils.waitForCondition(_ => {
return SpecialPowers.spawn(browser, [], _ => {
return (
content.document.getElementsByTagName("h2")[0] != undefined &&
content.document.getElementsByTagName("h2")[0].textContent !==
"Fetching..." // default text set by early_hint_asset_html.sjs
);
});
});
}
// reload
if (variant === "reload" || variant === "cached") {
await BrowserTestUtils.reloadTab(gBrowser.selectedTab);
}
if (asset === "fetch") {
// wait until the fetch is complete
await TestUtils.waitForCondition(_ => {
return SpecialPowers.spawn(browser, [], _ => {
return (
content.document.getElementsByTagName("h2")[0] != undefined &&
content.document.getElementsByTagName("h2")[0].textContent !==
"Fetching..." // default text set by early_hint_asset_html.sjs
);
});
});
}
}
);
Services.obs.removeObserver(observer, "earlyhints-connectback");
let gotRequestCount = await fetch(
).then(response => response.json());
Assert.equal(
numConnectBackRemaining,
0,
`${testName} (${asset}) no remaining connect back expected`
);
let expectedRequestCount;
if (variant === "normal") {
expectedRequestCount = { hinted: 0, normal: 1 };
} else if (variant === "hinted") {
expectedRequestCount = { hinted: 1, normal: 0 };
} else if (variant === "reload") {
expectedRequestCount = { hinted: 2, normal: 0 };
} else if (variant === "cached") {
expectedRequestCount = { hinted: 1, normal: 0 };
}
await request_count_checking(
`${testName} (${asset})`,
gotRequestCount,
expectedRequestCount
);
if (variant === "cached") {
Services.cache2.clear();
}
}
// preload image
add_task(async function test_103_asset_image() {
await test_hint_asset("test_103_asset_normal", "image", "normal");
await test_hint_asset("test_103_asset_hinted", "image", "hinted");
await test_hint_asset("test_103_asset_reload", "image", "reload");
// TODO(Bug 1815884): await test_hint_asset("test_103_asset_cached", "image", "cached");
});
// preload css
add_task(async function test_103_asset_style() {
await test_hint_asset("test_103_asset_normal", "style", "normal");
await test_hint_asset("test_103_asset_hinted", "style", "hinted");
await test_hint_asset("test_103_asset_reload", "style", "reload");
// TODO(Bug 1815884): await test_hint_asset("test_103_asset_cached", "style", "cached");
});
// preload javascript
add_task(async function test_103_asset_javascript() {
await test_hint_asset("test_103_asset_normal", "script", "normal");
await test_hint_asset("test_103_asset_hinted", "script", "hinted");
await test_hint_asset("test_103_asset_reload", "script", "reload");
await test_hint_asset("test_103_asset_cached", "script", "cached");
});
// preload javascript module
add_task(async function test_103_asset_module() {
await test_hint_asset("test_103_asset_normal", "module", "normal");
await test_hint_asset("test_103_asset_hinted", "module", "hinted");
await test_hint_asset("test_103_asset_reload", "module", "reload");
await test_hint_asset("test_103_asset_cached", "module", "cached");
});
// preload font
add_task(async function test_103_asset_font() {
await test_hint_asset("test_103_asset_normal", "font", "normal");
await test_hint_asset("test_103_asset_hinted", "font", "hinted");
await test_hint_asset("test_103_asset_reload", "font", "reload");
await test_hint_asset("test_103_asset_cached", "font", "cached");
});
// preload fetch
add_task(async function test_103_asset_fetch() {
await test_hint_asset("test_103_asset_normal", "fetch", "normal");
await test_hint_asset("test_103_asset_hinted", "fetch", "hinted");
await test_hint_asset("test_103_asset_reload", "fetch", "reload");
await test_hint_asset("test_103_asset_cached", "fetch", "cached");
});