diff options
Diffstat (limited to 'netwerk/test/browser/browser_103_assets.js')
-rw-r--r-- | netwerk/test/browser/browser_103_assets.js | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/netwerk/test/browser/browser_103_assets.js b/netwerk/test/browser/browser_103_assets.js new file mode 100644 index 0000000000..c8de25c2ca --- /dev/null +++ b/netwerk/test/browser/browser_103_assets.js @@ -0,0 +1,171 @@ +/* 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( + "resource://testing-common/early_hint_preload_test_helper.sys.mjs" +); + +// - 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( + "http://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs", + { headers } + ); + + let requestUrl = `https://example.com/browser/netwerk/test/browser/early_hint_asset_html.sjs?as=${asset}&hinted=${ + 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, aData) { + 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( + "http://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs" + ).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 +/* TODO(Bug 1798319): enable this test case +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"); +}); |