Bug 1744822 - Make early hint preloads also preload cross origin requests r=necko-reviewers,ckerschb,dragana

Differential Revision: https://phabricator.services.mozilla.com/D143739
This commit is contained in:
Manuel Bucher 2022-06-15 09:59:46 +00:00
parent 64e0803487
commit 9576ffa343
9 changed files with 72 additions and 89 deletions

View File

@ -164,11 +164,8 @@ void EarlyHintPreloader::MaybeCreateAndInsertPreload(
// use the base uri
NS_ENSURE_SUCCESS_VOID(aHeader.NewResolveHref(getter_AddRefs(uri), aBaseURI));
// Only make same origin preloads, the fromPrivateWindow is only read when
// reportError is enabled, so setting both to false is safe.
if (NS_FAILED(nsContentUtils::GetSecurityManager()->CheckSameOriginURI(
aBaseURI, uri, /* reportError */ false,
/* fromPrivateWindow */ false))) {
// only preload secure context urls
if (!uri->SchemeIs("https")) {
return;
}
@ -324,12 +321,8 @@ EarlyHintPreloader::AsyncOnChannelRedirect(
return NS_OK;
}
// abort the request if redirecting to cross origin resource, the
// fromPrivateWindow is only read when reportError is enabled, so setting both
// to false is safe.
if (NS_FAILED(nsContentUtils::GetSecurityManager()->CheckSameOriginURI(
mURI, newURI, /* reportError */ false,
/* fromPrivateWindow */ false))) {
// abort the request if redirecting to insecure context
if (!newURI->SchemeIs("https")) {
callback->OnRedirectVerifyCallback(NS_ERROR_ABORT);
return NS_OK;
}

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
<html>
<body>
<img src="http://example.com/browser/netwerk/test/browser/square.png" width="100px">
<img src="https://example.com/browser/netwerk/test/browser/square.png" width="100px">
</body>
</html>

View File

@ -1,2 +1,2 @@
HTTP 103 Too Early
Link: <http://example.com/browser/netwerk/test/browser/square.png>; rel=preload; as=image
Link: <https://example.com/browser/netwerk/test/browser/square.png>; rel=preload; as=image

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
<html>
<body>
<img src="http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs?f5a05cb8-43e6-4868-bc0f-ca453ef87826" width="100px">
<img src="https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs?f5a05cb8-43e6-4868-bc0f-ca453ef87826" width="100px">
</body>
</html>

View File

@ -1,2 +1,2 @@
HTTP 103 Early Hints
Link: <http://example.com/browser/netwerk/test/browser/square.png>; rel=preload; as=image
Link: <https://example.com/browser/netwerk/test/browser/square.png>; rel=preload; as=image

View File

@ -1,6 +1,6 @@
<!DOCTYPE html>
<html>
<body>
<img src="http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs?1ac2a5e1-90c7-4171-b0f0-676f7d899af3" width="100px">
<img src="https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs?1ac2a5e1-90c7-4171-b0f0-676f7d899af3" width="100px">
</body>
</html>

View File

@ -1,2 +1,2 @@
HTTP 103 Too Early
Link: <http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs?1ac2a5e1-90c7-4171-b0f0-676f7d899af3>; rel=preload; as=image
Link: <https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs?1ac2a5e1-90c7-4171-b0f0-676f7d899af3>; rel=preload; as=image

View File

@ -4,11 +4,6 @@
"use strict";
Services.prefs.setCharPref(
"dom.securecontext.allowlist",
"example.com,example.net"
);
Services.prefs.setBoolPref("network.early-hints.enabled", true);
const {
@ -23,8 +18,8 @@ const {
add_task(async function test_103_error_400() {
await test_hint_preload(
"test_103_error_400",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?400",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?400",
{ hinted: 1, normal: 1 }
);
});
@ -33,8 +28,8 @@ add_task(async function test_103_error_400() {
add_task(async function test_103_error_401() {
await test_hint_preload(
"test_103_error_401",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?401",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?401",
{ hinted: 1, normal: 1 }
);
});
@ -43,8 +38,8 @@ add_task(async function test_103_error_401() {
add_task(async function test_103_error_403() {
await test_hint_preload(
"test_103_error_403",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?403",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?403",
{ hinted: 1, normal: 1 }
);
});
@ -53,8 +48,8 @@ add_task(async function test_103_error_403() {
add_task(async function test_103_error_404() {
await test_hint_preload(
"test_103_error_404",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?404",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?404",
{ hinted: 1, normal: 1 }
);
});
@ -63,8 +58,8 @@ add_task(async function test_103_error_404() {
add_task(async function test_103_error_408() {
await test_hint_preload(
"test_103_error_408",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?408",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?408",
{ hinted: 1, normal: 1 }
);
});
@ -73,8 +68,8 @@ add_task(async function test_103_error_408() {
add_task(async function test_103_error_410() {
await test_hint_preload(
"test_103_error_410",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?410",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?410",
{ hinted: 1, normal: 0 }
);
});
@ -83,8 +78,8 @@ add_task(async function test_103_error_410() {
add_task(async function test_103_error_429() {
await test_hint_preload(
"test_103_error_429",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?429",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?429",
{ hinted: 1, normal: 1 }
);
});
@ -93,8 +88,8 @@ add_task(async function test_103_error_429() {
add_task(async function test_103_error_500() {
await test_hint_preload(
"test_103_error_500",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?500",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?500",
{ hinted: 1, normal: 1 }
);
});
@ -103,8 +98,8 @@ add_task(async function test_103_error_500() {
add_task(async function test_103_error_502() {
await test_hint_preload(
"test_103_error_502",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?502",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?502",
{ hinted: 1, normal: 1 }
);
});
@ -113,8 +108,8 @@ add_task(async function test_103_error_502() {
add_task(async function test_103_error_503() {
await test_hint_preload(
"test_103_error_503",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?503",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?503",
{ hinted: 1, normal: 1 }
);
});
@ -123,8 +118,8 @@ add_task(async function test_103_error_503() {
add_task(async function test_103_error_504() {
await test_hint_preload(
"test_103_error_504",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_error.sjs?504",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_error.sjs?504",
{ hinted: 1, normal: 1 }
);
});

View File

@ -4,11 +4,6 @@
"use strict";
Services.prefs.setCharPref(
"dom.securecontext.allowlist",
"example.com,example.net"
);
Services.prefs.setBoolPref("network.early-hints.enabled", true);
const {
@ -26,15 +21,15 @@ const {
add_task(async function test_103_two_preload_responses() {
await test_hint_preload_internal(
"103_two_preload_responses",
"http://example.com",
"https://example.com",
[
[
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
Services.uuid.generateUUID().toString(),
],
["", "new_response"], // empty string to indicate new early hint response
[
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
Services.uuid.generateUUID().toString(),
],
],
@ -46,15 +41,15 @@ add_task(async function test_103_two_preload_responses() {
add_task(async function test_103_two_link_header() {
await test_hint_preload_internal(
"103_two_link_header",
"http://example.com",
"https://example.com",
[
[
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
Services.uuid.generateUUID().toString(),
],
["", ""], // empty string to indicate new early hint response
[
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
Services.uuid.generateUUID().toString(),
],
],
@ -66,14 +61,14 @@ add_task(async function test_103_two_link_header() {
add_task(async function test_103_two_links() {
await test_hint_preload_internal(
"103_two_links",
"http://example.com",
"https://example.com",
[
[
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
Services.uuid.generateUUID().toString(),
],
[
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
Services.uuid.generateUUID().toString(),
],
],
@ -88,15 +83,15 @@ add_task(async function test_103_preload_twice() {
let uuid = Services.uuid.generateUUID();
await test_hint_preload(
"test_103_preload_twice_1",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 1, normal: 0 },
uuid
);
await test_hint_preload(
"test_103_preload_twice_2",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 0, normal: 0 },
uuid
);
@ -107,8 +102,8 @@ add_task(async function test_103_preload_disabled() {
Services.prefs.setBoolPref("network.early-hints.enabled", false);
await test_hint_preload(
"test_103_preload_disabled",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 0, normal: 1 }
);
Services.prefs.setBoolPref("network.early-hints.enabled", true);
@ -128,8 +123,8 @@ add_task(async function test_103_preload_https() {
add_task(async function test_103_preload() {
await test_hint_preload(
"test_103_preload",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 1, normal: 0 }
);
});
@ -138,9 +133,9 @@ add_task(async function test_103_preload() {
add_task(async function test_103_preload_cor() {
await test_hint_preload(
"test_103_preload_cor",
"http://example.com",
"http://example.net/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 0, normal: 1 }
"https://example.com",
"https://example.net/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 1, normal: 0 }
);
});
@ -148,7 +143,7 @@ add_task(async function test_103_preload_cor() {
add_task(async function test_103_preload_insecure_cor() {
await test_hint_preload(
"test_103_preload_insecure_cor",
"http://example.com",
"https://example.com",
"http://mochi.test:8888/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 0, normal: 1 }
);
@ -158,7 +153,7 @@ add_task(async function test_103_preload_insecure_cor() {
add_task(async function test_103_relative_preload() {
await test_hint_preload(
"test_103_relative_preload",
"http://example.com",
"https://example.com",
"/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 1, normal: 0 }
);
@ -178,8 +173,8 @@ add_task(async function test_103_insecure_preload() {
add_task(async function test_103_redirect_same_origin() {
await test_hint_preload(
"test_103_redirect_same_origin",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_redirect.sjs?http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_redirect.sjs?https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 2, normal: 0 } // successful preload of redirect and resulting image
);
});
@ -188,9 +183,9 @@ add_task(async function test_103_redirect_same_origin() {
add_task(async function test_103_redirect_cross_origin() {
await test_hint_preload(
"test_103_redirect_cross_origin",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_redirect.sjs?http://example.net/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 1, normal: 1 } // successful load of redirect in preload, but image loaded via normal load
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_redirect.sjs?https://example.net/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 2, normal: 0 } // successful load of redirect in preload, but image loaded via normal load
);
});
@ -198,8 +193,8 @@ add_task(async function test_103_redirect_cross_origin() {
add_task(async function test_103_redirect_insecure_cross_origin() {
await test_hint_preload(
"test_103_redirect_insecure_cross_origin",
"http://example.com",
"http://example.com/browser/netwerk/test/browser/early_hint_redirect.sjs?http://mochi.test:8888/browser/netwerk/test/browser/early_hint_pixel.sjs",
"https://example.com",
"https://example.com/browser/netwerk/test/browser/early_hint_redirect.sjs?http://mochi.test:8888/browser/netwerk/test/browser/early_hint_pixel.sjs",
{ hinted: 1, normal: 1 }
);
});
@ -228,7 +223,7 @@ add_task(async function test_103_preload_redirect_mixed_content() {
add_task(async function test_103_preload_only_file() {
await test_hint_preload(
"test_103_preload_only_file",
"http://example.com",
"https://example.com",
"early_hint_pixel.sjs",
{ hinted: 1, normal: 0 }
);
@ -240,12 +235,12 @@ add_task(async function test_preload_csp_imgsrc_none() {
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",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs",
{ headers }
);
let requestUrl =
"http://example.com/browser/netwerk/test/browser/103_preload_csp_imgsrc_none.html";
"https://example.com/browser/netwerk/test/browser/103_preload_csp_imgsrc_none.html";
await BrowserTestUtils.withNewTab(
{
@ -256,7 +251,7 @@ add_task(async function test_preload_csp_imgsrc_none() {
async function(browser) {
let noImgLoaded = await SpecialPowers.spawn(browser, [], function() {
let loadInfo = content.performance.getEntriesByName(
"http://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs?1ac2a5e1-90c7-4171-b0f0-676f7d899af3"
"https://example.com/browser/netwerk/test/browser/early_hint_pixel.sjs?1ac2a5e1-90c7-4171-b0f0-676f7d899af3"
);
return loadInfo.every(entry => entry.decodedBodySize === 0);
});
@ -268,7 +263,7 @@ add_task(async function test_preload_csp_imgsrc_none() {
);
let gotRequestCount = await fetch(
"http://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs"
"https://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs"
).then(response => response.json());
let expectedRequestCount = { hinted: 1, normal: 0 };
@ -295,12 +290,12 @@ add_task(async function test_103_iframe() {
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",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs",
{ headers }
);
let iframeUri =
"http://example.com/browser/netwerk/test/browser/103_preload_iframe.html";
"https://example.com/browser/netwerk/test/browser/103_preload_iframe.html";
await BrowserTestUtils.withNewTab(
{
@ -312,7 +307,7 @@ add_task(async function test_103_iframe() {
);
let gotRequestCount = await fetch(
"http://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs"
"https://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs"
).then(response => response.json());
let expectedRequestCount = { hinted: 0, normal: 1 };
@ -339,12 +334,12 @@ add_task(async function test_103_anchor() {
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",
"https://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs",
{ headers }
);
let anchorUri =
"http://example.com/browser/netwerk/test/browser/103_preload_anchor.html";
"https://example.com/browser/netwerk/test/browser/103_preload_anchor.html";
await BrowserTestUtils.withNewTab(
{
@ -356,7 +351,7 @@ add_task(async function test_103_anchor() {
);
let gotRequestCount = await fetch(
"http://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs"
"https://example.com/browser/netwerk/test/browser/early_hint_pixel_count.sjs"
).then(response => response.json());
await Assert.deepEqual(