| 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 |