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

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

Issue 2790433003: Support redirect responses for NavigationPreload (Closed)
Patch Set: incorporated falken's comment 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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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