| 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 844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2936 // effect in CanSuspendRenderer(). | 2933 // effect in CanSuspendRenderer(). |
| 2937 shell()->web_contents()->WasHidden(); | 2934 shell()->web_contents()->WasHidden(); |
| 2938 EXPECT_TRUE(rph->IsProcessBackgrounded()); | 2935 EXPECT_TRUE(rph->IsProcessBackgrounded()); |
| 2939 | 2936 |
| 2940 // The process which has service worker thread shouldn't be suspended. | 2937 // The process which has service worker thread shouldn't be suspended. |
| 2941 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id)); | 2938 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id)); |
| 2942 } | 2939 } |
| 2943 #endif | 2940 #endif |
| 2944 | 2941 |
| 2945 } // namespace content | 2942 } // namespace content |
| OLD | NEW |