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 1608 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1619 "Service-Worker-Navigation-Preload"); | 1619 "Service-Worker-Navigation-Preload"); |
1620 | 1620 |
1621 const std::string | 1621 const std::string |
1622 ServiceWorkerNavigationPreloadTest::kEnableNavigationPreloadScript( | 1622 ServiceWorkerNavigationPreloadTest::kEnableNavigationPreloadScript( |
1623 "self.addEventListener('activate', event => {\n" | 1623 "self.addEventListener('activate', event => {\n" |
1624 " event.waitUntil(self.registration.navigationPreload.enable());\n" | 1624 " event.waitUntil(self.registration.navigationPreload.enable());\n" |
1625 " });\n"); | 1625 " });\n"); |
1626 | 1626 |
1627 const std::string | 1627 const std::string |
1628 ServiceWorkerNavigationPreloadTest::kPreloadResponseTestScript = | 1628 ServiceWorkerNavigationPreloadTest::kPreloadResponseTestScript = |
1629 "var preload_resolve;\n" | |
1630 "var preload_promise = new Promise(r => { preload_resolve = r; });\n" | |
1631 "self.addEventListener('fetch', event => {\n" | 1629 "self.addEventListener('fetch', event => {\n" |
1632 " event.waitUntil(event.preloadResponse.then(\n" | 1630 " event.respondWith(event.preloadResponse.then(\n" |
1633 " r => {\n" | 1631 " r => {\n" |
1634 " if (!r) {\n" | 1632 " if (!r) {\n" |
1635 " preload_resolve(\n" | 1633 " return {result: 'RESOLVED', \n" |
1636 " {result: 'RESOLVED', \n" | 1634 " info: 'Resolved with ' + r + '.'};\n" |
1637 " info: 'Resolved with ' + r + '.'});\n" | |
1638 " return;\n" | |
1639 " }\n" | 1635 " }\n" |
1640 " var info = {};\n" | 1636 " var info = {};\n" |
1641 " info.type = r.type;\n" | 1637 " info.type = r.type;\n" |
1642 " info.url = r.url;\n" | 1638 " info.url = r.url;\n" |
1643 " info.status = r.status;\n" | 1639 " info.status = r.status;\n" |
1644 " info.ok = r.ok;\n" | 1640 " info.ok = r.ok;\n" |
1645 " info.statusText = r.statusText;\n" | 1641 " info.statusText = r.statusText;\n" |
1646 " info.headers = [];\n" | 1642 " info.headers = [];\n" |
1647 " r.headers.forEach(\n" | 1643 " r.headers.forEach(\n" |
1648 " (v, n) => { info.headers.push([n,v]); });\n" | 1644 " (v, n) => { info.headers.push([n,v]); });\n" |
1649 " preload_resolve({result: 'RESOLVED',\n" | 1645 " return {result: 'RESOLVED',\n" |
1650 " info: JSON.stringify(info)}); },\n" | 1646 " info: JSON.stringify(info)}; },\n" |
1651 " e => { preload_resolve({result: 'REJECTED',\n" | 1647 " e => { return {result: 'REJECTED',\n" |
1652 " info: e.toString()}); }));\n" | 1648 " info: e.toString()}; })\n" |
1653 " event.respondWith(\n" | 1649 " .then(data => {\n" |
1654 " new Response(\n" | 1650 " return new Response(\n" |
1655 " '<title>WAITING</title><script>\\n' +\n" | 1651 " '<title>' + data.result + '</title>' +\n" |
1656 " 'navigator.serviceWorker.onmessage = e => {\\n' +\n" | 1652 " '<body>' + data.info + '</body>',\n" |
1657 " ' var div = document.createElement(\\'div\\');\\n' +\n" | 1653 " {headers: [['content-type', 'text/html']]});\n" |
1658 " ' div.appendChild(' +\n" | 1654 " }));\n" |
1659 " ' document.createTextNode(e.data.info));\\n' +\n" | 1655 " });\n"; |
1660 " ' document.body.appendChild(div);\\n' +\n" | |
1661 " ' document.title = e.data.result;\\n' +\n" | |
1662 " ' };\\n' +\n" | |
1663 " 'navigator.serviceWorker.controller.postMessage(\\n' +\n" | |
1664 " ' null);\\n' +\n" | |
1665 " '</script>'," | |
1666 " {headers: [['content-type', 'text/html']]}));\n" | |
1667 " });\n" | |
1668 "self.addEventListener('message', event => {\n" | |
1669 " event.waitUntil(\n" | |
1670 " preload_promise.then(\n" | |
1671 " result => event.source.postMessage(result)));\n" | |
1672 " });"; | |
1673 | 1656 |
1674 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NetworkFallback) { | 1657 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NetworkFallback) { |
1675 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1658 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1676 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1659 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1677 const char kPage[] = "<title>PASS</title>Hello world."; | 1660 const char kPage[] = "<title>PASS</title>Hello world."; |
1678 const std::string kScript = kEnableNavigationPreloadScript + | 1661 const std::string kScript = kEnableNavigationPreloadScript + |
1679 "self.addEventListener('fetch', event => {\n" | 1662 "self.addEventListener('fetch', event => {\n" |
1680 " // Do nothing.\n" | 1663 " // Do nothing.\n" |
1681 " });"; | 1664 " });"; |
1682 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1665 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1864 TitleWatcher title_watcher(shell()->web_contents(), title); | 1847 TitleWatcher title_watcher(shell()->web_contents(), title); |
1865 NavigateToURL(shell(), page_url); | 1848 NavigateToURL(shell(), page_url); |
1866 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1849 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1867 EXPECT_EQ("Hello world.", GetTextContent()); | 1850 EXPECT_EQ("Hello world.", GetTextContent()); |
1868 | 1851 |
1869 // The page request must be sent only once, since the worker responded with | 1852 // The page request must be sent only once, since the worker responded with |
1870 // "Hello world". | 1853 // "Hello world". |
1871 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 1854 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
1872 } | 1855 } |
1873 | 1856 |
1874 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, | |
1875 AbortPreloadRequest) { | |
1876 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | |
1877 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | |
1878 const char kPage[] = "<title>ERROR</title>Hello world."; | |
1879 // In this script, event.preloadResponse is not guarded by event.waitUntil. | |
1880 // So the preload request should be canceled, when the fetch event handler | |
1881 // has been executed. | |
1882 const std::string kScript = | |
1883 kEnableNavigationPreloadScript + | |
1884 "var preload_resolve;\n" | |
1885 "var preload_promise = new Promise(r => { preload_resolve = r; });\n" | |
1886 "self.addEventListener('fetch', event => {\n" | |
1887 " event.preloadResponse.then(\n" | |
1888 " _ => { preload_resolve({result: 'RESOLVED',\n" | |
1889 " info: 'Preload resolved.'}); },\n" | |
1890 " e => { preload_resolve({result: 'REJECTED',\n" | |
1891 " info: e.toString()}); });\n" | |
1892 " event.respondWith(\n" | |
1893 " new Response(\n" | |
1894 " '<title>WAITING</title><script>\\n' +\n" | |
1895 " 'navigator.serviceWorker.onmessage = e => {\\n' +\n" | |
1896 " ' var div = document.createElement(\\'div\\');\\n' +\n" | |
1897 " ' div.appendChild(' +\n" | |
1898 " ' document.createTextNode(e.data.info));\\n' +\n" | |
1899 " ' document.body.appendChild(div);\\n' +\n" | |
1900 " ' document.title = e.data.result;\\n' +\n" | |
1901 " ' };\\n' +\n" | |
1902 " 'navigator.serviceWorker.controller.postMessage(\\n' +\n" | |
1903 " ' null);\\n' +\n" | |
1904 " '</script>'," | |
1905 " {headers: [['content-type', 'text/html']]}));\n" | |
1906 " });\n" | |
1907 "self.addEventListener('message', event => {\n" | |
1908 " event.waitUntil(\n" | |
1909 " preload_promise.then(\n" | |
1910 " result => event.source.postMessage(result)));\n" | |
1911 " });"; | |
1912 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | |
1913 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | |
1914 RegisterStaticFile(kPageUrl, kPage, "text/html"); | |
1915 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | |
1916 | |
1917 RegisterMonitorRequestHandler(); | |
1918 StartServerAndNavigateToSetup(); | |
1919 SetupForNavigationPreloadTest(page_url, worker_url); | |
1920 | |
1921 const base::string16 title = base::ASCIIToUTF16("REJECTED"); | |
1922 TitleWatcher title_watcher(shell()->web_contents(), title); | |
1923 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); | |
1924 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | |
1925 NavigateToURL(shell(), page_url); | |
1926 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | |
1927 | |
1928 EXPECT_EQ( | |
1929 "AbortError: Service Worker navigation preload aborted. Need to guard " | |
1930 "with respondWith or waitUntil.", | |
1931 GetTextContent()); | |
1932 } | |
1933 | |
1934 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NetworkError) { | 1857 IN_PROC_BROWSER_TEST_F(ServiceWorkerNavigationPreloadTest, NetworkError) { |
1935 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1858 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1936 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1859 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1937 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1860 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1938 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1861 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1939 RegisterStaticFile( | 1862 RegisterStaticFile( |
1940 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, | 1863 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
1941 "text/javascript"); | 1864 "text/javascript"); |
1942 | 1865 |
1943 RegisterMonitorRequestHandler(); | 1866 RegisterMonitorRequestHandler(); |
(...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2996 // effect in CanSuspendRenderer(). | 2919 // effect in CanSuspendRenderer(). |
2997 shell()->web_contents()->WasHidden(); | 2920 shell()->web_contents()->WasHidden(); |
2998 EXPECT_TRUE(rph->IsProcessBackgrounded()); | 2921 EXPECT_TRUE(rph->IsProcessBackgrounded()); |
2999 | 2922 |
3000 // The process which has service worker thread shouldn't be suspended. | 2923 // The process which has service worker thread shouldn't be suspended. |
3001 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id)); | 2924 EXPECT_FALSE(memory_coordinator->CanSuspendRenderer(render_process_id)); |
3002 } | 2925 } |
3003 #endif | 2926 #endif |
3004 | 2927 |
3005 } // namespace content | 2928 } // namespace content |
OLD | NEW |