Chromium Code Reviews| Index: content/browser/service_worker/service_worker_browsertest.cc |
| diff --git a/content/browser/service_worker/service_worker_browsertest.cc b/content/browser/service_worker/service_worker_browsertest.cc |
| index 822d03afcfe4d520a582fa9aa88c5194b7cecb9b..99a1e56ea06f4c11ce7da82f50ebc45311ff403e 100644 |
| --- a/content/browser/service_worker/service_worker_browsertest.cc |
| +++ b/content/browser/service_worker/service_worker_browsertest.cc |
| @@ -65,6 +65,7 @@ |
| #include "content/shell/browser/shell.h" |
| #include "content/shell/browser/shell_content_browser_client.h" |
| #include "content/test/test_content_browser_client.h" |
| +#include "net/dns/mock_host_resolver.h" |
| #include "net/log/net_log_with_source.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "net/test/embedded_test_server/http_request.h" |
| @@ -1414,6 +1415,11 @@ class ServiceWorkerNavigationPreloadTest : public ServiceWorkerBrowserTest { |
| ~ServiceWorkerNavigationPreloadTest() override {} |
| + void SetUpOnMainThread() override { |
| + host_resolver()->AddRule("*", "127.0.0.1"); |
| + ServiceWorkerBrowserTest::SetUpOnMainThread(); |
| + } |
| + |
| void SetUpCommandLine(base::CommandLine* command_line) override { |
| command_line->AppendSwitchASCII( |
| switches::kEnableFeatures, |
| @@ -1440,17 +1446,26 @@ class ServiceWorkerNavigationPreloadTest : public ServiceWorkerBrowserTest { |
| base::Bind(&self::MonitorRequestHandler, base::Unretained(this))); |
| } |
| - void RegisterStaticFile(const GURL& url, |
| + void RegisterStaticFile(const std::string& relative_url, |
| const std::string& content, |
| const std::string& content_type) { |
| embedded_test_server()->RegisterRequestHandler( |
| - base::Bind(&self::StaticRequestHandler, base::Unretained(this), url, |
| - content, content_type)); |
| + base::Bind(&self::StaticRequestHandler, base::Unretained(this), |
| + relative_url, content, content_type)); |
| + } |
| + |
| + void RegisterCustomResponse(const std::string& relative_url, |
| + const std::string& response) { |
| + embedded_test_server()->RegisterRequestHandler( |
| + base::Bind(&self::CustomRequestHandler, base::Unretained(this), |
| + relative_url, response)); |
| } |
| - void RegisterCustomResponse(const GURL& url, const std::string& response) { |
| - embedded_test_server()->RegisterRequestHandler(base::Bind( |
| - &self::CustomRequestHandler, base::Unretained(this), url, response)); |
| + void RegisterKeepSearchRedirect(const std::string& relative_url, |
| + const std::string& redirect_location) { |
| + embedded_test_server()->RegisterRequestHandler( |
| + base::Bind(&self::KeepSearchRedirectHandler, base::Unretained(this), |
| + relative_url, redirect_location)); |
| } |
| int GetRequestCount(const std::string& relative_url) const { |
| @@ -1510,15 +1525,13 @@ class ServiceWorkerNavigationPreloadTest : public ServiceWorkerBrowserTest { |
| } |
| std::unique_ptr<net::test_server::HttpResponse> StaticRequestHandler( |
| - const GURL& url, |
| + const std::string& relative_url, |
| const std::string& content, |
| const std::string& content_type, |
| const net::test_server::HttpRequest& request) const { |
| - const GURL absolute_url = |
| - embedded_test_server()->GetURL(request.relative_url); |
| - if (absolute_url != url) |
| + const size_t query_position = request.relative_url.find('?'); |
| + if (request.relative_url.substr(0, query_position) != relative_url) |
| return std::unique_ptr<net::test_server::HttpResponse>(); |
| - |
| std::unique_ptr<net::test_server::BasicHttpResponse> http_response( |
| base::MakeUnique<net::test_server::BasicHttpResponse>()); |
| http_response->set_code(net::HTTP_OK); |
| @@ -1528,17 +1541,33 @@ class ServiceWorkerNavigationPreloadTest : public ServiceWorkerBrowserTest { |
| } |
| std::unique_ptr<net::test_server::HttpResponse> CustomRequestHandler( |
| - const GURL& url, |
| + const std::string& relative_url, |
| const std::string& response, |
| const net::test_server::HttpRequest& request) const { |
| - const GURL absolute_url = |
| - embedded_test_server()->GetURL(request.relative_url); |
| - if (absolute_url != url) |
| + const size_t query_position = request.relative_url.find('?'); |
| + if (request.relative_url.substr(0, query_position) != relative_url) |
| return std::unique_ptr<net::test_server::HttpResponse>(); |
| - |
| return base::MakeUnique<CustomResponse>(response); |
| } |
| + std::unique_ptr<net::test_server::HttpResponse> KeepSearchRedirectHandler( |
| + const std::string& relative_url, |
| + const std::string& redirect_location, |
| + const net::test_server::HttpRequest& request) const { |
| + const size_t query_position = request.relative_url.find('?'); |
| + if (request.relative_url.substr(0, query_position) != relative_url) |
| + return std::unique_ptr<net::test_server::HttpResponse>(); |
| + std::unique_ptr<net::test_server::BasicHttpResponse> response( |
| + new net::test_server::BasicHttpResponse()); |
| + response->set_code(net::HTTP_PERMANENT_REDIRECT); |
| + response->AddCustomHeader( |
| + "Location", |
| + query_position == std::string::npos |
| + ? redirect_location |
| + : redirect_location + request.relative_url.substr(query_position)); |
| + return std::move(response); |
| + } |
| + |
| void MonitorRequestHandler(const net::test_server::HttpRequest& request) { |
| request_log_.push_back(request.relative_url); |
| } |
| @@ -1601,8 +1630,8 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, NetworkFallback) { |
| " });"; |
| const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| - RegisterStaticFile(page_url, kPage, "text/html"); |
| - RegisterStaticFile(worker_url, kScript, "text/javascript"); |
| + RegisterStaticFile(kPageUrl, kPage, "text/html"); |
| + RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
| SetupForNavigationPreloadTest(page_url, worker_url, |
| true /* enable_navigation_preload */); |
| @@ -1637,8 +1666,8 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
| " });"; |
| const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| - RegisterStaticFile(page_url, kPage, "text/html"); |
| - RegisterStaticFile(worker_url, kScript, "text/javascript"); |
| + RegisterStaticFile(kPageUrl, kPage, "text/html"); |
| + RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
| SetupForNavigationPreloadTest(page_url, worker_url, |
| true /* enable_navigation_preload */); |
| @@ -1673,8 +1702,8 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, GetResponseText) { |
| " });"; |
| const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| - RegisterStaticFile(page_url, kPage, "text/html"); |
| - RegisterStaticFile(worker_url, kScript, "text/javascript"); |
| + RegisterStaticFile(kPageUrl, kPage, "text/html"); |
| + RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
| SetupForNavigationPreloadTest(page_url, worker_url, |
| true /* enable_navigation_preload */); |
| @@ -1730,8 +1759,8 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
| " });"; |
| const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| - RegisterStaticFile(page_url, kPage, "text/html"); |
| - RegisterStaticFile(worker_url, kScript, "text/javascript"); |
| + RegisterStaticFile(kPageUrl, kPage, "text/html"); |
| + RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
| SetupForNavigationPreloadTest(page_url, worker_url, |
| true /* enable_navigation_preload */); |
| @@ -1754,7 +1783,7 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, NetworkError) { |
| const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
| const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| - RegisterStaticFile(worker_url, kPreloadResponseTestScript, "text/javascript"); |
| + RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); |
| SetupForNavigationPreloadTest(page_url, worker_url, |
| true /* enable_navigation_preload */); |
| @@ -1777,8 +1806,8 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
| const char kPage[] = "<title>ERROR</title>Hello world."; |
| const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| - RegisterStaticFile(page_url, kPage, "text/html"); |
| - RegisterStaticFile(worker_url, kPreloadResponseTestScript, "text/javascript"); |
| + RegisterStaticFile(kPageUrl, kPage, "text/html"); |
| + RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); |
| SetupForNavigationPreloadTest(page_url, worker_url, |
| true /* enable_navigation_preload */); |
| @@ -1813,8 +1842,8 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, NotEnabled) { |
| const char kPage[] = "<title>ERROR</title>Hello world."; |
| const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| - RegisterStaticFile(page_url, kPage, "text/html"); |
| - RegisterStaticFile(worker_url, kPreloadResponseTestScript, "text/javascript"); |
| + RegisterStaticFile(kPageUrl, kPage, "text/html"); |
| + RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); |
| SetupForNavigationPreloadTest(page_url, worker_url, |
| false /* enable_navigation_preload */); |
| @@ -1849,8 +1878,8 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
| "<title>ERROR</title>Hello world."; |
| const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| - RegisterCustomResponse(page_url, kPageResponse); |
| - RegisterStaticFile(worker_url, kPreloadResponseTestScript, "text/javascript"); |
| + RegisterCustomResponse(kPageUrl, kPageResponse); |
| + RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); |
| SetupForNavigationPreloadTest(page_url, worker_url, |
| true /* enable_navigation_preload */); |
| @@ -1897,9 +1926,9 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, RejectRedirects) { |
| embedded_test_server()->GetURL(kRedirectedPageUrl); |
| const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| - RegisterCustomResponse(page_url, kPageResponse); |
| - RegisterStaticFile(worker_url, kPreloadResponseTestScript, "text/javascript"); |
| - RegisterStaticFile(redirecred_page_url, kRedirectedPage, "text/html"); |
| + RegisterCustomResponse(kPageUrl, kPageResponse); |
| + RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); |
| + RegisterStaticFile(kRedirectedPageUrl, kRedirectedPage, "text/html"); |
| SetupForNavigationPreloadTest(page_url, worker_url, |
| true /* enable_navigation_preload */); |
| @@ -1921,6 +1950,56 @@ IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, RejectRedirects) { |
| GetTextContent()); |
| } |
|
falken
2016/11/02 14:15:29
This seems sufficiently complex that some comments
horo
2016/11/03 02:30:43
Done.
|
| +IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
| + RedirectAndRespondWithNavigationPreload) { |
| + const std::string kPageUrl = "/service_worker/navigation_preload.html"; |
| + const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
| + const char kPage[] = |
| + "<title></title>\n" |
| + "<script>document.title = document.location.search;</script>"; |
| + const char kScript[] = |
| + "self.addEventListener('fetch', event => {\n" |
| + " if (event.request.url.indexOf('navigation_preload.html') == -1)\n" |
| + " return; // For in scope redirection.\n" |
| + " event.respondWith(event.navigationPreload);\n" |
| + " });"; |
| + const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| + const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| + RegisterStaticFile(kPageUrl, kPage, "text/html"); |
| + RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
| + |
| + const char kRedirectPageUrl[] = "/redirect"; |
| + const char kInScopeRedirectPageUrl[] = "/service_worker/redirect"; |
|
falken
2016/11/02 14:15:29
// Register redirects to the target URL. The servi
horo
2016/11/03 02:30:43
Done.
|
| + RegisterKeepSearchRedirect(kRedirectPageUrl, page_url.spec()); |
| + RegisterKeepSearchRedirect(kInScopeRedirectPageUrl, page_url.spec()); |
| + |
| + SetupForNavigationPreloadTest( |
| + embedded_test_server()->GetURL("/service_worker/"), worker_url, |
| + true /* enable_navigation_preload */); |
| + |
| + const GURL redirect_page_url = |
| + embedded_test_server()->GetURL(kRedirectPageUrl).Resolve("?1"); |
| + const GURL in_scope_redirect_page_url = |
| + embedded_test_server()->GetURL(kInScopeRedirectPageUrl).Resolve("?2"); |
| + const GURL cross_origin_redirect_page_url = |
| + embedded_test_server()->GetURL("a.com", kRedirectPageUrl).Resolve("?3"); |
| + |
|
falken
2016/11/02 14:15:28
// Navigate to a same-origin, out of scope URL tha
horo
2016/11/03 02:30:43
Done.
|
| + TitleWatcher title_watcher1(shell()->web_contents(), |
| + base::ASCIIToUTF16("?1")); |
| + NavigateToURL(shell(), redirect_page_url); |
| + EXPECT_EQ(1, GetRequestCount(kPageUrl + "?1")); |
| + |
|
falken
2016/11/02 14:15:28
// Navigate to a same-origin, in-scope URL that re
horo
2016/11/03 02:30:43
Done.
|
| + TitleWatcher title_watcher2(shell()->web_contents(), |
| + base::ASCIIToUTF16("?2")); |
| + NavigateToURL(shell(), in_scope_redirect_page_url); |
| + EXPECT_EQ(1, GetRequestCount(kPageUrl + "?2")); |
| + |
|
falken
2016/11/02 14:15:29
// Navigate to a cross-origin URL that redirects t
horo
2016/11/03 02:30:43
Done.
|
| + TitleWatcher title_watcher3(shell()->web_contents(), |
| + base::ASCIIToUTF16("?3")); |
| + NavigateToURL(shell(), cross_origin_redirect_page_url); |
| + EXPECT_EQ(1, GetRequestCount(kPageUrl + "?3")); |
| +} |
| + |
| // Flaky on Win/Mac: http://crbug.com/533631 |
| #if defined(OS_WIN) || defined(OS_MACOSX) |
| #define MAYBE_ResponseFromHTTPSServiceWorkerIsMarkedAsSecure DISABLED_ResponseFromHTTPSServiceWorkerIsMarkedAsSecure |