summaryrefslogtreecommitdiff
path: root/chromium/content/browser/loader/prefetch_browsertest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/browser/loader/prefetch_browsertest.cc')
-rw-r--r--chromium/content/browser/loader/prefetch_browsertest.cc134
1 files changed, 124 insertions, 10 deletions
diff --git a/chromium/content/browser/loader/prefetch_browsertest.cc b/chromium/content/browser/loader/prefetch_browsertest.cc
index 9c4f9f49216..387af864050 100644
--- a/chromium/content/browser/loader/prefetch_browsertest.cc
+++ b/chromium/content/browser/loader/prefetch_browsertest.cc
@@ -13,13 +13,17 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
+#include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h"
#include "content/public/test/content_browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
+#include "content/public/test/url_loader_monitor.h"
#include "content/shell/browser/shell.h"
#include "net/base/features.h"
+#include "net/base/isolation_info.h"
#include "net/dns/mock_host_resolver.h"
#include "services/network/public/cpp/features.h"
+#include "services/network/public/cpp/resource_request.h"
#include "third_party/blink/public/common/features.h"
namespace content {
@@ -51,13 +55,9 @@ class PrefetchBrowserTest
if (split_cache_enabled_) {
enable_features.push_back(
net::features::kSplitCacheByNetworkIsolationKey);
- enable_features.push_back(
- network::features::kPrefetchMainResourceNetworkIsolationKey);
} else {
disabled_features.push_back(
net::features::kSplitCacheByNetworkIsolationKey);
- disabled_features.push_back(
- network::features::kPrefetchMainResourceNetworkIsolationKey);
}
feature_list_.InitWithFeatures(enable_features, disabled_features);
@@ -157,6 +157,55 @@ IN_PROC_BROWSER_TEST_P(PrefetchBrowserTestPrivacyChanges, RedirectNotFollowed) {
}
IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest,
+ CrossOriginDocumentHasNoSameSiteCookies) {
+ const char* prefetch_path = "/prefetch.html";
+ const char* target_path = "/target.html";
+ RegisterResponse(
+ target_path,
+ ResponseEntry("<head><title>Prefetch Target</title></head>"));
+
+ base::RunLoop prefetch_waiter;
+ auto request_counter = RequestCounter::CreateAndMonitor(
+ cross_origin_server_.get(), target_path, &prefetch_waiter);
+ RegisterRequestHandler(cross_origin_server_.get());
+ ASSERT_TRUE(cross_origin_server_->Start());
+
+ const GURL cross_origin_target_url =
+ cross_origin_server_->GetURL("3p.example", target_path);
+ RegisterResponse(
+ prefetch_path,
+ ResponseEntry(base::StringPrintf(
+ "<body><link rel='prefetch' as='document' href='%s'></body>",
+ cross_origin_target_url.spec().c_str())));
+ RegisterRequestHandler(embedded_test_server());
+ ASSERT_TRUE(embedded_test_server()->Start());
+ EXPECT_EQ(0, request_counter->GetRequestCount());
+ EXPECT_EQ(0, GetPrefetchURLLoaderCallCount());
+
+ URLLoaderMonitor monitor({cross_origin_target_url});
+
+ // Loading a page that prefetches the target URL would increment the
+ // |request_counter|.
+ EXPECT_TRUE(
+ NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)));
+ prefetch_waiter.Run();
+ EXPECT_EQ(1, request_counter->GetRequestCount());
+ EXPECT_EQ(1, GetPrefetchURLLoaderCallCount());
+
+ monitor.WaitForUrls();
+ base::Optional<network::ResourceRequest> request =
+ monitor.GetRequestInfo(cross_origin_target_url);
+ ASSERT_TRUE(request);
+ ASSERT_TRUE(request->site_for_cookies.IsNull());
+ ASSERT_TRUE(request->trusted_params);
+ url::Origin cross_origin = url::Origin::Create(cross_origin_target_url);
+ EXPECT_TRUE(net::IsolationInfo::Create(
+ net::IsolationInfo::RedirectMode::kUpdateNothing,
+ cross_origin, cross_origin, net::SiteForCookies())
+ .IsEqualForTesting(request->trusted_params->isolation_info));
+}
+
+IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest,
CrossOriginDocumentReusedAsNavigation) {
const char* prefetch_path = "/prefetch.html";
const char* target_path = "/target.html";
@@ -592,6 +641,71 @@ IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest, WithPreload) {
NavigateToURLAndWaitTitle(target_url, "done");
}
+IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest,
+ CrossOriginWithPreloadHasNoSameSiteCookies) {
+ const char* target_path = "/target.html";
+ const char* preload_path = "/preload.js";
+ RegisterResponse(
+ target_path,
+ ResponseEntry("<head><title>Prefetch Target</title><script "
+ "src=\"./preload.js\"></script></head>",
+ "text/html",
+ {{"link", "</preload.js>;rel=\"preload\";as=\"script\""},
+ {"access-control-allow-origin", "*"}}));
+ RegisterResponse(preload_path,
+ ResponseEntry("document.title=\"done\";", "text/javascript",
+ {{"cache-control", "public, max-age=600"}}));
+
+ base::RunLoop preload_waiter;
+ auto target_request_counter =
+ RequestCounter::CreateAndMonitor(cross_origin_server_.get(), target_path);
+ auto preload_request_counter = RequestCounter::CreateAndMonitor(
+ cross_origin_server_.get(), preload_path, &preload_waiter);
+ RegisterRequestHandler(cross_origin_server_.get());
+
+ ASSERT_TRUE(cross_origin_server_->Start());
+
+ const GURL cross_origin_target_url =
+ cross_origin_server_->GetURL("3p.example", target_path);
+
+ const char* prefetch_path = "/prefetch.html";
+ RegisterResponse(prefetch_path,
+ ResponseEntry(base::StringPrintf(
+ "<body><link rel='prefetch' href='%s' as='document' "
+ "crossorigin='anonymous'></body>",
+ cross_origin_target_url.spec().c_str())));
+ RegisterRequestHandler(embedded_test_server());
+ ASSERT_TRUE(embedded_test_server()->Start());
+ EXPECT_EQ(0, GetPrefetchURLLoaderCallCount());
+
+ URLLoaderMonitor monitor({cross_origin_target_url});
+
+ // Loading a page that prefetches the target URL would increment both
+ // |target_request_counter| and |preload_request_counter|.
+ EXPECT_TRUE(
+ NavigateToURL(shell(), embedded_test_server()->GetURL(prefetch_path)));
+ preload_waiter.Run();
+ EXPECT_EQ(1, target_request_counter->GetRequestCount());
+ EXPECT_EQ(1, preload_request_counter->GetRequestCount());
+ EXPECT_EQ(2, GetPrefetchURLLoaderCallCount());
+
+ GURL cross_origin_preload_url =
+ cross_origin_server_->GetURL("3p.example", preload_path);
+ WaitUntilLoaded(cross_origin_preload_url);
+
+ monitor.WaitForUrls();
+ base::Optional<network::ResourceRequest> request =
+ monitor.GetRequestInfo(cross_origin_target_url);
+ ASSERT_TRUE(request);
+ ASSERT_TRUE(request->site_for_cookies.IsNull());
+ ASSERT_TRUE(request->trusted_params);
+ url::Origin cross_origin = url::Origin::Create(cross_origin_target_url);
+ EXPECT_TRUE(net::IsolationInfo::Create(
+ net::IsolationInfo::RedirectMode::kUpdateNothing,
+ cross_origin, cross_origin, net::SiteForCookies())
+ .IsEqualForTesting(request->trusted_params->isolation_info));
+}
+
IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest, CrossOriginWithPreload) {
const char* target_path = "/target.html";
const char* preload_path = "/preload.js";
@@ -639,7 +753,7 @@ IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest, CrossOriginWithPreload) {
preload_waiter.Run();
EXPECT_EQ(1, target_request_counter->GetRequestCount());
EXPECT_EQ(1, preload_request_counter->GetRequestCount());
- EXPECT_EQ(split_cache_enabled_ ? 2 : 1, GetPrefetchURLLoaderCallCount());
+ EXPECT_EQ(2, GetPrefetchURLLoaderCallCount());
GURL cross_origin_preload_url =
cross_origin_server_->GetURL("3p.example", preload_path);
@@ -732,8 +846,8 @@ IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest, SignedExchangeWithPreload) {
MockSignedExchangeHandlerFactory factory({MockSignedExchangeHandlerParams(
target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK,
GURL(embedded_test_server()->GetURL(target_path)), "text/html",
- {base::StringPrintf("Link: <%s>;rel=\"preload\";as=\"script\"",
- preload_url_in_sxg.spec().c_str())},
+ {{"Link", base::StringPrintf("<%s>;rel=\"preload\";as=\"script\"",
+ preload_url_in_sxg.spec().c_str())}},
net::SHA256HashValue({{0x00}}))});
ScopedSignedExchangeHandlerFactory scoped_factory(&factory);
@@ -808,8 +922,8 @@ IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest,
target_sxg_url, SignedExchangeLoadResult::kSuccess, net::OK,
GURL(cross_origin_server_->GetURL("3p.example", target_path)),
"text/html",
- {base::StringPrintf("Link: <%s>;rel=\"preload\";as=\"script\"",
- preload_url_in_sxg.spec().c_str())},
+ {{"Link", base::StringPrintf("<%s>;rel=\"preload\";as=\"script\"",
+ preload_url_in_sxg.spec().c_str())}},
net::SHA256HashValue({{0x00}}))});
ScopedSignedExchangeHandlerFactory scoped_factory(&factory);
@@ -828,7 +942,7 @@ IN_PROC_BROWSER_TEST_P(PrefetchBrowserTest,
preload_waiter.Run();
EXPECT_EQ(1, preload_request_counter->GetRequestCount());
- EXPECT_EQ(split_cache_enabled_ ? 2 : 1, GetPrefetchURLLoaderCallCount());
+ EXPECT_EQ(2, GetPrefetchURLLoaderCallCount());
WaitUntilLoaded(preload_url_in_sxg);