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 370 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 std::string name; | 381 std::string name; |
382 EXPECT_TRUE(name_value_pair->GetString(0, &name)); | 382 EXPECT_TRUE(name_value_pair->GetString(0, &name)); |
383 std::string value; | 383 std::string value; |
384 EXPECT_TRUE(name_value_pair->GetString(1, &value)); | 384 EXPECT_TRUE(name_value_pair->GetString(1, &value)); |
385 if (name == header_name && value == header_value) | 385 if (name == header_name && value == header_value) |
386 return true; | 386 return true; |
387 } | 387 } |
388 return false; | 388 return false; |
389 } | 389 } |
390 | 390 |
| 391 bool HasHeader(const base::DictionaryValue& dict, |
| 392 base::StringPiece header_name) { |
| 393 const base::ListValue* headers = nullptr; |
| 394 EXPECT_TRUE(dict.GetList("headers", &headers)); |
| 395 for (size_t i = 0; i < headers->GetSize(); ++i) { |
| 396 const base::ListValue* name_value_pair = nullptr; |
| 397 EXPECT_TRUE(headers->GetList(i, &name_value_pair)); |
| 398 EXPECT_EQ(2u, name_value_pair->GetSize()); |
| 399 std::string name; |
| 400 EXPECT_TRUE(name_value_pair->GetString(0, &name)); |
| 401 if (name == header_name) |
| 402 return true; |
| 403 } |
| 404 return false; |
| 405 } |
| 406 |
391 net::HttpResponseInfo CreateHttpResponseInfo() { | 407 net::HttpResponseInfo CreateHttpResponseInfo() { |
392 net::HttpResponseInfo info; | 408 net::HttpResponseInfo info; |
393 const char data[] = | 409 const char data[] = |
394 "HTTP/1.1 200 OK\0" | 410 "HTTP/1.1 200 OK\0" |
395 "Content-Type: application/javascript\0" | 411 "Content-Type: application/javascript\0" |
396 "\0"; | 412 "\0"; |
397 info.headers = | 413 info.headers = |
398 new net::HttpResponseHeaders(std::string(data, arraysize(data))); | 414 new net::HttpResponseHeaders(std::string(data, arraysize(data))); |
399 return info; | 415 return info; |
400 } | 416 } |
(...skipping 1090 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1491 scoped_refptr<WorkerActivatedObserver> observer = | 1507 scoped_refptr<WorkerActivatedObserver> observer = |
1492 new WorkerActivatedObserver(wrapper()); | 1508 new WorkerActivatedObserver(wrapper()); |
1493 observer->Init(); | 1509 observer->Init(); |
1494 | 1510 |
1495 public_context()->RegisterServiceWorker( | 1511 public_context()->RegisterServiceWorker( |
1496 scope, worker_url, | 1512 scope, worker_url, |
1497 base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing))); | 1513 base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing))); |
1498 observer->Wait(); | 1514 observer->Wait(); |
1499 } | 1515 } |
1500 | 1516 |
| 1517 std::string LoadNavigationPreloadTestPage(const GURL& page_url, |
| 1518 const GURL& worker_url, |
| 1519 const char* expected_result) { |
| 1520 RegisterMonitorRequestHandler(); |
| 1521 StartServerAndNavigateToSetup(); |
| 1522 SetupForNavigationPreloadTest(page_url, worker_url); |
| 1523 |
| 1524 const base::string16 title = base::ASCIIToUTF16("PASS"); |
| 1525 TitleWatcher title_watcher(shell()->web_contents(), title); |
| 1526 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); |
| 1527 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); |
| 1528 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); |
| 1529 NavigateToURL(shell(), page_url); |
| 1530 EXPECT_EQ(base::ASCIIToUTF16(expected_result), |
| 1531 title_watcher.WaitAndGetTitle()); |
| 1532 return GetTextContent(); |
| 1533 } |
| 1534 |
1501 void RegisterMonitorRequestHandler() { | 1535 void RegisterMonitorRequestHandler() { |
1502 embedded_test_server()->RegisterRequestMonitor( | 1536 embedded_test_server()->RegisterRequestMonitor( |
1503 base::Bind(&self::MonitorRequestHandler, base::Unretained(this))); | 1537 base::Bind(&self::MonitorRequestHandler, base::Unretained(this))); |
1504 } | 1538 } |
1505 | 1539 |
1506 void RegisterStaticFile(const std::string& relative_url, | 1540 void RegisterStaticFile(const std::string& relative_url, |
1507 const std::string& content, | 1541 const std::string& content, |
1508 const std::string& content_type) { | 1542 const std::string& content_type) { |
1509 embedded_test_server()->RegisterRequestHandler( | 1543 embedded_test_server()->RegisterRequestHandler( |
1510 base::Bind(&self::StaticRequestHandler, base::Unretained(this), | 1544 base::Bind(&self::StaticRequestHandler, base::Unretained(this), |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1675 const char kPage[] = "<title>PASS</title>Hello world."; | 1709 const char kPage[] = "<title>PASS</title>Hello world."; |
1676 const std::string kScript = kEnableNavigationPreloadScript + | 1710 const std::string kScript = kEnableNavigationPreloadScript + |
1677 "self.addEventListener('fetch', event => {\n" | 1711 "self.addEventListener('fetch', event => {\n" |
1678 " // Do nothing.\n" | 1712 " // Do nothing.\n" |
1679 " });"; | 1713 " });"; |
1680 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1714 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1681 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1715 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1682 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1716 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1683 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | 1717 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
1684 | 1718 |
1685 RegisterMonitorRequestHandler(); | 1719 EXPECT_EQ("Hello world.", |
1686 StartServerAndNavigateToSetup(); | 1720 LoadNavigationPreloadTestPage(page_url, worker_url, "PASS")); |
1687 SetupForNavigationPreloadTest(page_url, worker_url); | |
1688 | |
1689 const base::string16 title = base::ASCIIToUTF16("PASS"); | |
1690 TitleWatcher title_watcher(shell()->web_contents(), title); | |
1691 NavigateToURL(shell(), page_url); | |
1692 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | |
1693 EXPECT_EQ("Hello world.", GetTextContent()); | |
1694 | 1721 |
1695 // The page request must be sent once or twice: | 1722 // The page request must be sent once or twice: |
1696 // - A navigation preload request may be sent. But it is possible that the | 1723 // - A navigation preload request may be sent. But it is possible that the |
1697 // navigation preload request is canceled before reaching the server. | 1724 // navigation preload request is canceled before reaching the server. |
1698 // - A fallback request must be sent since respondWith wasn't used. | 1725 // - A fallback request must be sent since respondWith wasn't used. |
1699 const int request_count = GetRequestCount(kPageUrl); | 1726 const int request_count = GetRequestCount(kPageUrl); |
1700 ASSERT_TRUE(request_count == 1 || request_count == 2); | 1727 ASSERT_TRUE(request_count == 1 || request_count == 2); |
1701 if (request_count == 1) { | 1728 if (request_count == 1) { |
1702 // Fallback request. | 1729 // Fallback request. |
1703 EXPECT_FALSE(HasNavigationPreloadHeader(request_log_[kPageUrl][0])); | 1730 EXPECT_FALSE(HasNavigationPreloadHeader(request_log_[kPageUrl][0])); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1809 " {headers: [['content-type', 'text/html']]}));\n" | 1836 " {headers: [['content-type', 'text/html']]}));\n" |
1810 " return;\n" | 1837 " return;\n" |
1811 " }\n" | 1838 " }\n" |
1812 " event.respondWith(event.preloadResponse);\n" | 1839 " event.respondWith(event.preloadResponse);\n" |
1813 " });"; | 1840 " });"; |
1814 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1841 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1815 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1842 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1816 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1843 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1817 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | 1844 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
1818 | 1845 |
1819 RegisterMonitorRequestHandler(); | 1846 EXPECT_EQ("Hello world.", |
1820 StartServerAndNavigateToSetup(); | 1847 LoadNavigationPreloadTestPage(page_url, worker_url, "PASS")); |
1821 SetupForNavigationPreloadTest(page_url, worker_url); | |
1822 | |
1823 const base::string16 title = base::ASCIIToUTF16("PASS"); | |
1824 TitleWatcher title_watcher(shell()->web_contents(), title); | |
1825 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | |
1826 NavigateToURL(shell(), page_url); | |
1827 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | |
1828 EXPECT_EQ("Hello world.", GetTextContent()); | |
1829 | 1848 |
1830 // The page request must be sent only once, since the worker responded with | 1849 // The page request must be sent only once, since the worker responded with |
1831 // the navigation preload response | 1850 // the navigation preload response |
1832 ASSERT_EQ(1, GetRequestCount(kPageUrl)); | 1851 ASSERT_EQ(1, GetRequestCount(kPageUrl)); |
1833 EXPECT_EQ("true", | 1852 EXPECT_EQ("true", |
1834 request_log_[kPageUrl][0].headers[kNavigationPreloadHeaderName]); | 1853 request_log_[kPageUrl][0].headers[kNavigationPreloadHeaderName]); |
1835 } | 1854 } |
1836 | 1855 |
1837 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, GetResponseText) { | 1856 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, GetResponseText) { |
1838 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1857 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1839 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1858 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1840 const char kPage[] = "<title>PASS</title>Hello world."; | 1859 const char kPage[] = "<title>PASS</title>Hello world."; |
1841 const std::string kScript = | 1860 const std::string kScript = |
1842 kEnableNavigationPreloadScript + | 1861 kEnableNavigationPreloadScript + |
1843 "self.addEventListener('fetch', event => {\n" | 1862 "self.addEventListener('fetch', event => {\n" |
1844 " event.respondWith(\n" | 1863 " event.respondWith(\n" |
1845 " event.preloadResponse\n" | 1864 " event.preloadResponse\n" |
1846 " .then(response => response.text())\n" | 1865 " .then(response => response.text())\n" |
1847 " .then(text =>\n" | 1866 " .then(text =>\n" |
1848 " new Response(\n" | 1867 " new Response(\n" |
1849 " text,\n" | 1868 " text,\n" |
1850 " {headers: [['content-type', 'text/html']]})));\n" | 1869 " {headers: [['content-type', 'text/html']]})));\n" |
1851 " });"; | 1870 " });"; |
1852 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1871 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1853 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1872 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1854 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1873 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1855 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | 1874 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
1856 | 1875 |
1857 RegisterMonitorRequestHandler(); | 1876 EXPECT_EQ("Hello world.", |
1858 StartServerAndNavigateToSetup(); | 1877 LoadNavigationPreloadTestPage(page_url, worker_url, "PASS")); |
1859 SetupForNavigationPreloadTest(page_url, worker_url); | |
1860 | |
1861 const base::string16 title = base::ASCIIToUTF16("PASS"); | |
1862 TitleWatcher title_watcher(shell()->web_contents(), title); | |
1863 NavigateToURL(shell(), page_url); | |
1864 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | |
1865 EXPECT_EQ("Hello world.", GetTextContent()); | |
1866 | 1878 |
1867 // The page request must be sent only once, since the worker responded with | 1879 // The page request must be sent only once, since the worker responded with |
1868 // "Hello world". | 1880 // "Hello world". |
1869 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 1881 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
1870 } | 1882 } |
1871 | 1883 |
1872 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NetworkError) { | 1884 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NetworkError) { |
1873 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1885 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1874 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1886 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1875 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1887 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
(...skipping 24 matching lines...) Expand all Loading... |
1900 base::Bind(&CancellingInterceptorCallback)); | 1912 base::Bind(&CancellingInterceptorCallback)); |
1901 | 1913 |
1902 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1914 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1903 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1915 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1904 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1916 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1905 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1917 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1906 RegisterStaticFile( | 1918 RegisterStaticFile( |
1907 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, | 1919 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
1908 "text/javascript"); | 1920 "text/javascript"); |
1909 | 1921 |
1910 RegisterMonitorRequestHandler(); | |
1911 StartServerAndNavigateToSetup(); | |
1912 SetupForNavigationPreloadTest(page_url, worker_url); | |
1913 | |
1914 const base::string16 title = base::ASCIIToUTF16("REJECTED"); | |
1915 TitleWatcher title_watcher(shell()->web_contents(), title); | |
1916 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); | |
1917 NavigateToURL(shell(), page_url); | |
1918 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | |
1919 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", | 1922 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", |
1920 GetTextContent()); | 1923 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED")); |
1921 } | 1924 } |
1922 | 1925 |
1923 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, | 1926 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, |
1924 PreloadHeadersSimple) { | 1927 PreloadHeadersSimple) { |
1925 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1928 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1926 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1929 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1927 const char kPage[] = "<title>ERROR</title>Hello world."; | 1930 const char kPage[] = "<title>ERROR</title>Hello world."; |
1928 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1931 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1929 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1932 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1930 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1933 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1931 RegisterStaticFile( | 1934 RegisterStaticFile( |
1932 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, | 1935 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
1933 "text/javascript"); | 1936 "text/javascript"); |
1934 | 1937 |
1935 RegisterMonitorRequestHandler(); | 1938 std::unique_ptr<base::Value> result = base::JSONReader::Read( |
1936 StartServerAndNavigateToSetup(); | 1939 LoadNavigationPreloadTestPage(page_url, worker_url, "RESOLVED")); |
1937 SetupForNavigationPreloadTest(page_url, worker_url); | |
1938 | |
1939 const base::string16 title = base::ASCIIToUTF16("RESOLVED"); | |
1940 TitleWatcher title_watcher(shell()->web_contents(), title); | |
1941 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); | |
1942 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | |
1943 NavigateToURL(shell(), page_url); | |
1944 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | |
1945 | 1940 |
1946 // The page request must be sent only once, since the worker responded with | 1941 // The page request must be sent only once, since the worker responded with |
1947 // a generated Response. | 1942 // a generated Response. |
1948 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 1943 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
1949 std::unique_ptr<base::Value> result = | |
1950 base::JSONReader::Read(GetTextContent()); | |
1951 base::DictionaryValue* dict = nullptr; | 1944 base::DictionaryValue* dict = nullptr; |
1952 ASSERT_TRUE(result->GetAsDictionary(&dict)); | 1945 ASSERT_TRUE(result->GetAsDictionary(&dict)); |
1953 EXPECT_EQ("basic", GetString(*dict, "type")); | 1946 EXPECT_EQ("basic", GetString(*dict, "type")); |
1954 EXPECT_EQ(page_url, GURL(GetString(*dict, "url"))); | 1947 EXPECT_EQ(page_url, GURL(GetString(*dict, "url"))); |
1955 EXPECT_EQ(200, GetInt(*dict, "status")); | 1948 EXPECT_EQ(200, GetInt(*dict, "status")); |
1956 EXPECT_EQ(true, GetBoolean(*dict, "ok")); | 1949 EXPECT_TRUE(GetBoolean(*dict, "ok")); |
1957 EXPECT_EQ("OK", GetString(*dict, "statusText")); | 1950 EXPECT_EQ("OK", GetString(*dict, "statusText")); |
1958 EXPECT_TRUE(CheckHeader(*dict, "content-type", "text/html")); | 1951 EXPECT_TRUE(CheckHeader(*dict, "content-type", "text/html")); |
1959 EXPECT_TRUE(CheckHeader(*dict, "content-length", | 1952 EXPECT_TRUE(CheckHeader(*dict, "content-length", |
1960 base::IntToString(sizeof(kPage) - 1))); | 1953 base::IntToString(sizeof(kPage) - 1))); |
1961 } | 1954 } |
1962 | 1955 |
1963 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NotEnabled) { | 1956 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NotEnabled) { |
1964 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1957 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1965 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1958 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1966 const char kPage[] = "<title>ERROR</title>Hello world."; | 1959 const char kPage[] = "<title>ERROR</title>Hello world."; |
1967 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1960 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1968 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1961 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1969 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1962 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1970 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); | 1963 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); |
1971 | 1964 |
1972 RegisterMonitorRequestHandler(); | 1965 EXPECT_EQ("Resolved with undefined.", |
1973 StartServerAndNavigateToSetup(); | 1966 LoadNavigationPreloadTestPage(page_url, worker_url, "RESOLVED")); |
1974 SetupForNavigationPreloadTest(page_url, worker_url); | |
1975 | |
1976 const base::string16 title = base::ASCIIToUTF16("RESOLVED"); | |
1977 TitleWatcher title_watcher(shell()->web_contents(), title); | |
1978 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); | |
1979 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | |
1980 NavigateToURL(shell(), page_url); | |
1981 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | |
1982 | 1967 |
1983 // The page request must not be sent, since the worker responded with a | 1968 // The page request must not be sent, since the worker responded with a |
1984 // generated Response and the navigation preload isn't enabled. | 1969 // generated Response and the navigation preload isn't enabled. |
1985 EXPECT_EQ(0, GetRequestCount(kPageUrl)); | 1970 EXPECT_EQ(0, GetRequestCount(kPageUrl)); |
1986 EXPECT_EQ("Resolved with undefined.", GetTextContent()); | |
1987 } | 1971 } |
1988 | 1972 |
1989 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, | 1973 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, |
1990 PreloadHeadersCustom) { | 1974 PreloadHeadersCustom) { |
1991 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1975 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1992 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1976 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1993 const char kPageResponse[] = | 1977 const char kPageResponse[] = |
1994 "HTTP/1.1 201 HELLOWORLD\r\n" | 1978 "HTTP/1.1 201 HELLOWORLD\r\n" |
1995 "Connection: close\r\n" | 1979 "Connection: close\r\n" |
1996 "Content-Length: 32\r\n" | 1980 "Content-Length: 32\r\n" |
1997 "Content-Type: text/html\r\n" | 1981 "Content-Type: text/html\r\n" |
1998 "Custom-Header: pen pineapple\r\n" | 1982 "Custom-Header: pen pineapple\r\n" |
1999 "Custom-Header: apple pen\r\n" | 1983 "Custom-Header: apple pen\r\n" |
2000 "Set-Cookie: COOKIE1\r\n" | 1984 "Set-Cookie: COOKIE1\r\n" |
2001 "Set-Cookie2: COOKIE2\r\n" | 1985 "Set-Cookie2: COOKIE2\r\n" |
2002 "\r\n" | 1986 "\r\n" |
2003 "<title>ERROR</title>Hello world."; | 1987 "<title>ERROR</title>Hello world."; |
2004 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1988 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
2005 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1989 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
2006 RegisterCustomResponse(kPageUrl, kPageResponse); | 1990 RegisterCustomResponse(kPageUrl, kPageResponse); |
2007 RegisterStaticFile( | 1991 RegisterStaticFile( |
2008 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, | 1992 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
2009 "text/javascript"); | 1993 "text/javascript"); |
2010 | 1994 |
2011 RegisterMonitorRequestHandler(); | 1995 std::unique_ptr<base::Value> result = base::JSONReader::Read( |
2012 StartServerAndNavigateToSetup(); | 1996 LoadNavigationPreloadTestPage(page_url, worker_url, "RESOLVED")); |
2013 SetupForNavigationPreloadTest(page_url, worker_url); | |
2014 | |
2015 const base::string16 title = base::ASCIIToUTF16("RESOLVED"); | |
2016 TitleWatcher title_watcher(shell()->web_contents(), title); | |
2017 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); | |
2018 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | |
2019 NavigateToURL(shell(), page_url); | |
2020 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | |
2021 | 1997 |
2022 // The page request must be sent only once, since the worker responded with | 1998 // The page request must be sent only once, since the worker responded with |
2023 // a generated Response. | 1999 // a generated Response. |
2024 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 2000 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
2025 std::unique_ptr<base::Value> result = | |
2026 base::JSONReader::Read(GetTextContent()); | |
2027 base::DictionaryValue* dict = nullptr; | 2001 base::DictionaryValue* dict = nullptr; |
2028 ASSERT_TRUE(result->GetAsDictionary(&dict)); | 2002 ASSERT_TRUE(result->GetAsDictionary(&dict)); |
2029 EXPECT_EQ("basic", GetString(*dict, "type")); | 2003 EXPECT_EQ("basic", GetString(*dict, "type")); |
2030 EXPECT_EQ(page_url, GURL(GetString(*dict, "url"))); | 2004 EXPECT_EQ(page_url, GURL(GetString(*dict, "url"))); |
2031 EXPECT_EQ(201, GetInt(*dict, "status")); | 2005 EXPECT_EQ(201, GetInt(*dict, "status")); |
2032 EXPECT_EQ(true, GetBoolean(*dict, "ok")); | 2006 EXPECT_TRUE(GetBoolean(*dict, "ok")); |
2033 EXPECT_EQ("HELLOWORLD", GetString(*dict, "statusText")); | 2007 EXPECT_EQ("HELLOWORLD", GetString(*dict, "statusText")); |
2034 EXPECT_TRUE(CheckHeader(*dict, "content-type", "text/html")); | 2008 EXPECT_TRUE(CheckHeader(*dict, "content-type", "text/html")); |
2035 EXPECT_TRUE(CheckHeader(*dict, "content-length", "32")); | 2009 EXPECT_TRUE(CheckHeader(*dict, "content-length", "32")); |
2036 EXPECT_TRUE(CheckHeader(*dict, "custom-header", "pen pineapple, apple pen")); | 2010 EXPECT_TRUE(CheckHeader(*dict, "custom-header", "pen pineapple, apple pen")); |
2037 // The forbidden response headers (Set-Cookie, Set-Cookie2) must be removed. | 2011 // The forbidden response headers (Set-Cookie, Set-Cookie2) must be removed. |
2038 EXPECT_FALSE(dict->HasKey("set-cookie")); | 2012 EXPECT_FALSE(HasHeader(*dict, "set-cookie")); |
2039 EXPECT_FALSE(dict->HasKey("set-cookie2")); | 2013 EXPECT_FALSE(HasHeader(*dict, "set-cookie2")); |
2040 } | 2014 } |
2041 | 2015 |
2042 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, RejectRedirects) { | 2016 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, |
| 2017 InvalidRedirect_MultiLocation) { |
2043 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 2018 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
2044 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 2019 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
2045 const char kRedirectedPageUrl[] = | 2020 const char kRedirectedPageUrl1[] = |
2046 "/service_worker/navigation_preload_redirected.html"; | 2021 "/service_worker/navigation_preload_redirected1.html"; |
| 2022 const char kRedirectedPageUrl2[] = |
| 2023 "/service_worker/navigation_preload_redirected2.html"; |
2047 const char kPageResponse[] = | 2024 const char kPageResponse[] = |
2048 "HTTP/1.1 302 Found\r\n" | 2025 "HTTP/1.1 302 Found\r\n" |
2049 "Connection: close\r\n" | 2026 "Connection: close\r\n" |
2050 "Location: /service_worker/navigation_preload_redirected.html\r\n" | 2027 "Location: /service_worker/navigation_preload_redirected1.html\r\n" |
| 2028 "Location: /service_worker/navigation_preload_redirected2.html\r\n" |
2051 "\r\n"; | 2029 "\r\n"; |
2052 const char kRedirectedPage[] = "<title>ERROR</title>Redirected page."; | 2030 const char kRedirectedPage[] = "<title>ERROR</title>Redirected page."; |
2053 const GURL redirecred_page_url = | |
2054 embedded_test_server()->GetURL(kRedirectedPageUrl); | |
2055 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 2031 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
2056 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 2032 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
2057 RegisterCustomResponse(kPageUrl, kPageResponse); | 2033 RegisterCustomResponse(kPageUrl, kPageResponse); |
2058 RegisterStaticFile( | 2034 RegisterStaticFile( |
2059 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, | 2035 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
2060 "text/javascript"); | 2036 "text/javascript"); |
2061 RegisterStaticFile(kRedirectedPageUrl, kRedirectedPage, "text/html"); | 2037 RegisterStaticFile(kRedirectedPageUrl1, kRedirectedPage, "text/html"); |
2062 | 2038 |
2063 RegisterMonitorRequestHandler(); | 2039 // According to the spec, multiple Location headers is not an error. So the |
2064 StartServerAndNavigateToSetup(); | 2040 // preloadResponse must be resolved with an opaque redirect response. |
2065 SetupForNavigationPreloadTest(page_url, worker_url); | 2041 // But Chrome treats multiple Location headers as an error (crbug.com/98895). |
2066 | 2042 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", |
2067 const base::string16 title = base::ASCIIToUTF16("REJECTED"); | 2043 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED")); |
2068 TitleWatcher title_watcher(shell()->web_contents(), title); | |
2069 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); | |
2070 NavigateToURL(shell(), page_url); | |
2071 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | |
2072 | 2044 |
2073 // The page request must be sent only once, since the worker responded with | 2045 // The page request must be sent only once, since the worker responded with |
2074 // a generated Response. | 2046 // a generated Response. |
2075 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 2047 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
2076 // The redirected request must not be sent. | 2048 // The redirected request must not be sent. |
2077 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl)); | 2049 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl1)); |
2078 EXPECT_EQ( | 2050 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl2)); |
2079 "NetworkError: Service Worker navigation preload doesn't support " | 2051 } |
2080 "redirects.", | 2052 |
2081 GetTextContent()); | 2053 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, |
| 2054 InvalidRedirect_InvalidLocation) { |
| 2055 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
| 2056 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
| 2057 const char kPageResponse[] = |
| 2058 "HTTP/1.1 302 Found\r\n" |
| 2059 "Connection: close\r\n" |
| 2060 "Location: http://\r\n" |
| 2061 "\r\n"; |
| 2062 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| 2063 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| 2064 RegisterCustomResponse(kPageUrl, kPageResponse); |
| 2065 RegisterStaticFile( |
| 2066 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
| 2067 "text/javascript"); |
| 2068 |
| 2069 // 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 |
| 2071 // currently Chrome handles the invalid location URL in the browser process as |
| 2072 // an error. crbug.com/707185 |
| 2073 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", |
| 2074 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED")); |
| 2075 |
| 2076 // The page request must be sent only once, since the worker responded with |
| 2077 // a generated Response. |
| 2078 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
2082 } | 2079 } |
2083 | 2080 |
2084 // Tests responding with the navigation preload response when the navigation | 2081 // Tests responding with the navigation preload response when the navigation |
2085 // occurred after a redirect. | 2082 // occurred after a redirect. |
2086 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, | 2083 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, |
2087 RedirectAndRespondWithNavigationPreload) { | 2084 RedirectAndRespondWithNavigationPreload) { |
2088 const std::string kPageUrl = "/service_worker/navigation_preload.html"; | 2085 const std::string kPageUrl = "/service_worker/navigation_preload.html"; |
2089 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 2086 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
2090 const char kPage[] = | 2087 const char kPage[] = |
2091 "<title></title>\n" | 2088 "<title></title>\n" |
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2937 // effect in CanSuspendRenderer(). | 2934 // effect in CanSuspendRenderer(). |
2938 shell()->web_contents()->WasHidden(); | 2935 shell()->web_contents()->WasHidden(); |
2939 EXPECT_TRUE(rph->IsProcessBackgrounded()); | 2936 EXPECT_TRUE(rph->IsProcessBackgrounded()); |
2940 | 2937 |
2941 // The process which has service worker thread shouldn't be suspended. | 2938 // The process which has service worker thread shouldn't be suspended. |
2942 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id)); | 2939 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id)); |
2943 } | 2940 } |
2944 #endif | 2941 #endif |
2945 | 2942 |
2946 } // namespace content | 2943 } // namespace content |
OLD | NEW |