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

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

Issue 2645493002: Increase the lifetime of Navigation Preload related objects. (Closed)
Patch Set: send abort error and fix flaky test and add abort-when-responded layouttest Created 3 years, 11 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
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 1608 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698