| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stddef.h> | 5 #include <stddef.h> |
| 6 #include <stdint.h> | 6 #include <stdint.h> |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 408 net::HttpResponseInfo info; | 408 net::HttpResponseInfo info; |
| 409 const char data[] = | 409 const char data[] = |
| 410 "HTTP/1.1 200 OK\0" | 410 "HTTP/1.1 200 OK\0" |
| 411 "Content-Type: application/javascript\0" | 411 "Content-Type: application/javascript\0" |
| 412 "\0"; | 412 "\0"; |
| 413 info.headers = | 413 info.headers = |
| 414 new net::HttpResponseHeaders(std::string(data, arraysize(data))); | 414 new net::HttpResponseHeaders(std::string(data, arraysize(data))); |
| 415 return info; | 415 return info; |
| 416 } | 416 } |
| 417 | 417 |
| 418 const std::string kNavigationPreloadAbortError = |
| 419 "The service worker navigation preload request was cancelled before " |
| 420 "'preloadResponse' settled. If you intend to use " |
| 421 "'preloadResponse', use waitUntil() or respondWith() to wait for " |
| 422 "the promise to settle."; |
| 423 |
| 418 } // namespace | 424 } // namespace |
| 419 | 425 |
| 420 class ServiceWorkerBrowserTest : public ContentBrowserTest { | 426 class ServiceWorkerBrowserTest : public ContentBrowserTest { |
| 421 protected: | 427 protected: |
| 422 using self = ServiceWorkerBrowserTest; | 428 using self = ServiceWorkerBrowserTest; |
| 423 | 429 |
| 424 void SetUpOnMainThread() override { | 430 void SetUpOnMainThread() override { |
| 425 ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); | 431 ASSERT_TRUE(embedded_test_server()->InitializeAndListen()); |
| 426 StoragePartition* partition = BrowserContext::GetDefaultStoragePartition( | 432 StoragePartition* partition = BrowserContext::GetDefaultStoragePartition( |
| 427 shell()->web_contents()->GetBrowserContext()); | 433 shell()->web_contents()->GetBrowserContext()); |
| (...skipping 1466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1894 StartServerAndNavigateToSetup(); | 1900 StartServerAndNavigateToSetup(); |
| 1895 SetupForNavigationPreloadTest(page_url, worker_url); | 1901 SetupForNavigationPreloadTest(page_url, worker_url); |
| 1896 | 1902 |
| 1897 EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); | 1903 EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); |
| 1898 | 1904 |
| 1899 const base::string16 title = base::ASCIIToUTF16("REJECTED"); | 1905 const base::string16 title = base::ASCIIToUTF16("REJECTED"); |
| 1900 TitleWatcher title_watcher(shell()->web_contents(), title); | 1906 TitleWatcher title_watcher(shell()->web_contents(), title); |
| 1901 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); | 1907 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); |
| 1902 NavigateToURL(shell(), page_url); | 1908 NavigateToURL(shell(), page_url); |
| 1903 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1909 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
| 1904 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", | 1910 std::string expected = |
| 1905 GetTextContent()); | 1911 "The service worker navigation preload request failed with network error " |
| 1912 "code -102."; |
| 1913 EXPECT_EQ("NetworkError: " + expected, GetTextContent()); |
| 1906 } | 1914 } |
| 1907 | 1915 |
| 1908 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, | 1916 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, |
| 1909 CanceledByInterceptor) { | 1917 CanceledByInterceptor) { |
| 1910 content::ResourceDispatcherHost::Get()->RegisterInterceptor( | 1918 content::ResourceDispatcherHost::Get()->RegisterInterceptor( |
| 1911 kNavigationPreloadHeaderName, "", | 1919 kNavigationPreloadHeaderName, "", |
| 1912 base::Bind(&CancellingInterceptorCallback)); | 1920 base::Bind(&CancellingInterceptorCallback)); |
| 1913 | 1921 |
| 1914 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1922 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
| 1915 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1923 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
| 1916 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1924 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| 1917 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1925 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| 1918 RegisterStaticFile( | 1926 RegisterStaticFile( |
| 1919 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, | 1927 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
| 1920 "text/javascript"); | 1928 "text/javascript"); |
| 1921 | 1929 |
| 1922 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", | 1930 EXPECT_EQ("NetworkError: " + kNavigationPreloadAbortError, |
| 1923 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED")); | 1931 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED")); |
| 1924 } | 1932 } |
| 1925 | 1933 |
| 1926 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, | 1934 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, |
| 1927 PreloadHeadersSimple) { | 1935 PreloadHeadersSimple) { |
| 1928 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1936 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
| 1929 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1937 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
| 1930 const char kPage[] = "<title>ERROR</title>Hello world."; | 1938 const char kPage[] = "<title>ERROR</title>Hello world."; |
| 1931 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1939 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| 1932 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1940 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2032 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 2040 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| 2033 RegisterCustomResponse(kPageUrl, kPageResponse); | 2041 RegisterCustomResponse(kPageUrl, kPageResponse); |
| 2034 RegisterStaticFile( | 2042 RegisterStaticFile( |
| 2035 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, | 2043 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
| 2036 "text/javascript"); | 2044 "text/javascript"); |
| 2037 RegisterStaticFile(kRedirectedPageUrl1, kRedirectedPage, "text/html"); | 2045 RegisterStaticFile(kRedirectedPageUrl1, kRedirectedPage, "text/html"); |
| 2038 | 2046 |
| 2039 // According to the spec, multiple Location headers is not an error. So the | 2047 // According to the spec, multiple Location headers is not an error. So the |
| 2040 // preloadResponse must be resolved with an opaque redirect response. | 2048 // preloadResponse must be resolved with an opaque redirect response. |
| 2041 // But Chrome treats multiple Location headers as an error (crbug.com/98895). | 2049 // But Chrome treats multiple Location headers as an error (crbug.com/98895). |
| 2042 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", | 2050 std::string expected = |
| 2051 "The service worker navigation preload request failed with network error " |
| 2052 "code -350."; |
| 2053 EXPECT_EQ("NetworkError: " + expected, |
| 2043 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED")); | 2054 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED")); |
| 2044 | 2055 |
| 2045 // The page request must be sent only once, since the worker responded with | 2056 // The page request must be sent only once, since the worker responded with |
| 2046 // a generated Response. | 2057 // a generated Response. |
| 2047 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 2058 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
| 2048 // The redirected request must not be sent. | 2059 // The redirected request must not be sent. |
| 2049 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl1)); | 2060 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl1)); |
| 2050 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl2)); | 2061 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl2)); |
| 2051 } | 2062 } |
| 2052 | 2063 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2063 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 2074 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| 2064 RegisterCustomResponse(kPageUrl, kPageResponse); | 2075 RegisterCustomResponse(kPageUrl, kPageResponse); |
| 2065 RegisterStaticFile( | 2076 RegisterStaticFile( |
| 2066 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, | 2077 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
| 2067 "text/javascript"); | 2078 "text/javascript"); |
| 2068 | 2079 |
| 2069 // TODO(horo): According to the spec, even if the location URL is invalid, the | 2080 // TODO(horo): According to the spec, even if the location URL is invalid, the |
| 2070 // preloadResponse must be resolve with an opaque redirect response. But | 2081 // preloadResponse must be resolve with an opaque redirect response. But |
| 2071 // currently Chrome handles the invalid location URL in the browser process as | 2082 // currently Chrome handles the invalid location URL in the browser process as |
| 2072 // an error. crbug.com/707185 | 2083 // an error. crbug.com/707185 |
| 2073 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", | 2084 EXPECT_EQ("NetworkError: " + kNavigationPreloadAbortError, |
| 2074 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED")); | 2085 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED")); |
| 2075 | 2086 |
| 2076 // The page request must be sent only once, since the worker responded with | 2087 // The page request must be sent only once, since the worker responded with |
| 2077 // a generated Response. | 2088 // a generated Response. |
| 2078 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 2089 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
| 2079 } | 2090 } |
| 2080 | 2091 |
| 2081 // Tests responding with the navigation preload response when the navigation | 2092 // Tests responding with the navigation preload response when the navigation |
| 2082 // occurred after a redirect. | 2093 // occurred after a redirect. |
| 2083 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, | 2094 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, |
| (...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2934 // effect in CanSuspendRenderer(). | 2945 // effect in CanSuspendRenderer(). |
| 2935 shell()->web_contents()->WasHidden(); | 2946 shell()->web_contents()->WasHidden(); |
| 2936 EXPECT_TRUE(rph->IsProcessBackgrounded()); | 2947 EXPECT_TRUE(rph->IsProcessBackgrounded()); |
| 2937 | 2948 |
| 2938 // The process which has service worker thread shouldn't be suspended. | 2949 // The process which has service worker thread shouldn't be suspended. |
| 2939 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id)); | 2950 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id)); |
| 2940 } | 2951 } |
| 2941 #endif | 2952 #endif |
| 2942 | 2953 |
| 2943 } // namespace content | 2954 } // namespace content |
| OLD | NEW |