summaryrefslogtreecommitdiff
path: root/chromium/weblayer/browser/prefetch_browsertest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/weblayer/browser/prefetch_browsertest.cc')
-rw-r--r--chromium/weblayer/browser/prefetch_browsertest.cc125
1 files changed, 125 insertions, 0 deletions
diff --git a/chromium/weblayer/browser/prefetch_browsertest.cc b/chromium/weblayer/browser/prefetch_browsertest.cc
new file mode 100644
index 00000000000..796d8905d73
--- /dev/null
+++ b/chromium/weblayer/browser/prefetch_browsertest.cc
@@ -0,0 +1,125 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/files/file_path.h"
+#include "base/test/bind_test_util.h"
+#include "components/network_session_configurator/common/network_switches.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/test/browser_test_utils.h"
+#include "net/base/network_change_notifier.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "net/test/embedded_test_server/http_request.h"
+#include "net/test/embedded_test_server/http_response.h"
+#include "weblayer/browser/tab_impl.h"
+#include "weblayer/shell/browser/shell.h"
+#include "weblayer/test/weblayer_browser_test.h"
+#include "weblayer/test/weblayer_browser_test_utils.h"
+
+namespace weblayer {
+namespace {
+const char kPrefetchPage[] = "/simple_prefetch.html";
+const char kRedirectPrefetchPage[] = "/redirect_prefetch.html";
+const char kRedirectPrefetchUrl[] = "/redirect";
+const char kRedirectedPrefetchUrl[] = "/redirected";
+const char kPrefetchTarget[] = "/prefetch_target.lnk";
+} // namespace
+
+class PrefetchBrowserTest : public WebLayerBrowserTest {
+ public:
+ void SetUpOnMainThread() override {
+ // The test makes requests to google.com which we want to redirect to the
+ // test server.
+ host_resolver()->AddRule("*", "127.0.0.1");
+
+ embedded_test_server()->RegisterRequestMonitor(base::BindRepeating(
+ &PrefetchBrowserTest::MonitorRequest, base::Unretained(this)));
+ ASSERT_TRUE(embedded_test_server()->Start());
+ }
+
+ void SetUpCommandLine(base::CommandLine* command_line) override {
+ // Set a dummy variation ID to send X-Client-Data header to Google hosts
+ // in RedirectedPrefetch test.
+ command_line->AppendSwitchASCII("force-variation-ids", "42");
+ // Need to ignore cert errors to use a HTTPS server for the test domains.
+ command_line->AppendSwitch(switches::kIgnoreCertificateErrors);
+ }
+
+ bool RunPrefetchExperiment(GURL url, const base::string16 expected_title) {
+ content::TitleWatcher title_watcher(
+ static_cast<TabImpl*>(shell()->tab())->web_contents(), expected_title);
+ NavigateAndWaitForCompletion(url, shell());
+ return expected_title == title_watcher.WaitAndGetTitle();
+ }
+
+ protected:
+ bool prefetch_target_request_seen_ = false;
+
+ private:
+ void MonitorRequest(const net::test_server::HttpRequest& request) {
+ if (request.relative_url == std::string(kPrefetchTarget)) {
+ prefetch_target_request_seen_ = true;
+ }
+ }
+};
+
+IN_PROC_BROWSER_TEST_F(PrefetchBrowserTest, PrefetchWorks) {
+ // Set real NetworkChangeNotifier singleton aside.
+ std::unique_ptr<net::NetworkChangeNotifier::DisableForTest> disable_for_test(
+ new net::NetworkChangeNotifier::DisableForTest);
+ ASSERT_FALSE(prefetch_target_request_seen_);
+ EXPECT_TRUE(
+ RunPrefetchExperiment(embedded_test_server()->GetURL(kPrefetchPage),
+ base::ASCIIToUTF16("link onload")));
+ EXPECT_TRUE(prefetch_target_request_seen_);
+}
+
+// https://crbug.com/922362: When the prefetched request is redirected, DCHECKs
+// in PrefetchURLLoader::FollowRedirect() failed due to "X-Client-Data" in
+// removed_headers. Verify that it no longer does.
+IN_PROC_BROWSER_TEST_F(PrefetchBrowserTest, RedirectedPrefetch) {
+ std::vector<net::test_server::HttpRequest> requests;
+ net::EmbeddedTestServer https_server(net::EmbeddedTestServer::TYPE_HTTPS);
+ https_server.RegisterRequestHandler(base::BindLambdaForTesting(
+ [&requests](const net::test_server::HttpRequest& request)
+ -> std::unique_ptr<net::test_server::HttpResponse> {
+ auto response = std::make_unique<net::test_server::BasicHttpResponse>();
+ if (request.relative_url == std::string(kRedirectPrefetchPage)) {
+ requests.push_back(request);
+ response->set_content_type("text/html");
+ response->set_content(
+ base::StringPrintf("<link rel=\"prefetch\" href=\"%s\" "
+ "onload=\"document.title='done'\">",
+ kRedirectPrefetchUrl));
+ return response;
+ } else if (request.relative_url == std::string(kRedirectPrefetchUrl)) {
+ requests.push_back(request);
+ response->set_code(net::HTTP_MOVED_PERMANENTLY);
+ response->AddCustomHeader(
+ "Location", base::StringPrintf("https://example.com:%s%s",
+ request.GetURL().port().c_str(),
+ kRedirectedPrefetchUrl));
+ return response;
+ } else if (request.relative_url ==
+ std::string(kRedirectedPrefetchUrl)) {
+ requests.push_back(request);
+ return response;
+ }
+ return nullptr;
+ }));
+
+ https_server.ServeFilesFromSourceDirectory(
+ base::FilePath(FILE_PATH_LITERAL("weblayer/test/data")));
+ ASSERT_TRUE(https_server.Start());
+
+ GURL url = https_server.GetURL("www.google.com", kRedirectPrefetchPage);
+ EXPECT_TRUE(RunPrefetchExperiment(url, base::ASCIIToUTF16("done")));
+ ASSERT_EQ(3U, requests.size());
+
+ EXPECT_EQ(base::StringPrintf("www.google.com:%u", https_server.port()),
+ requests[0].headers["Host"]);
+ EXPECT_EQ(kRedirectPrefetchPage, requests[0].relative_url);
+}
+
+} // namespace weblayer