Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(156)

Side by Side Diff: content/browser/service_worker/service_worker_browsertest.cc

Issue 2790433003: Support redirect responses for NavigationPreload (Closed)
Patch Set: fix DevTools test Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | content/browser/service_worker/service_worker_fetch_dispatcher.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 24 matching lines...) Expand all
1535 std::string GetTextContent() { 1569 std::string GetTextContent() {
1536 base::RunLoop run_loop; 1570 base::RunLoop run_loop;
1537 std::string text_content; 1571 std::string text_content;
1538 shell()->web_contents()->GetMainFrame()->ExecuteJavaScriptForTests( 1572 shell()->web_contents()->GetMainFrame()->ExecuteJavaScriptForTests(
1539 base::ASCIIToUTF16("document.body.textContent;"), 1573 base::ASCIIToUTF16("document.body.textContent;"),
1540 base::Bind(&StoreString, &text_content, run_loop.QuitClosure())); 1574 base::Bind(&StoreString, &text_content, run_loop.QuitClosure()));
1541 run_loop.Run(); 1575 run_loop.Run();
1542 return text_content; 1576 return text_content;
1543 } 1577 }
1544 1578
1579 void OpaqueRedirectResponseCheck(const std::string& text_content,
1580 const GURL& page_url) const {
1581 std::unique_ptr<base::Value> result = base::JSONReader::Read(text_content);
1582 base::DictionaryValue* dict = nullptr;
1583 ASSERT_TRUE(result->GetAsDictionary(&dict));
1584 EXPECT_EQ("opaqueredirect", GetString(*dict, "type"));
1585 EXPECT_EQ(page_url, GURL(GetString(*dict, "url")));
1586 EXPECT_EQ(0, GetInt(*dict, "status"));
1587 EXPECT_FALSE(GetBoolean(*dict, "ok"));
1588 EXPECT_EQ("", GetString(*dict, "statusText"));
1589 const base::ListValue* headers = nullptr;
1590 ASSERT_TRUE(dict->GetList("headers", &headers));
1591 EXPECT_EQ(0u, headers->GetSize());
1592 }
1593
1545 std::map<std::string, std::vector<net::test_server::HttpRequest>> 1594 std::map<std::string, std::vector<net::test_server::HttpRequest>>
1546 request_log_; 1595 request_log_;
1547 1596
1548 private: 1597 private:
1549 class CustomResponse : public net::test_server::HttpResponse { 1598 class CustomResponse : public net::test_server::HttpResponse {
1550 public: 1599 public:
1551 CustomResponse(const std::string& response) : response_(response) {} 1600 CustomResponse(const std::string& response) : response_(response) {}
1552 ~CustomResponse() override {} 1601 ~CustomResponse() override {}
1553 1602
1554 void SendResponse( 1603 void SendResponse(
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
1675 const char kPage[] = "<title>PASS</title>Hello world."; 1724 const char kPage[] = "<title>PASS</title>Hello world.";
1676 const std::string kScript = kEnableNavigationPreloadScript + 1725 const std::string kScript = kEnableNavigationPreloadScript +
1677 "self.addEventListener('fetch', event => {\n" 1726 "self.addEventListener('fetch', event => {\n"
1678 " // Do nothing.\n" 1727 " // Do nothing.\n"
1679 " });"; 1728 " });";
1680 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 1729 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
1681 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 1730 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
1682 RegisterStaticFile(kPageUrl, kPage, "text/html"); 1731 RegisterStaticFile(kPageUrl, kPage, "text/html");
1683 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); 1732 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript");
1684 1733
1685 RegisterMonitorRequestHandler(); 1734 EXPECT_EQ("Hello world.",
1686 StartServerAndNavigateToSetup(); 1735 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 1736
1695 // The page request must be sent once or twice: 1737 // The page request must be sent once or twice:
1696 // - A navigation preload request may be sent. But it is possible that the 1738 // - A navigation preload request may be sent. But it is possible that the
1697 // navigation preload request is canceled before reaching the server. 1739 // navigation preload request is canceled before reaching the server.
1698 // - A fallback request must be sent since respondWith wasn't used. 1740 // - A fallback request must be sent since respondWith wasn't used.
1699 const int request_count = GetRequestCount(kPageUrl); 1741 const int request_count = GetRequestCount(kPageUrl);
1700 ASSERT_TRUE(request_count == 1 || request_count == 2); 1742 ASSERT_TRUE(request_count == 1 || request_count == 2);
1701 if (request_count == 1) { 1743 if (request_count == 1) {
1702 // Fallback request. 1744 // Fallback request.
1703 EXPECT_FALSE(HasNavigationPreloadHeader(request_log_[kPageUrl][0])); 1745 EXPECT_FALSE(HasNavigationPreloadHeader(request_log_[kPageUrl][0]));
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1809 " {headers: [['content-type', 'text/html']]}));\n" 1851 " {headers: [['content-type', 'text/html']]}));\n"
1810 " return;\n" 1852 " return;\n"
1811 " }\n" 1853 " }\n"
1812 " event.respondWith(event.preloadResponse);\n" 1854 " event.respondWith(event.preloadResponse);\n"
1813 " });"; 1855 " });";
1814 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 1856 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
1815 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 1857 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
1816 RegisterStaticFile(kPageUrl, kPage, "text/html"); 1858 RegisterStaticFile(kPageUrl, kPage, "text/html");
1817 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); 1859 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript");
1818 1860
1819 RegisterMonitorRequestHandler(); 1861 EXPECT_EQ("Hello world.",
1820 StartServerAndNavigateToSetup(); 1862 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 1863
1830 // The page request must be sent only once, since the worker responded with 1864 // The page request must be sent only once, since the worker responded with
1831 // the navigation preload response 1865 // the navigation preload response
1832 ASSERT_EQ(1, GetRequestCount(kPageUrl)); 1866 ASSERT_EQ(1, GetRequestCount(kPageUrl));
1833 EXPECT_EQ("true", 1867 EXPECT_EQ("true",
1834 request_log_[kPageUrl][0].headers[kNavigationPreloadHeaderName]); 1868 request_log_[kPageUrl][0].headers[kNavigationPreloadHeaderName]);
1835 } 1869 }
1836 1870
1837 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, GetResponseText) { 1871 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, GetResponseText) {
1838 const char kPageUrl[] = "/service_worker/navigation_preload.html"; 1872 const char kPageUrl[] = "/service_worker/navigation_preload.html";
1839 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; 1873 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
1840 const char kPage[] = "<title>PASS</title>Hello world."; 1874 const char kPage[] = "<title>PASS</title>Hello world.";
1841 const std::string kScript = 1875 const std::string kScript =
1842 kEnableNavigationPreloadScript + 1876 kEnableNavigationPreloadScript +
1843 "self.addEventListener('fetch', event => {\n" 1877 "self.addEventListener('fetch', event => {\n"
1844 " event.respondWith(\n" 1878 " event.respondWith(\n"
1845 " event.preloadResponse\n" 1879 " event.preloadResponse\n"
1846 " .then(response => response.text())\n" 1880 " .then(response => response.text())\n"
1847 " .then(text =>\n" 1881 " .then(text =>\n"
1848 " new Response(\n" 1882 " new Response(\n"
1849 " text,\n" 1883 " text,\n"
1850 " {headers: [['content-type', 'text/html']]})));\n" 1884 " {headers: [['content-type', 'text/html']]})));\n"
1851 " });"; 1885 " });";
1852 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 1886 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
1853 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 1887 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
1854 RegisterStaticFile(kPageUrl, kPage, "text/html"); 1888 RegisterStaticFile(kPageUrl, kPage, "text/html");
1855 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); 1889 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript");
1856 1890
1857 RegisterMonitorRequestHandler(); 1891 EXPECT_EQ("Hello world.",
1858 StartServerAndNavigateToSetup(); 1892 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 1893
1867 // The page request must be sent only once, since the worker responded with 1894 // The page request must be sent only once, since the worker responded with
1868 // "Hello world". 1895 // "Hello world".
1869 EXPECT_EQ(1, GetRequestCount(kPageUrl)); 1896 EXPECT_EQ(1, GetRequestCount(kPageUrl));
1870 } 1897 }
1871 1898
1872 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, EmptyBody) { 1899 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, EmptyBody) {
1873 const char kPageUrl[] = "/service_worker/navigation_preload.html"; 1900 const char kPageUrl[] = "/service_worker/navigation_preload.html";
1874 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; 1901 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
1875 const char kPage[] = ""; 1902 const char kPage[] = "";
1876 const std::string kScript = 1903 const std::string kScript =
1877 kEnableNavigationPreloadScript + 1904 kEnableNavigationPreloadScript +
1878 "self.addEventListener('fetch', event => {\n" 1905 "self.addEventListener('fetch', event => {\n"
1879 " event.respondWith(\n" 1906 " event.respondWith(\n"
1880 " event.preloadResponse\n" 1907 " event.preloadResponse\n"
1881 " .then(response => response.text())\n" 1908 " .then(response => response.text())\n"
1882 " .then(text =>\n" 1909 " .then(text =>\n"
1883 " new Response(\n" 1910 " new Response(\n"
1884 " '<title>PASS</title>[' + text + ']',\n" 1911 " '<title>PASS</title>[' + text + ']',\n"
1885 " {headers: [['content-type', 'text/html']]})));\n" 1912 " {headers: [['content-type', 'text/html']]})));\n"
1886 " });"; 1913 " });";
1887 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 1914 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
1888 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 1915 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
1889 RegisterStaticFile(kPageUrl, kPage, "text/html"); 1916 RegisterStaticFile(kPageUrl, kPage, "text/html");
1890 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); 1917 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript");
1891 1918
1892 RegisterMonitorRequestHandler(); 1919 EXPECT_EQ("[]", LoadNavigationPreloadTestPage(page_url, worker_url, "PASS"));
1893 StartServerAndNavigateToSetup();
1894 SetupForNavigationPreloadTest(page_url, worker_url);
1895
1896 const base::string16 title = base::ASCIIToUTF16("PASS");
1897 TitleWatcher title_watcher(shell()->web_contents(), title);
1898 NavigateToURL(shell(), page_url);
1899 EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
1900 EXPECT_EQ("[]", GetTextContent());
1901 1920
1902 EXPECT_EQ(1, GetRequestCount(kPageUrl)); 1921 EXPECT_EQ(1, GetRequestCount(kPageUrl));
1903 } 1922 }
1904 1923
1905 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NetworkError) { 1924 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NetworkError) {
1906 const char kPageUrl[] = "/service_worker/navigation_preload.html"; 1925 const char kPageUrl[] = "/service_worker/navigation_preload.html";
1907 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; 1926 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
1908 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 1927 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
1909 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 1928 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
1910 RegisterStaticFile( 1929 RegisterStaticFile(
(...skipping 22 matching lines...) Expand all
1933 base::Bind(&CancellingInterceptorCallback)); 1952 base::Bind(&CancellingInterceptorCallback));
1934 1953
1935 const char kPageUrl[] = "/service_worker/navigation_preload.html"; 1954 const char kPageUrl[] = "/service_worker/navigation_preload.html";
1936 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; 1955 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
1937 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 1956 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
1938 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 1957 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
1939 RegisterStaticFile( 1958 RegisterStaticFile(
1940 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, 1959 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript,
1941 "text/javascript"); 1960 "text/javascript");
1942 1961
1943 RegisterMonitorRequestHandler();
1944 StartServerAndNavigateToSetup();
1945 SetupForNavigationPreloadTest(page_url, worker_url);
1946
1947 const base::string16 title = base::ASCIIToUTF16("REJECTED");
1948 TitleWatcher title_watcher(shell()->web_contents(), title);
1949 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED"));
1950 NavigateToURL(shell(), page_url);
1951 EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
1952 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", 1962 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.",
1953 GetTextContent()); 1963 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED"));
1954 } 1964 }
1955 1965
1956 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, 1966 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
1957 PreloadHeadersSimple) { 1967 PreloadHeadersSimple) {
1958 const char kPageUrl[] = "/service_worker/navigation_preload.html"; 1968 const char kPageUrl[] = "/service_worker/navigation_preload.html";
1959 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; 1969 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
1960 const char kPage[] = "<title>ERROR</title>Hello world."; 1970 const char kPage[] = "<title>ERROR</title>Hello world.";
1961 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 1971 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
1962 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 1972 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
1963 RegisterStaticFile(kPageUrl, kPage, "text/html"); 1973 RegisterStaticFile(kPageUrl, kPage, "text/html");
1964 RegisterStaticFile( 1974 RegisterStaticFile(
1965 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, 1975 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript,
1966 "text/javascript"); 1976 "text/javascript");
1967 1977
1968 RegisterMonitorRequestHandler(); 1978 std::unique_ptr<base::Value> result = base::JSONReader::Read(
1969 StartServerAndNavigateToSetup(); 1979 LoadNavigationPreloadTestPage(page_url, worker_url, "RESOLVED"));
1970 SetupForNavigationPreloadTest(page_url, worker_url);
1971
1972 const base::string16 title = base::ASCIIToUTF16("RESOLVED");
1973 TitleWatcher title_watcher(shell()->web_contents(), title);
1974 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED"));
1975 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR"));
1976 NavigateToURL(shell(), page_url);
1977 EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
1978 1980
1979 // The page request must be sent only once, since the worker responded with 1981 // The page request must be sent only once, since the worker responded with
1980 // a generated Response. 1982 // a generated Response.
1981 EXPECT_EQ(1, GetRequestCount(kPageUrl)); 1983 EXPECT_EQ(1, GetRequestCount(kPageUrl));
1982 std::unique_ptr<base::Value> result =
1983 base::JSONReader::Read(GetTextContent());
1984 base::DictionaryValue* dict = nullptr; 1984 base::DictionaryValue* dict = nullptr;
1985 ASSERT_TRUE(result->GetAsDictionary(&dict)); 1985 ASSERT_TRUE(result->GetAsDictionary(&dict));
1986 EXPECT_EQ("basic", GetString(*dict, "type")); 1986 EXPECT_EQ("basic", GetString(*dict, "type"));
1987 EXPECT_EQ(page_url, GURL(GetString(*dict, "url"))); 1987 EXPECT_EQ(page_url, GURL(GetString(*dict, "url")));
1988 EXPECT_EQ(200, GetInt(*dict, "status")); 1988 EXPECT_EQ(200, GetInt(*dict, "status"));
1989 EXPECT_EQ(true, GetBoolean(*dict, "ok")); 1989 EXPECT_TRUE(GetBoolean(*dict, "ok"));
1990 EXPECT_EQ("OK", GetString(*dict, "statusText")); 1990 EXPECT_EQ("OK", GetString(*dict, "statusText"));
1991 EXPECT_TRUE(CheckHeader(*dict, "content-type", "text/html")); 1991 EXPECT_TRUE(CheckHeader(*dict, "content-type", "text/html"));
1992 EXPECT_TRUE(CheckHeader(*dict, "content-length", 1992 EXPECT_TRUE(CheckHeader(*dict, "content-length",
1993 base::IntToString(sizeof(kPage) - 1))); 1993 base::IntToString(sizeof(kPage) - 1)));
1994 } 1994 }
1995 1995
1996 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NotEnabled) { 1996 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NotEnabled) {
1997 const char kPageUrl[] = "/service_worker/navigation_preload.html"; 1997 const char kPageUrl[] = "/service_worker/navigation_preload.html";
1998 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; 1998 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
1999 const char kPage[] = "<title>ERROR</title>Hello world."; 1999 const char kPage[] = "<title>ERROR</title>Hello world.";
2000 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 2000 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
2001 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 2001 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
2002 RegisterStaticFile(kPageUrl, kPage, "text/html"); 2002 RegisterStaticFile(kPageUrl, kPage, "text/html");
2003 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); 2003 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript");
2004 2004
2005 RegisterMonitorRequestHandler(); 2005 EXPECT_EQ("Resolved with undefined.",
2006 StartServerAndNavigateToSetup(); 2006 LoadNavigationPreloadTestPage(page_url, worker_url, "RESOLVED"));
2007 SetupForNavigationPreloadTest(page_url, worker_url);
2008
2009 const base::string16 title = base::ASCIIToUTF16("RESOLVED");
2010 TitleWatcher title_watcher(shell()->web_contents(), title);
2011 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED"));
2012 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR"));
2013 NavigateToURL(shell(), page_url);
2014 EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
2015 2007
2016 // The page request must not be sent, since the worker responded with a 2008 // The page request must not be sent, since the worker responded with a
2017 // generated Response and the navigation preload isn't enabled. 2009 // generated Response and the navigation preload isn't enabled.
2018 EXPECT_EQ(0, GetRequestCount(kPageUrl)); 2010 EXPECT_EQ(0, GetRequestCount(kPageUrl));
2019 EXPECT_EQ("Resolved with undefined.", GetTextContent());
2020 } 2011 }
2021 2012
2022 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, 2013 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
2023 PreloadHeadersCustom) { 2014 PreloadHeadersCustom) {
2024 const char kPageUrl[] = "/service_worker/navigation_preload.html"; 2015 const char kPageUrl[] = "/service_worker/navigation_preload.html";
2025 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; 2016 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
2026 const char kPageResponse[] = 2017 const char kPageResponse[] =
2027 "HTTP/1.1 201 HELLOWORLD\r\n" 2018 "HTTP/1.1 201 HELLOWORLD\r\n"
2028 "Connection: close\r\n" 2019 "Connection: close\r\n"
2029 "Content-Length: 32\r\n" 2020 "Content-Length: 32\r\n"
2030 "Content-Type: text/html\r\n" 2021 "Content-Type: text/html\r\n"
2031 "Custom-Header: pen pineapple\r\n" 2022 "Custom-Header: pen pineapple\r\n"
2032 "Custom-Header: apple pen\r\n" 2023 "Custom-Header: apple pen\r\n"
2033 "Set-Cookie: COOKIE1\r\n" 2024 "Set-Cookie: COOKIE1\r\n"
2034 "Set-Cookie2: COOKIE2\r\n" 2025 "Set-Cookie2: COOKIE2\r\n"
2035 "\r\n" 2026 "\r\n"
2036 "<title>ERROR</title>Hello world."; 2027 "<title>ERROR</title>Hello world.";
2037 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 2028 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
2038 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 2029 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
2039 RegisterCustomResponse(kPageUrl, kPageResponse); 2030 RegisterCustomResponse(kPageUrl, kPageResponse);
2040 RegisterStaticFile( 2031 RegisterStaticFile(
2041 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, 2032 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript,
2042 "text/javascript"); 2033 "text/javascript");
2043 2034
2044 RegisterMonitorRequestHandler(); 2035 std::unique_ptr<base::Value> result = base::JSONReader::Read(
2045 StartServerAndNavigateToSetup(); 2036 LoadNavigationPreloadTestPage(page_url, worker_url, "RESOLVED"));
2046 SetupForNavigationPreloadTest(page_url, worker_url);
2047
2048 const base::string16 title = base::ASCIIToUTF16("RESOLVED");
2049 TitleWatcher title_watcher(shell()->web_contents(), title);
2050 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED"));
2051 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR"));
2052 NavigateToURL(shell(), page_url);
2053 EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
2054 2037
2055 // The page request must be sent only once, since the worker responded with 2038 // The page request must be sent only once, since the worker responded with
2056 // a generated Response. 2039 // a generated Response.
2057 EXPECT_EQ(1, GetRequestCount(kPageUrl)); 2040 EXPECT_EQ(1, GetRequestCount(kPageUrl));
2058 std::unique_ptr<base::Value> result =
2059 base::JSONReader::Read(GetTextContent());
2060 base::DictionaryValue* dict = nullptr; 2041 base::DictionaryValue* dict = nullptr;
2061 ASSERT_TRUE(result->GetAsDictionary(&dict)); 2042 ASSERT_TRUE(result->GetAsDictionary(&dict));
2062 EXPECT_EQ("basic", GetString(*dict, "type")); 2043 EXPECT_EQ("basic", GetString(*dict, "type"));
2063 EXPECT_EQ(page_url, GURL(GetString(*dict, "url"))); 2044 EXPECT_EQ(page_url, GURL(GetString(*dict, "url")));
2064 EXPECT_EQ(201, GetInt(*dict, "status")); 2045 EXPECT_EQ(201, GetInt(*dict, "status"));
2065 EXPECT_EQ(true, GetBoolean(*dict, "ok")); 2046 EXPECT_TRUE(GetBoolean(*dict, "ok"));
2066 EXPECT_EQ("HELLOWORLD", GetString(*dict, "statusText")); 2047 EXPECT_EQ("HELLOWORLD", GetString(*dict, "statusText"));
2067 EXPECT_TRUE(CheckHeader(*dict, "content-type", "text/html")); 2048 EXPECT_TRUE(CheckHeader(*dict, "content-type", "text/html"));
2068 EXPECT_TRUE(CheckHeader(*dict, "content-length", "32")); 2049 EXPECT_TRUE(CheckHeader(*dict, "content-length", "32"));
2069 EXPECT_TRUE(CheckHeader(*dict, "custom-header", "pen pineapple, apple pen")); 2050 EXPECT_TRUE(CheckHeader(*dict, "custom-header", "pen pineapple, apple pen"));
2070 // The forbidden response headers (Set-Cookie, Set-Cookie2) must be removed. 2051 // The forbidden response headers (Set-Cookie, Set-Cookie2) must be removed.
2071 EXPECT_FALSE(dict->HasKey("set-cookie")); 2052 EXPECT_FALSE(HasHeader(*dict, "set-cookie"));
2072 EXPECT_FALSE(dict->HasKey("set-cookie2")); 2053 EXPECT_FALSE(HasHeader(*dict, "set-cookie2"));
2073 } 2054 }
2074 2055
2075 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, RejectRedirects) { 2056 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NormalRedirect) {
2076 const char kPageUrl[] = "/service_worker/navigation_preload.html"; 2057 const char kPageUrl[] = "/service_worker/navigation_preload.html";
2077 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; 2058 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
2078 const char kRedirectedPageUrl[] = 2059 const char kRedirectedPageUrl[] =
2079 "/service_worker/navigation_preload_redirected.html"; 2060 "/service_worker/navigation_preload_redirected.html";
2080 const char kPageResponse[] = 2061 const char kPageResponse[] =
2081 "HTTP/1.1 302 Found\r\n" 2062 "HTTP/1.1 302 Found\r\n"
2082 "Connection: close\r\n" 2063 "Connection: close\r\n"
2083 "Location: /service_worker/navigation_preload_redirected.html\r\n" 2064 "Location: /service_worker/navigation_preload_redirected.html\r\n"
2084 "\r\n"; 2065 "\r\n";
2085 const char kRedirectedPage[] = "<title>ERROR</title>Redirected page."; 2066 const char kRedirectedPage[] = "<title>ERROR</title>Redirected page.";
2086 const GURL redirecred_page_url =
2087 embedded_test_server()->GetURL(kRedirectedPageUrl);
2088 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); 2067 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
2089 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); 2068 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
2090 RegisterCustomResponse(kPageUrl, kPageResponse); 2069 RegisterCustomResponse(kPageUrl, kPageResponse);
2091 RegisterStaticFile( 2070 RegisterStaticFile(
2092 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, 2071 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript,
2093 "text/javascript"); 2072 "text/javascript");
2094 RegisterStaticFile(kRedirectedPageUrl, kRedirectedPage, "text/html"); 2073 RegisterStaticFile(kRedirectedPageUrl, kRedirectedPage, "text/html");
2095 2074
2096 RegisterMonitorRequestHandler(); 2075 OpaqueRedirectResponseCheck(
2097 StartServerAndNavigateToSetup(); 2076 LoadNavigationPreloadTestPage(page_url, worker_url, "RESOLVED"),
2098 SetupForNavigationPreloadTest(page_url, worker_url); 2077 page_url);
2099
2100 const base::string16 title = base::ASCIIToUTF16("REJECTED");
2101 TitleWatcher title_watcher(shell()->web_contents(), title);
2102 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED"));
2103 NavigateToURL(shell(), page_url);
2104 EXPECT_EQ(title, title_watcher.WaitAndGetTitle());
2105 2078
2106 // The page request must be sent only once, since the worker responded with 2079 // The page request must be sent only once, since the worker responded with
2107 // a generated Response. 2080 // a generated Response.
2108 EXPECT_EQ(1, GetRequestCount(kPageUrl)); 2081 EXPECT_EQ(1, GetRequestCount(kPageUrl));
2109 // The redirected request must not be sent. 2082 // The redirected request must not be sent.
2110 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl)); 2083 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl));
2111 EXPECT_EQ( 2084 }
2112 "NetworkError: Service Worker navigation preload doesn't support " 2085
2113 "redirects.", 2086 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
2114 GetTextContent()); 2087 InvalidRedirect_MultiLocation) {
2088 const char kPageUrl[] = "/service_worker/navigation_preload.html";
2089 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
2090 const char kRedirectedPageUrl1[] =
2091 "/service_worker/navigation_preload_redirected1.html";
2092 const char kRedirectedPageUrl2[] =
2093 "/service_worker/navigation_preload_redirected2.html";
2094 const char kPageResponse[] =
2095 "HTTP/1.1 302 Found\r\n"
2096 "Connection: close\r\n"
2097 "Location: /service_worker/navigation_preload_redirected1.html\r\n"
2098 "Location: /service_worker/navigation_preload_redirected2.html\r\n"
2099 "\r\n";
2100 const char kRedirectedPage[] = "<title>ERROR</title>Redirected page.";
2101 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
2102 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
2103 RegisterCustomResponse(kPageUrl, kPageResponse);
2104 RegisterStaticFile(
2105 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript,
2106 "text/javascript");
2107 RegisterStaticFile(kRedirectedPageUrl1, kRedirectedPage, "text/html");
2108
2109 // According to the spec, multiple Location headers is not an error. So the
2110 // preloadResponse must be resolved with an opaque redirect response.
2111 // But Chrome treats multiple Location headers as an error (crbug.com/98895).
2112 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.",
2113 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED"));
2114
2115 // The page request must be sent only once, since the worker responded with
2116 // a generated Response.
2117 EXPECT_EQ(1, GetRequestCount(kPageUrl));
2118 // The redirected request must not be sent.
2119 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl1));
2120 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl2));
2121 }
2122
2123 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
2124 InvalidRedirect_InvalidLocation) {
2125 const char kPageUrl[] = "/service_worker/navigation_preload.html";
2126 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
2127 const char kPageResponse[] =
2128 "HTTP/1.1 302 Found\r\n"
2129 "Connection: close\r\n"
2130 "Location: http://\r\n"
2131 "\r\n";
2132 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
2133 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
2134 RegisterCustomResponse(kPageUrl, kPageResponse);
2135 RegisterStaticFile(
2136 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript,
2137 "text/javascript");
2138
2139 // According to the spec, even if the location URL is invalid, the
2140 // preloadResponse must be resolve with an opaque redirect response. But
2141 // currently Chrome handles the invalid location URL in the browser process as
2142 // an error.
falken 2017/03/31 07:36:03 Make this a TODO with bug?
horo 2017/03/31 09:56:30 Done.
2143 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.",
2144 LoadNavigationPreloadTestPage(page_url, worker_url, "REJECTED"));
2145
2146 // The page request must be sent only once, since the worker responded with
2147 // a generated Response.
2148 EXPECT_EQ(1, GetRequestCount(kPageUrl));
2149 }
2150
2151 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
2152 InvalidRedirect_NoLocation) {
2153 const char kPageUrl[] = "/service_worker/navigation_preload.html";
2154 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
2155 const char kPageResponse[] =
2156 "HTTP/1.1 302 Found\r\n"
2157 "Connection: close\r\n"
2158 "Custom-Header: hello\r\n"
2159 "\r\n";
2160 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
2161 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
2162 RegisterCustomResponse(kPageUrl, kPageResponse);
2163 RegisterStaticFile(
2164 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript,
2165 "text/javascript");
2166
2167 OpaqueRedirectResponseCheck(
2168 LoadNavigationPreloadTestPage(page_url, worker_url, "RESOLVED"),
2169 page_url);
2170
2171 // The page request must be sent only once, since the worker responded with
2172 // a generated Response.
2173 EXPECT_EQ(1, GetRequestCount(kPageUrl));
2174 }
2175
2176 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
2177 InvalidRedirect_NoLocationWithBody) {
2178 const char kPageUrl[] = "/service_worker/navigation_preload.html";
2179 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
2180 const char kPageResponse[] =
2181 "HTTP/1.1 302 Found\r\n"
2182 "Connection: close\r\n"
2183 "Custom-Header: hello\r\n"
2184 "\r\n"
2185 "Body\r\n";
2186 const GURL page_url = embedded_test_server()->GetURL(kPageUrl);
2187 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl);
2188 RegisterCustomResponse(kPageUrl, kPageResponse);
2189 RegisterStaticFile(
2190 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript,
2191 "text/javascript");
2192
2193 OpaqueRedirectResponseCheck(
2194 LoadNavigationPreloadTestPage(page_url, worker_url, "RESOLVED"),
2195 page_url);
2196
2197 // The page request must be sent only once, since the worker responded with
2198 // a generated Response.
2199 EXPECT_EQ(1, GetRequestCount(kPageUrl));
2115 } 2200 }
2116 2201
2117 // Tests responding with the navigation preload response when the navigation 2202 // Tests responding with the navigation preload response when the navigation
2118 // occurred after a redirect. 2203 // occurred after a redirect.
2119 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, 2204 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest,
2120 RedirectAndRespondWithNavigationPreload) { 2205 RedirectAndRespondWithNavigationPreload) {
2121 const std::string kPageUrl = "/service_worker/navigation_preload.html"; 2206 const std::string kPageUrl = "/service_worker/navigation_preload.html";
2122 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; 2207 const char kWorkerUrl[] = "/service_worker/navigation_preload.js";
2123 const char kPage[] = 2208 const char kPage[] =
2124 "<title></title>\n" 2209 "<title></title>\n"
(...skipping 845 matching lines...) Expand 10 before | Expand all | Expand 10 after
2970 // effect in CanSuspendRenderer(). 3055 // effect in CanSuspendRenderer().
2971 shell()->web_contents()->WasHidden(); 3056 shell()->web_contents()->WasHidden();
2972 EXPECT_TRUE(rph->IsProcessBackgrounded()); 3057 EXPECT_TRUE(rph->IsProcessBackgrounded());
2973 3058
2974 // The process which has service worker thread shouldn't be suspended. 3059 // The process which has service worker thread shouldn't be suspended.
2975 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id)); 3060 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id));
2976 } 3061 }
2977 #endif 3062 #endif
2978 3063
2979 } // namespace content 3064 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/browser/service_worker/service_worker_fetch_dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698