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 1398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1409 ServiceWorkerBrowserTest::SetUpOnMainThread(); | 1409 ServiceWorkerBrowserTest::SetUpOnMainThread(); |
1410 } | 1410 } |
1411 | 1411 |
1412 void SetUpCommandLine(base::CommandLine* command_line) override { | 1412 void SetUpCommandLine(base::CommandLine* command_line) override { |
1413 command_line->AppendSwitchASCII( | 1413 command_line->AppendSwitchASCII( |
1414 switches::kEnableFeatures, | 1414 switches::kEnableFeatures, |
1415 features::kServiceWorkerNavigationPreload.name); | 1415 features::kServiceWorkerNavigationPreload.name); |
1416 } | 1416 } |
1417 | 1417 |
1418 protected: | 1418 protected: |
| 1419 static const std::string kNavigationPreloadHeaderName; |
| 1420 static const std::string kEnableNavigationPreloadScript; |
| 1421 static const std::string kPreloadResponseTestScript; |
| 1422 |
| 1423 static bool HasNavigationPreloadHeader( |
| 1424 const net::test_server::HttpRequest& request) { |
| 1425 return request.headers.find(kNavigationPreloadHeaderName) != |
| 1426 request.headers.end(); |
| 1427 } |
| 1428 |
| 1429 static std::string GetNavigationPreloadHeader( |
| 1430 const net::test_server::HttpRequest& request) { |
| 1431 DCHECK(HasNavigationPreloadHeader(request)); |
| 1432 return request.headers.find(kNavigationPreloadHeaderName)->second; |
| 1433 } |
| 1434 |
1419 void SetupForNavigationPreloadTest(const GURL& scope, | 1435 void SetupForNavigationPreloadTest(const GURL& scope, |
1420 const GURL& worker_url, | 1436 const GURL& worker_url) { |
1421 bool enable_navigation_preload) { | |
1422 scoped_refptr<WorkerActivatedObserver> observer = | 1437 scoped_refptr<WorkerActivatedObserver> observer = |
1423 new WorkerActivatedObserver(wrapper()); | 1438 new WorkerActivatedObserver(wrapper()); |
1424 observer->Init(); | 1439 observer->Init(); |
1425 public_context()->RegisterServiceWorker( | 1440 public_context()->RegisterServiceWorker( |
1426 scope, worker_url, | 1441 scope, worker_url, |
1427 base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing))); | 1442 base::Bind(&ExpectResultAndRun, true, base::Bind(&base::DoNothing))); |
1428 observer->Wait(); | 1443 observer->Wait(); |
1429 if (enable_navigation_preload) { | |
1430 RunOnIOThread(base::Bind(&self::EnableNavigationPreloadOnIO, | |
1431 base::Unretained(this), scope)); | |
1432 } | |
1433 | 1444 |
1434 embedded_test_server()->RegisterRequestMonitor( | 1445 embedded_test_server()->RegisterRequestMonitor( |
1435 base::Bind(&self::MonitorRequestHandler, base::Unretained(this))); | 1446 base::Bind(&self::MonitorRequestHandler, base::Unretained(this))); |
1436 } | 1447 } |
1437 | 1448 |
1438 void RegisterStaticFile(const std::string& relative_url, | 1449 void RegisterStaticFile(const std::string& relative_url, |
1439 const std::string& content, | 1450 const std::string& content, |
1440 const std::string& content_type) { | 1451 const std::string& content_type) { |
1441 embedded_test_server()->RegisterRequestHandler( | 1452 embedded_test_server()->RegisterRequestHandler( |
1442 base::Bind(&self::StaticRequestHandler, base::Unretained(this), | 1453 base::Bind(&self::StaticRequestHandler, base::Unretained(this), |
1443 relative_url, content, content_type)); | 1454 relative_url, content, content_type)); |
1444 } | 1455 } |
1445 | 1456 |
1446 void RegisterCustomResponse(const std::string& relative_url, | 1457 void RegisterCustomResponse(const std::string& relative_url, |
1447 const std::string& response) { | 1458 const std::string& response) { |
1448 embedded_test_server()->RegisterRequestHandler( | 1459 embedded_test_server()->RegisterRequestHandler( |
1449 base::Bind(&self::CustomRequestHandler, base::Unretained(this), | 1460 base::Bind(&self::CustomRequestHandler, base::Unretained(this), |
1450 relative_url, response)); | 1461 relative_url, response)); |
1451 } | 1462 } |
1452 | 1463 |
1453 void RegisterKeepSearchRedirect(const std::string& relative_url, | 1464 void RegisterKeepSearchRedirect(const std::string& relative_url, |
1454 const std::string& redirect_location) { | 1465 const std::string& redirect_location) { |
1455 embedded_test_server()->RegisterRequestHandler( | 1466 embedded_test_server()->RegisterRequestHandler( |
1456 base::Bind(&self::KeepSearchRedirectHandler, base::Unretained(this), | 1467 base::Bind(&self::KeepSearchRedirectHandler, base::Unretained(this), |
1457 relative_url, redirect_location)); | 1468 relative_url, redirect_location)); |
1458 } | 1469 } |
1459 | 1470 |
1460 int GetRequestCount(const std::string& relative_url) const { | 1471 int GetRequestCount(const std::string& relative_url) const { |
1461 int count = 0; | 1472 const auto& it = request_log_.find(relative_url); |
1462 for (const auto& request : request_log_) { | 1473 if (it == request_log_.end()) |
1463 if (request == relative_url) | 1474 return 0; |
1464 ++count; | 1475 return it->second.size(); |
1465 } | |
1466 return count; | |
1467 } | 1476 } |
1468 | 1477 |
1469 std::string GetTextContent() { | 1478 std::string GetTextContent() { |
1470 base::RunLoop run_loop; | 1479 base::RunLoop run_loop; |
1471 std::string text_content; | 1480 std::string text_content; |
1472 shell()->web_contents()->GetMainFrame()->ExecuteJavaScriptForTests( | 1481 shell()->web_contents()->GetMainFrame()->ExecuteJavaScriptForTests( |
1473 base::ASCIIToUTF16("document.body.textContent;"), | 1482 base::ASCIIToUTF16("document.body.textContent;"), |
1474 base::Bind(&StoreString, &text_content, run_loop.QuitClosure())); | 1483 base::Bind(&StoreString, &text_content, run_loop.QuitClosure())); |
1475 run_loop.Run(); | 1484 run_loop.Run(); |
1476 return text_content; | 1485 return text_content; |
1477 } | 1486 } |
1478 | 1487 |
1479 static const char kPreloadResponseTestScript[]; | 1488 std::map<std::string, std::vector<net::test_server::HttpRequest>> |
| 1489 request_log_; |
1480 | 1490 |
1481 private: | 1491 private: |
1482 class CustomResponse : public net::test_server::HttpResponse { | 1492 class CustomResponse : public net::test_server::HttpResponse { |
1483 public: | 1493 public: |
1484 CustomResponse(const std::string& response) : response_(response) {} | 1494 CustomResponse(const std::string& response) : response_(response) {} |
1485 ~CustomResponse() override {} | 1495 ~CustomResponse() override {} |
1486 | 1496 |
1487 void SendResponse( | 1497 void SendResponse( |
1488 const net::test_server::SendBytesCallback& send, | 1498 const net::test_server::SendBytesCallback& send, |
1489 const net::test_server::SendCompleteCallback& done) override { | 1499 const net::test_server::SendCompleteCallback& done) override { |
1490 send.Run(response_, done); | 1500 send.Run(response_, done); |
1491 } | 1501 } |
1492 | 1502 |
1493 private: | 1503 private: |
1494 const std::string response_; | 1504 const std::string response_; |
1495 | 1505 |
1496 DISALLOW_COPY_AND_ASSIGN(CustomResponse); | 1506 DISALLOW_COPY_AND_ASSIGN(CustomResponse); |
1497 }; | 1507 }; |
1498 | 1508 |
1499 void EnableNavigationPreloadOnIO(const GURL& scope, | |
1500 const base::Closure& continuation) { | |
1501 wrapper()->FindReadyRegistrationForDocument( | |
1502 scope, base::Bind(&self::DidFindRegistrationForEnableNavigationPreload, | |
1503 base::Unretained(this), continuation)); | |
1504 } | |
1505 | |
1506 void DidFindRegistrationForEnableNavigationPreload( | |
1507 const base::Closure& continuation, | |
1508 ServiceWorkerStatusCode status, | |
1509 scoped_refptr<ServiceWorkerRegistration> registration) { | |
1510 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
1511 ASSERT_TRUE(registration->active_version()); | |
1512 registration->EnableNavigationPreload(true); | |
1513 continuation.Run(); | |
1514 } | |
1515 | |
1516 std::unique_ptr<net::test_server::HttpResponse> StaticRequestHandler( | 1509 std::unique_ptr<net::test_server::HttpResponse> StaticRequestHandler( |
1517 const std::string& relative_url, | 1510 const std::string& relative_url, |
1518 const std::string& content, | 1511 const std::string& content, |
1519 const std::string& content_type, | 1512 const std::string& content_type, |
1520 const net::test_server::HttpRequest& request) const { | 1513 const net::test_server::HttpRequest& request) const { |
1521 const size_t query_position = request.relative_url.find('?'); | 1514 const size_t query_position = request.relative_url.find('?'); |
1522 if (request.relative_url.substr(0, query_position) != relative_url) | 1515 if (request.relative_url.substr(0, query_position) != relative_url) |
1523 return std::unique_ptr<net::test_server::HttpResponse>(); | 1516 return std::unique_ptr<net::test_server::HttpResponse>(); |
1524 std::unique_ptr<net::test_server::BasicHttpResponse> http_response( | 1517 std::unique_ptr<net::test_server::BasicHttpResponse> http_response( |
1525 base::MakeUnique<net::test_server::BasicHttpResponse>()); | 1518 base::MakeUnique<net::test_server::BasicHttpResponse>()); |
(...skipping 25 matching lines...) Expand all Loading... |
1551 response->set_code(net::HTTP_PERMANENT_REDIRECT); | 1544 response->set_code(net::HTTP_PERMANENT_REDIRECT); |
1552 response->AddCustomHeader( | 1545 response->AddCustomHeader( |
1553 "Location", | 1546 "Location", |
1554 query_position == std::string::npos | 1547 query_position == std::string::npos |
1555 ? redirect_location | 1548 ? redirect_location |
1556 : redirect_location + request.relative_url.substr(query_position)); | 1549 : redirect_location + request.relative_url.substr(query_position)); |
1557 return std::move(response); | 1550 return std::move(response); |
1558 } | 1551 } |
1559 | 1552 |
1560 void MonitorRequestHandler(const net::test_server::HttpRequest& request) { | 1553 void MonitorRequestHandler(const net::test_server::HttpRequest& request) { |
1561 request_log_.push_back(request.relative_url); | 1554 request_log_[request.relative_url].push_back(request); |
1562 } | 1555 } |
1563 | |
1564 std::vector<std::string> request_log_; | |
1565 }; | 1556 }; |
1566 | 1557 |
1567 const char ServiceWorkerNavigationPreloadTest::kPreloadResponseTestScript[] = | 1558 const std::string |
1568 "var preload_resolve;\n" | 1559 ServiceWorkerNavigationPreloadTest::kNavigationPreloadHeaderName( |
1569 "var preload_promise = new Promise(r => { preload_resolve = r; });\n" | 1560 "Service-Worker-Navigation-Preload"); |
1570 "self.addEventListener('fetch', event => {\n" | 1561 |
1571 " event.waitUntil(event.preloadResponse.then(\n" | 1562 const std::string |
1572 " r => {\n" | 1563 ServiceWorkerNavigationPreloadTest::kEnableNavigationPreloadScript( |
1573 " if (!r) {\n" | 1564 "self.addEventListener('install', event => {\n" |
1574 " preload_resolve(\n" | 1565 " event.waitUntil(self.registration.navigationPreload.enable());\n" |
1575 " {result: 'RESOLVED', info: 'Resolved with ' + r + '.'});\n" | 1566 " });\n"); |
1576 " return;\n" | 1567 |
1577 " }\n" | 1568 const std::string |
1578 " var info = {};\n" | 1569 ServiceWorkerNavigationPreloadTest::kPreloadResponseTestScript = |
1579 " info.type = r.type;\n" | 1570 "var preload_resolve;\n" |
1580 " info.url = r.url;\n" | 1571 "var preload_promise = new Promise(r => { preload_resolve = r; });\n" |
1581 " info.status = r.status;\n" | 1572 "self.addEventListener('fetch', event => {\n" |
1582 " info.ok = r.ok;\n" | 1573 " event.waitUntil(event.preloadResponse.then(\n" |
1583 " info.statusText = r.statusText;\n" | 1574 " r => {\n" |
1584 " info.headers = [];\n" | 1575 " if (!r) {\n" |
1585 " r.headers.forEach((v, n) => { info.headers.push([n,v]); });\n" | 1576 " preload_resolve(\n" |
1586 " preload_resolve({result: 'RESOLVED',\n" | 1577 " {result: 'RESOLVED', \n" |
1587 " info: JSON.stringify(info)}); },\n" | 1578 " info: 'Resolved with ' + r + '.'});\n" |
1588 " e => { preload_resolve({result: 'REJECTED',\n" | 1579 " return;\n" |
1589 " info: e.toString()}); }));\n" | 1580 " }\n" |
1590 " event.respondWith(\n" | 1581 " var info = {};\n" |
1591 " new Response(\n" | 1582 " info.type = r.type;\n" |
1592 " '<title>WAITING</title><script>\\n' +\n" | 1583 " info.url = r.url;\n" |
1593 " 'var channel = new MessageChannel();\\n' +\n" | 1584 " info.status = r.status;\n" |
1594 " 'channel.port1.onmessage = e => {\\n' +\n" | 1585 " info.ok = r.ok;\n" |
1595 " ' var div = document.createElement(\\'div\\');\\n' +\n" | 1586 " info.statusText = r.statusText;\n" |
1596 " ' div.appendChild(' +\n" | 1587 " info.headers = [];\n" |
1597 " ' document.createTextNode(e.data.info));\\n' +\n" | 1588 " r.headers.forEach(\n" |
1598 " ' document.body.appendChild(div);\\n' +\n" | 1589 " (v, n) => { info.headers.push([n,v]); });\n" |
1599 " ' document.title = e.data.result;\\n' +\n" | 1590 " preload_resolve({result: 'RESOLVED',\n" |
1600 " ' };\\n' +\n" | 1591 " info: JSON.stringify(info)}); },\n" |
1601 " 'navigator.serviceWorker.controller.postMessage(\\n' +\n" | 1592 " e => { preload_resolve({result: 'REJECTED',\n" |
1602 " ' {}, [channel.port2]);\\n' +\n" | 1593 " info: e.toString()}); }));\n" |
1603 " '</script>'," | 1594 " event.respondWith(\n" |
1604 " {headers: [['content-type', 'text/html']]}));\n" | 1595 " new Response(\n" |
1605 " });\n" | 1596 " '<title>WAITING</title><script>\\n' +\n" |
1606 "self.addEventListener('message', event => {\n" | 1597 " 'navigator.serviceWorker.onmessage = e => {\\n' +\n" |
1607 " event.waitUntil(\n" | 1598 " ' var div = document.createElement(\\'div\\');\\n' +\n" |
1608 " preload_promise.then(\n" | 1599 " ' div.appendChild(' +\n" |
1609 " result => event.ports[0].postMessage(result)));\n" | 1600 " ' document.createTextNode(e.data.info));\\n' +\n" |
1610 " });"; | 1601 " ' document.body.appendChild(div);\\n' +\n" |
| 1602 " ' document.title = e.data.result;\\n' +\n" |
| 1603 " ' };\\n' +\n" |
| 1604 " 'navigator.serviceWorker.controller.postMessage(\\n' +\n" |
| 1605 " ' null);\\n' +\n" |
| 1606 " '</script>'," |
| 1607 " {headers: [['content-type', 'text/html']]}));\n" |
| 1608 " });\n" |
| 1609 "self.addEventListener('message', event => {\n" |
| 1610 " event.waitUntil(\n" |
| 1611 " preload_promise.then(\n" |
| 1612 " result => event.source.postMessage(result)));\n" |
| 1613 " });"; |
1611 | 1614 |
1612 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, NetworkFallback) { | 1615 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, NetworkFallback) { |
1613 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1616 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1614 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1617 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1615 const char kPage[] = "<title>PASS</title>Hello world."; | 1618 const char kPage[] = "<title>PASS</title>Hello world."; |
1616 const char kScript[] = | 1619 const std::string kScript = kEnableNavigationPreloadScript + |
1617 "self.addEventListener('fetch', event => {\n" | 1620 "self.addEventListener('fetch', event => {\n" |
1618 " // Do nothing.\n" | 1621 " // Do nothing.\n" |
1619 " });"; | 1622 " });"; |
1620 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1623 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1621 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1624 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1622 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1625 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1623 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | 1626 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
1624 | 1627 |
1625 SetupForNavigationPreloadTest(page_url, worker_url, | 1628 SetupForNavigationPreloadTest(page_url, worker_url); |
1626 true /* enable_navigation_preload */); | |
1627 | 1629 |
1628 const base::string16 title = base::ASCIIToUTF16("PASS"); | 1630 const base::string16 title = base::ASCIIToUTF16("PASS"); |
1629 TitleWatcher title_watcher(shell()->web_contents(), title); | 1631 TitleWatcher title_watcher(shell()->web_contents(), title); |
1630 NavigateToURL(shell(), page_url); | 1632 NavigateToURL(shell(), page_url); |
1631 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1633 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1632 EXPECT_EQ("Hello world.", GetTextContent()); | 1634 EXPECT_EQ("Hello world.", GetTextContent()); |
1633 | 1635 |
1634 // The page request must be sent twice. Once for navigation preload, and once | 1636 // The page request must be sent twice. Once for navigation preload, and once |
1635 // for fallback since respondWith wasn't used. | 1637 // for fallback since respondWith wasn't used. |
1636 EXPECT_EQ(2, GetRequestCount(kPageUrl)); | 1638 ASSERT_EQ(2, GetRequestCount(kPageUrl)); |
1637 // TODO(horo): Check "Service-Worker-Navigation-Preload" header. | 1639 ASSERT_TRUE(HasNavigationPreloadHeader(request_log_[kPageUrl][0])); |
1638 // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270 | 1640 EXPECT_EQ("true", GetNavigationPreloadHeader(request_log_[kPageUrl][0])); |
| 1641 EXPECT_FALSE(HasNavigationPreloadHeader(request_log_[kPageUrl][1])); |
| 1642 } |
| 1643 |
| 1644 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, SetHeaderValue) { |
| 1645 const std::string kPageUrl = "/service_worker/navigation_preload.html"; |
| 1646 const std::string kWorkerUrl = "/service_worker/navigation_preload.js"; |
| 1647 const std::string kPage = "<title>FROM_SERVER</title>"; |
| 1648 const std::string kScript = |
| 1649 "function createResponse(title, body) {\n" |
| 1650 " return new Response('<title>' + title + '</title>' + body,\n" |
| 1651 " {headers: [['content-type', 'text/html']]})\n" |
| 1652 "}\n" |
| 1653 "self.addEventListener('fetch', event => {\n" |
| 1654 " if (event.request.url.indexOf('?enable') != -1) {\n" |
| 1655 " event.respondWith(\n" |
| 1656 " self.registration.navigationPreload.enable()\n" |
| 1657 " .then(_ => event.preloadResponse)\n" |
| 1658 " .then(res => createResponse('ENABLED', res)));\n" |
| 1659 " } else if (event.request.url.indexOf('?change') != -1) {\n" |
| 1660 " event.respondWith(\n" |
| 1661 " self.registration.navigationPreload.setHeaderValue('Hello')\n" |
| 1662 " .then(_ => event.preloadResponse)\n" |
| 1663 " .then(res => createResponse('CHANGED', res)));\n" |
| 1664 " } else if (event.request.url.indexOf('?disable') != -1) {\n" |
| 1665 " event.respondWith(\n" |
| 1666 " self.registration.navigationPreload.disable()\n" |
| 1667 " .then(_ => event.preloadResponse)\n" |
| 1668 " .then(res => createResponse('DISABLED', res)));\n" |
| 1669 " } else if (event.request.url.indexOf('?test') != -1) {\n" |
| 1670 " event.respondWith(event.preloadResponse.then(res =>\n" |
| 1671 " createResponse('TEST', res)));\n" |
| 1672 " }\n" |
| 1673 " });"; |
| 1674 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
| 1675 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
| 1676 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
| 1677 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
| 1678 |
| 1679 SetupForNavigationPreloadTest(page_url, worker_url); |
| 1680 |
| 1681 const std::string kPageUrl1 = kPageUrl + "?enable"; |
| 1682 const base::string16 title1 = base::ASCIIToUTF16("ENABLED"); |
| 1683 TitleWatcher title_watcher1(shell()->web_contents(), title1); |
| 1684 title_watcher1.AlsoWaitForTitle(base::ASCIIToUTF16("FROM_SERVER")); |
| 1685 NavigateToURL(shell(), embedded_test_server()->GetURL(kPageUrl1)); |
| 1686 EXPECT_EQ(title1, title_watcher1.WaitAndGetTitle()); |
| 1687 // When the navigation started, the navigation preload was not enabled yet. |
| 1688 EXPECT_EQ("null", GetTextContent()); |
| 1689 ASSERT_EQ(0, GetRequestCount(kPageUrl1)); |
| 1690 |
| 1691 const std::string kPageUrl2 = kPageUrl + "?change"; |
| 1692 const base::string16 title2 = base::ASCIIToUTF16("CHANGED"); |
| 1693 TitleWatcher title_watcher2(shell()->web_contents(), title2); |
| 1694 title_watcher2.AlsoWaitForTitle(base::ASCIIToUTF16("FROM_SERVER")); |
| 1695 NavigateToURL(shell(), embedded_test_server()->GetURL(kPageUrl2)); |
| 1696 EXPECT_EQ(title2, title_watcher2.WaitAndGetTitle()); |
| 1697 // When the navigation started, the navigation preload was enabled, but the |
| 1698 // header was not changed yet. |
| 1699 EXPECT_EQ("[object Response]", GetTextContent()); |
| 1700 ASSERT_EQ(1, GetRequestCount(kPageUrl2)); |
| 1701 ASSERT_TRUE(HasNavigationPreloadHeader(request_log_[kPageUrl2][0])); |
| 1702 EXPECT_EQ("true", GetNavigationPreloadHeader(request_log_[kPageUrl2][0])); |
| 1703 |
| 1704 const std::string kPageUrl3 = kPageUrl + "?disable"; |
| 1705 const base::string16 title3 = base::ASCIIToUTF16("DISABLED"); |
| 1706 TitleWatcher title_watcher3(shell()->web_contents(), title3); |
| 1707 title_watcher3.AlsoWaitForTitle(base::ASCIIToUTF16("FROM_SERVER")); |
| 1708 NavigateToURL(shell(), embedded_test_server()->GetURL(kPageUrl3)); |
| 1709 EXPECT_EQ(title3, title_watcher3.WaitAndGetTitle()); |
| 1710 // When the navigation started, the navigation preload was not disabled yet. |
| 1711 EXPECT_EQ("[object Response]", GetTextContent()); |
| 1712 ASSERT_EQ(1, GetRequestCount(kPageUrl3)); |
| 1713 ASSERT_TRUE(HasNavigationPreloadHeader(request_log_[kPageUrl3][0])); |
| 1714 EXPECT_EQ("Hello", GetNavigationPreloadHeader(request_log_[kPageUrl3][0])); |
| 1715 |
| 1716 const std::string kPageUrl4 = kPageUrl + "?test"; |
| 1717 const base::string16 title4 = base::ASCIIToUTF16("TEST"); |
| 1718 TitleWatcher title_watcher4(shell()->web_contents(), title4); |
| 1719 title_watcher4.AlsoWaitForTitle(base::ASCIIToUTF16("FROM_SERVER")); |
| 1720 NavigateToURL(shell(), embedded_test_server()->GetURL(kPageUrl4)); |
| 1721 EXPECT_EQ(title4, title_watcher4.WaitAndGetTitle()); |
| 1722 // When the navigation started, the navigation preload must be disabled. |
| 1723 EXPECT_EQ("null", GetTextContent()); |
| 1724 ASSERT_EQ(0, GetRequestCount(kPageUrl4)); |
1639 } | 1725 } |
1640 | 1726 |
1641 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, | 1727 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
1642 RespondWithNavigationPreload) { | 1728 RespondWithNavigationPreload) { |
1643 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1729 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1644 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1730 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1645 const char kPage[] = "<title>PASS</title>Hello world."; | 1731 const char kPage[] = "<title>PASS</title>Hello world."; |
1646 const char kScript[] = | 1732 const std::string kScript = |
| 1733 kEnableNavigationPreloadScript + |
1647 "self.addEventListener('fetch', event => {\n" | 1734 "self.addEventListener('fetch', event => {\n" |
1648 " if (!event.preloadResponse) {\n" | 1735 " if (!event.preloadResponse) {\n" |
1649 " event.respondWith(\n" | 1736 " event.respondWith(\n" |
1650 " new Response('<title>ERROR</title>'," | 1737 " new Response('<title>ERROR</title>'," |
1651 " {headers: [['content-type', 'text/html']]}));\n" | 1738 " {headers: [['content-type', 'text/html']]}));\n" |
1652 " return;\n" | 1739 " return;\n" |
1653 " }\n" | 1740 " }\n" |
1654 " event.respondWith(event.preloadResponse);\n" | 1741 " event.respondWith(event.preloadResponse);\n" |
1655 " });"; | 1742 " });"; |
1656 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1743 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1657 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1744 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1658 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1745 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1659 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | 1746 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
1660 | 1747 |
1661 SetupForNavigationPreloadTest(page_url, worker_url, | 1748 SetupForNavigationPreloadTest(page_url, worker_url); |
1662 true /* enable_navigation_preload */); | |
1663 | 1749 |
1664 const base::string16 title = base::ASCIIToUTF16("PASS"); | 1750 const base::string16 title = base::ASCIIToUTF16("PASS"); |
1665 TitleWatcher title_watcher(shell()->web_contents(), title); | 1751 TitleWatcher title_watcher(shell()->web_contents(), title); |
1666 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | 1752 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); |
1667 NavigateToURL(shell(), page_url); | 1753 NavigateToURL(shell(), page_url); |
1668 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1754 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1669 EXPECT_EQ("Hello world.", GetTextContent()); | 1755 EXPECT_EQ("Hello world.", GetTextContent()); |
1670 | 1756 |
1671 // The page request must be sent only once, since the worker responded with | 1757 // The page request must be sent only once, since the worker responded with |
1672 // the navigation preload response | 1758 // the navigation preload response |
1673 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 1759 ASSERT_EQ(1, GetRequestCount(kPageUrl)); |
1674 // TODO(horo): Check "Service-Worker-Navigation-Preload" header. | 1760 EXPECT_EQ("true", |
1675 // See: https://github.com/w3c/ServiceWorker/issues/920#issuecomment-251150270 | 1761 request_log_[kPageUrl][0].headers[kNavigationPreloadHeaderName]); |
1676 } | 1762 } |
1677 | 1763 |
1678 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, GetResponseText) { | 1764 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, GetResponseText) { |
1679 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1765 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1680 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1766 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1681 const char kPage[] = "<title>PASS</title>Hello world."; | 1767 const char kPage[] = "<title>PASS</title>Hello world."; |
1682 const char kScript[] = | 1768 const std::string kScript = |
| 1769 kEnableNavigationPreloadScript + |
1683 "self.addEventListener('fetch', event => {\n" | 1770 "self.addEventListener('fetch', event => {\n" |
1684 " event.respondWith(\n" | 1771 " event.respondWith(\n" |
1685 " event.preloadResponse\n" | 1772 " event.preloadResponse\n" |
1686 " .then(response => response.text())\n" | 1773 " .then(response => response.text())\n" |
1687 " .then(text =>\n" | 1774 " .then(text =>\n" |
1688 " new Response(\n" | 1775 " new Response(\n" |
1689 " text,\n" | 1776 " text,\n" |
1690 " {headers: [['content-type', 'text/html']]})));\n" | 1777 " {headers: [['content-type', 'text/html']]})));\n" |
1691 " });"; | 1778 " });"; |
1692 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1779 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1693 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1780 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1694 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1781 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1695 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | 1782 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
1696 | 1783 |
1697 SetupForNavigationPreloadTest(page_url, worker_url, | 1784 SetupForNavigationPreloadTest(page_url, worker_url); |
1698 true /* enable_navigation_preload */); | |
1699 | 1785 |
1700 const base::string16 title = base::ASCIIToUTF16("PASS"); | 1786 const base::string16 title = base::ASCIIToUTF16("PASS"); |
1701 TitleWatcher title_watcher(shell()->web_contents(), title); | 1787 TitleWatcher title_watcher(shell()->web_contents(), title); |
1702 NavigateToURL(shell(), page_url); | 1788 NavigateToURL(shell(), page_url); |
1703 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1789 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1704 EXPECT_EQ("Hello world.", GetTextContent()); | 1790 EXPECT_EQ("Hello world.", GetTextContent()); |
1705 | 1791 |
1706 // The page request must be sent only once, since the worker responded with | 1792 // The page request must be sent only once, since the worker responded with |
1707 // "Hello world". | 1793 // "Hello world". |
1708 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 1794 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
1709 } | 1795 } |
1710 | 1796 |
1711 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, | 1797 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
1712 AbortPreloadRequest) { | 1798 AbortPreloadRequest) { |
1713 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1799 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1714 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1800 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1715 const char kPage[] = "<title>ERROR</title>Hello world."; | 1801 const char kPage[] = "<title>ERROR</title>Hello world."; |
1716 // In this script, event.preloadResponse is not guarded by event.waitUntil. | 1802 // In this script, event.preloadResponse is not guarded by event.waitUntil. |
1717 // So the preload request should be canceled, when the fetch event handler | 1803 // So the preload request should be canceled, when the fetch event handler |
1718 // has been executed. | 1804 // has been executed. |
1719 const char kScript[] = | 1805 const std::string kScript = |
| 1806 kEnableNavigationPreloadScript + |
1720 "var preload_resolve;\n" | 1807 "var preload_resolve;\n" |
1721 "var preload_promise = new Promise(r => { preload_resolve = r; });\n" | 1808 "var preload_promise = new Promise(r => { preload_resolve = r; });\n" |
1722 "self.addEventListener('fetch', event => {\n" | 1809 "self.addEventListener('fetch', event => {\n" |
1723 " event.preloadResponse.then(\n" | 1810 " event.preloadResponse.then(\n" |
1724 " _ => { preload_resolve({result: 'RESOLVED',\n" | 1811 " _ => { preload_resolve({result: 'RESOLVED',\n" |
1725 " info: 'Preload resolved.'}); },\n" | 1812 " info: 'Preload resolved.'}); },\n" |
1726 " e => { preload_resolve({result: 'REJECTED',\n" | 1813 " e => { preload_resolve({result: 'REJECTED',\n" |
1727 " info: e.toString()}); });\n" | 1814 " info: e.toString()}); });\n" |
1728 " event.respondWith(\n" | 1815 " event.respondWith(\n" |
1729 " new Response(\n" | 1816 " new Response(\n" |
1730 " '<title>WAITING</title><script>\\n' +\n" | 1817 " '<title>WAITING</title><script>\\n' +\n" |
1731 " 'var channel = new MessageChannel();\\n' +\n" | 1818 " 'navigator.serviceWorker.onmessage = e => {\\n' +\n" |
1732 " 'channel.port1.onmessage = e => {\\n' +\n" | |
1733 " ' var div = document.createElement(\\'div\\');\\n' +\n" | 1819 " ' var div = document.createElement(\\'div\\');\\n' +\n" |
1734 " ' div.appendChild(' +\n" | 1820 " ' div.appendChild(' +\n" |
1735 " ' document.createTextNode(e.data.info));\\n' +\n" | 1821 " ' document.createTextNode(e.data.info));\\n' +\n" |
1736 " ' document.body.appendChild(div);\\n' +\n" | 1822 " ' document.body.appendChild(div);\\n' +\n" |
1737 " ' document.title = e.data.result;\\n' +\n" | 1823 " ' document.title = e.data.result;\\n' +\n" |
1738 " ' };\\n' +\n" | 1824 " ' };\\n' +\n" |
1739 " 'navigator.serviceWorker.controller.postMessage(\\n' +\n" | 1825 " 'navigator.serviceWorker.controller.postMessage(\\n' +\n" |
1740 " ' {}, [channel.port2]);\\n' +\n" | 1826 " ' null);\\n' +\n" |
1741 " '</script>'," | 1827 " '</script>'," |
1742 " {headers: [['content-type', 'text/html']]}));\n" | 1828 " {headers: [['content-type', 'text/html']]}));\n" |
1743 " });\n" | 1829 " });\n" |
1744 "self.addEventListener('message', event => {\n" | 1830 "self.addEventListener('message', event => {\n" |
1745 " event.waitUntil(\n" | 1831 " event.waitUntil(\n" |
1746 " preload_promise.then(\n" | 1832 " preload_promise.then(\n" |
1747 " result => event.ports[0].postMessage(result)));\n" | 1833 " result => event.source.postMessage(result)));\n" |
1748 " });"; | 1834 " });"; |
1749 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1835 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1750 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1836 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1751 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1837 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1752 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | 1838 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
1753 | 1839 |
1754 SetupForNavigationPreloadTest(page_url, worker_url, | 1840 SetupForNavigationPreloadTest(page_url, worker_url); |
1755 true /* enable_navigation_preload */); | |
1756 | 1841 |
1757 const base::string16 title = base::ASCIIToUTF16("REJECTED"); | 1842 const base::string16 title = base::ASCIIToUTF16("REJECTED"); |
1758 TitleWatcher title_watcher(shell()->web_contents(), title); | 1843 TitleWatcher title_watcher(shell()->web_contents(), title); |
1759 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); | 1844 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); |
1760 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | 1845 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); |
1761 NavigateToURL(shell(), page_url); | 1846 NavigateToURL(shell(), page_url); |
1762 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1847 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1763 | 1848 |
1764 EXPECT_EQ( | 1849 EXPECT_EQ( |
1765 "AbortError: Service Worker navigation preload aborted. Need to guard " | 1850 "AbortError: Service Worker navigation preload aborted. Need to guard " |
1766 "with respondWith or waitUntil.", | 1851 "with respondWith or waitUntil.", |
1767 GetTextContent()); | 1852 GetTextContent()); |
1768 } | 1853 } |
1769 | 1854 |
1770 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, NetworkError) { | 1855 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, NetworkError) { |
1771 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1856 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1772 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1857 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1773 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1858 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1774 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1859 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1775 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); | 1860 RegisterStaticFile( |
| 1861 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
| 1862 "text/javascript"); |
1776 | 1863 |
1777 SetupForNavigationPreloadTest(page_url, worker_url, | 1864 SetupForNavigationPreloadTest(page_url, worker_url); |
1778 true /* enable_navigation_preload */); | |
1779 | 1865 |
1780 EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); | 1866 EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); |
1781 | 1867 |
1782 const base::string16 title = base::ASCIIToUTF16("REJECTED"); | 1868 const base::string16 title = base::ASCIIToUTF16("REJECTED"); |
1783 TitleWatcher title_watcher(shell()->web_contents(), title); | 1869 TitleWatcher title_watcher(shell()->web_contents(), title); |
1784 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); | 1870 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); |
1785 NavigateToURL(shell(), page_url); | 1871 NavigateToURL(shell(), page_url); |
1786 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1872 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1787 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", | 1873 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", |
1788 GetTextContent()); | 1874 GetTextContent()); |
1789 } | 1875 } |
1790 | 1876 |
1791 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, | 1877 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
1792 PreloadHeadersSimple) { | 1878 PreloadHeadersSimple) { |
1793 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1879 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1794 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1880 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1795 const char kPage[] = "<title>ERROR</title>Hello world."; | 1881 const char kPage[] = "<title>ERROR</title>Hello world."; |
1796 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1882 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1797 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1883 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1798 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1884 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1799 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); | 1885 RegisterStaticFile( |
| 1886 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
| 1887 "text/javascript"); |
1800 | 1888 |
1801 SetupForNavigationPreloadTest(page_url, worker_url, | 1889 SetupForNavigationPreloadTest(page_url, worker_url); |
1802 true /* enable_navigation_preload */); | |
1803 | 1890 |
1804 const base::string16 title = base::ASCIIToUTF16("RESOLVED"); | 1891 const base::string16 title = base::ASCIIToUTF16("RESOLVED"); |
1805 TitleWatcher title_watcher(shell()->web_contents(), title); | 1892 TitleWatcher title_watcher(shell()->web_contents(), title); |
1806 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); | 1893 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); |
1807 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | 1894 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); |
1808 NavigateToURL(shell(), page_url); | 1895 NavigateToURL(shell(), page_url); |
1809 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1896 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1810 | 1897 |
1811 // The page request must be sent only once, since the worker responded with | 1898 // The page request must be sent only once, since the worker responded with |
1812 // a generated Response. | 1899 // a generated Response. |
(...skipping 14 matching lines...) Expand all Loading... |
1827 | 1914 |
1828 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, NotEnabled) { | 1915 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, NotEnabled) { |
1829 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 1916 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
1830 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 1917 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1831 const char kPage[] = "<title>ERROR</title>Hello world."; | 1918 const char kPage[] = "<title>ERROR</title>Hello world."; |
1832 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1919 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1833 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1920 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1834 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 1921 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1835 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); | 1922 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); |
1836 | 1923 |
1837 SetupForNavigationPreloadTest(page_url, worker_url, | 1924 SetupForNavigationPreloadTest(page_url, worker_url); |
1838 false /* enable_navigation_preload */); | |
1839 | 1925 |
1840 const base::string16 title = base::ASCIIToUTF16("RESOLVED"); | 1926 const base::string16 title = base::ASCIIToUTF16("RESOLVED"); |
1841 TitleWatcher title_watcher(shell()->web_contents(), title); | 1927 TitleWatcher title_watcher(shell()->web_contents(), title); |
1842 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); | 1928 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); |
1843 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | 1929 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); |
1844 NavigateToURL(shell(), page_url); | 1930 NavigateToURL(shell(), page_url); |
1845 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1931 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1846 | 1932 |
1847 // The page request must not be sent, since the worker responded with a | 1933 // The page request must not be sent, since the worker responded with a |
1848 // generated Response and the navigation preload isn't enabled. | 1934 // generated Response and the navigation preload isn't enabled. |
(...skipping 12 matching lines...) Expand all Loading... |
1861 "Content-Type: text/html\r\n" | 1947 "Content-Type: text/html\r\n" |
1862 "Custom-Header: pen pineapple\r\n" | 1948 "Custom-Header: pen pineapple\r\n" |
1863 "Custom-Header: apple pen\r\n" | 1949 "Custom-Header: apple pen\r\n" |
1864 "Set-Cookie: COOKIE1\r\n" | 1950 "Set-Cookie: COOKIE1\r\n" |
1865 "Set-Cookie2: COOKIE2\r\n" | 1951 "Set-Cookie2: COOKIE2\r\n" |
1866 "\r\n" | 1952 "\r\n" |
1867 "<title>ERROR</title>Hello world."; | 1953 "<title>ERROR</title>Hello world."; |
1868 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 1954 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1869 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 1955 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1870 RegisterCustomResponse(kPageUrl, kPageResponse); | 1956 RegisterCustomResponse(kPageUrl, kPageResponse); |
1871 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); | 1957 RegisterStaticFile( |
| 1958 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
| 1959 "text/javascript"); |
1872 | 1960 |
1873 SetupForNavigationPreloadTest(page_url, worker_url, | 1961 SetupForNavigationPreloadTest(page_url, worker_url); |
1874 true /* enable_navigation_preload */); | |
1875 | 1962 |
1876 const base::string16 title = base::ASCIIToUTF16("RESOLVED"); | 1963 const base::string16 title = base::ASCIIToUTF16("RESOLVED"); |
1877 TitleWatcher title_watcher(shell()->web_contents(), title); | 1964 TitleWatcher title_watcher(shell()->web_contents(), title); |
1878 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); | 1965 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("REJECTED")); |
1879 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); | 1966 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("ERROR")); |
1880 NavigateToURL(shell(), page_url); | 1967 NavigateToURL(shell(), page_url); |
1881 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 1968 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1882 | 1969 |
1883 // The page request must be sent only once, since the worker responded with | 1970 // The page request must be sent only once, since the worker responded with |
1884 // a generated Response. | 1971 // a generated Response. |
(...skipping 24 matching lines...) Expand all Loading... |
1909 "HTTP/1.1 302 Found\r\n" | 1996 "HTTP/1.1 302 Found\r\n" |
1910 "Connection: close\r\n" | 1997 "Connection: close\r\n" |
1911 "Location: /service_worker/navigation_preload_redirected.html\r\n" | 1998 "Location: /service_worker/navigation_preload_redirected.html\r\n" |
1912 "\r\n"; | 1999 "\r\n"; |
1913 const char kRedirectedPage[] = "<title>ERROR</title>Redirected page."; | 2000 const char kRedirectedPage[] = "<title>ERROR</title>Redirected page."; |
1914 const GURL redirecred_page_url = | 2001 const GURL redirecred_page_url = |
1915 embedded_test_server()->GetURL(kRedirectedPageUrl); | 2002 embedded_test_server()->GetURL(kRedirectedPageUrl); |
1916 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 2003 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1917 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 2004 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1918 RegisterCustomResponse(kPageUrl, kPageResponse); | 2005 RegisterCustomResponse(kPageUrl, kPageResponse); |
1919 RegisterStaticFile(kWorkerUrl, kPreloadResponseTestScript, "text/javascript"); | 2006 RegisterStaticFile( |
| 2007 kWorkerUrl, kEnableNavigationPreloadScript + kPreloadResponseTestScript, |
| 2008 "text/javascript"); |
1920 RegisterStaticFile(kRedirectedPageUrl, kRedirectedPage, "text/html"); | 2009 RegisterStaticFile(kRedirectedPageUrl, kRedirectedPage, "text/html"); |
1921 | 2010 |
1922 SetupForNavigationPreloadTest(page_url, worker_url, | 2011 SetupForNavigationPreloadTest(page_url, worker_url); |
1923 true /* enable_navigation_preload */); | |
1924 | 2012 |
1925 const base::string16 title = base::ASCIIToUTF16("REJECTED"); | 2013 const base::string16 title = base::ASCIIToUTF16("REJECTED"); |
1926 TitleWatcher title_watcher(shell()->web_contents(), title); | 2014 TitleWatcher title_watcher(shell()->web_contents(), title); |
1927 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); | 2015 title_watcher.AlsoWaitForTitle(base::ASCIIToUTF16("RESOLVED")); |
1928 NavigateToURL(shell(), page_url); | 2016 NavigateToURL(shell(), page_url); |
1929 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 2017 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
1930 | 2018 |
1931 // The page request must be sent only once, since the worker responded with | 2019 // The page request must be sent only once, since the worker responded with |
1932 // a generated Response. | 2020 // a generated Response. |
1933 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 2021 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
1934 // The redirected request must not be sent. | 2022 // The redirected request must not be sent. |
1935 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl)); | 2023 EXPECT_EQ(0, GetRequestCount(kRedirectedPageUrl)); |
1936 // TODO(horo): When MojoAsyncResourceHandler will support redirection, we | 2024 // TODO(horo): When MojoAsyncResourceHandler will support redirection, we |
1937 // shold provide more specific error message. | 2025 // shold provide more specific error message. |
1938 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", | 2026 EXPECT_EQ("NetworkError: Service Worker navigation preload network error.", |
1939 GetTextContent()); | 2027 GetTextContent()); |
1940 } | 2028 } |
1941 | 2029 |
1942 // Tests responding with the navigation preload response when the navigation | 2030 // Tests responding with the navigation preload response when the navigation |
1943 // occurred after a redirect. | 2031 // occurred after a redirect. |
1944 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, | 2032 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
1945 RedirectAndRespondWithNavigationPreload) { | 2033 RedirectAndRespondWithNavigationPreload) { |
1946 const std::string kPageUrl = "/service_worker/navigation_preload.html"; | 2034 const std::string kPageUrl = "/service_worker/navigation_preload.html"; |
1947 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 2035 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
1948 const char kPage[] = | 2036 const char kPage[] = |
1949 "<title></title>\n" | 2037 "<title></title>\n" |
1950 "<script>document.title = document.location.search;</script>"; | 2038 "<script>document.title = document.location.search;</script>"; |
1951 const char kScript[] = | 2039 const std::string kScript = |
| 2040 kEnableNavigationPreloadScript + |
1952 "self.addEventListener('fetch', event => {\n" | 2041 "self.addEventListener('fetch', event => {\n" |
1953 " if (event.request.url.indexOf('navigation_preload.html') == -1)\n" | 2042 " if (event.request.url.indexOf('navigation_preload.html') == -1)\n" |
1954 " return; // For in scope redirection.\n" | 2043 " return; // For in scope redirection.\n" |
1955 " event.respondWith(event.preloadResponse);\n" | 2044 " event.respondWith(event.preloadResponse);\n" |
1956 " });"; | 2045 " });"; |
1957 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 2046 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
1958 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 2047 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
1959 RegisterStaticFile(kPageUrl, kPage, "text/html"); | 2048 RegisterStaticFile(kPageUrl, kPage, "text/html"); |
1960 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | 2049 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
1961 | 2050 |
1962 // Register redirects to the target URL. The service worker responds to the | 2051 // Register redirects to the target URL. The service worker responds to the |
1963 // target URL with the navigation preload response. | 2052 // target URL with the navigation preload response. |
1964 const char kRedirectPageUrl[] = "/redirect"; | 2053 const char kRedirectPageUrl[] = "/redirect"; |
1965 const char kInScopeRedirectPageUrl[] = "/service_worker/redirect"; | 2054 const char kInScopeRedirectPageUrl[] = "/service_worker/redirect"; |
1966 RegisterKeepSearchRedirect(kRedirectPageUrl, page_url.spec()); | 2055 RegisterKeepSearchRedirect(kRedirectPageUrl, page_url.spec()); |
1967 RegisterKeepSearchRedirect(kInScopeRedirectPageUrl, page_url.spec()); | 2056 RegisterKeepSearchRedirect(kInScopeRedirectPageUrl, page_url.spec()); |
1968 | 2057 |
1969 SetupForNavigationPreloadTest( | 2058 SetupForNavigationPreloadTest( |
1970 embedded_test_server()->GetURL("/service_worker/"), worker_url, | 2059 embedded_test_server()->GetURL("/service_worker/"), worker_url); |
1971 true /* enable_navigation_preload */); | |
1972 | 2060 |
1973 const GURL redirect_page_url = | 2061 const GURL redirect_page_url = |
1974 embedded_test_server()->GetURL(kRedirectPageUrl).Resolve("?1"); | 2062 embedded_test_server()->GetURL(kRedirectPageUrl).Resolve("?1"); |
1975 const GURL in_scope_redirect_page_url = | 2063 const GURL in_scope_redirect_page_url = |
1976 embedded_test_server()->GetURL(kInScopeRedirectPageUrl).Resolve("?2"); | 2064 embedded_test_server()->GetURL(kInScopeRedirectPageUrl).Resolve("?2"); |
1977 const GURL cross_origin_redirect_page_url = | 2065 const GURL cross_origin_redirect_page_url = |
1978 embedded_test_server()->GetURL("a.com", kRedirectPageUrl).Resolve("?3"); | 2066 embedded_test_server()->GetURL("a.com", kRedirectPageUrl).Resolve("?3"); |
1979 | 2067 |
1980 // Navigate to a same-origin, out of scope URL that redirects to the target | 2068 // Navigate to a same-origin, out of scope URL that redirects to the target |
1981 // URL. The navigation preload request should be the single request to the | 2069 // URL. The navigation preload request should be the single request to the |
(...skipping 25 matching lines...) Expand all Loading... |
2007 // When the content type of the page is not correctly set, | 2095 // When the content type of the page is not correctly set, |
2008 // OnStartLoadingResponseBody() of mojom::URLLoaderClient is called before | 2096 // OnStartLoadingResponseBody() of mojom::URLLoaderClient is called before |
2009 // OnReceiveResponse(). This behavior is caused by MimeSniffingResourceHandler. | 2097 // OnReceiveResponse(). This behavior is caused by MimeSniffingResourceHandler. |
2010 // This test checks that even if the MimeSniffingResourceHandler is triggered | 2098 // This test checks that even if the MimeSniffingResourceHandler is triggered |
2011 // navigation preload must be handled correctly. | 2099 // navigation preload must be handled correctly. |
2012 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, | 2100 IN_PROC_BROWSER_TEST_P(ServiceWorkerNavigationPreloadTest, |
2013 RespondWithNavigationPreloadWithMimeSniffing) { | 2101 RespondWithNavigationPreloadWithMimeSniffing) { |
2014 const char kPageUrl[] = "/service_worker/navigation_preload.html"; | 2102 const char kPageUrl[] = "/service_worker/navigation_preload.html"; |
2015 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; | 2103 const char kWorkerUrl[] = "/service_worker/navigation_preload.js"; |
2016 const char kPage[] = "<title>PASS</title>Hello world."; | 2104 const char kPage[] = "<title>PASS</title>Hello world."; |
2017 const char kScript[] = | 2105 const std::string kScript = kEnableNavigationPreloadScript + |
2018 "self.addEventListener('fetch', event => {\n" | 2106 "self.addEventListener('fetch', event => {\n" |
2019 " event.respondWith(event.preloadResponse);\n" | 2107 " event.respondWith(event.preloadResponse);\n" |
2020 " });"; | 2108 " });"; |
2021 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); | 2109 const GURL page_url = embedded_test_server()->GetURL(kPageUrl); |
2022 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); | 2110 const GURL worker_url = embedded_test_server()->GetURL(kWorkerUrl); |
2023 | 2111 |
2024 // Setting an empty content type to trigger MimeSniffingResourceHandler. | 2112 // Setting an empty content type to trigger MimeSniffingResourceHandler. |
2025 RegisterStaticFile(kPageUrl, kPage, ""); | 2113 RegisterStaticFile(kPageUrl, kPage, ""); |
2026 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); | 2114 RegisterStaticFile(kWorkerUrl, kScript, "text/javascript"); |
2027 | 2115 |
2028 SetupForNavigationPreloadTest(page_url, worker_url, | 2116 SetupForNavigationPreloadTest(page_url, worker_url); |
2029 true /* enable_navigation_preload */); | |
2030 | 2117 |
2031 const base::string16 title = base::ASCIIToUTF16("PASS"); | 2118 const base::string16 title = base::ASCIIToUTF16("PASS"); |
2032 TitleWatcher title_watcher(shell()->web_contents(), title); | 2119 TitleWatcher title_watcher(shell()->web_contents(), title); |
2033 NavigateToURL(shell(), page_url); | 2120 NavigateToURL(shell(), page_url); |
2034 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); | 2121 EXPECT_EQ(title, title_watcher.WaitAndGetTitle()); |
2035 EXPECT_EQ("Hello world.", GetTextContent()); | 2122 EXPECT_EQ("Hello world.", GetTextContent()); |
2036 | 2123 |
2037 // The page request must be sent only once, since the worker responded with | 2124 // The page request must be sent only once, since the worker responded with |
2038 // the navigation preload response | 2125 // the navigation preload response |
2039 EXPECT_EQ(1, GetRequestCount(kPageUrl)); | 2126 EXPECT_EQ(1, GetRequestCount(kPageUrl)); |
(...skipping 710 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2750 ServiceWorkerV8CacheStrategiesNormalTest, | 2837 ServiceWorkerV8CacheStrategiesNormalTest, |
2751 ::testing::Values(true, false)); | 2838 ::testing::Values(true, false)); |
2752 INSTANTIATE_TEST_CASE_P(ServiceWorkerBrowserTest, | 2839 INSTANTIATE_TEST_CASE_P(ServiceWorkerBrowserTest, |
2753 ServiceWorkerV8CacheStrategiesAggressiveTest, | 2840 ServiceWorkerV8CacheStrategiesAggressiveTest, |
2754 ::testing::Values(true, false)); | 2841 ::testing::Values(true, false)); |
2755 INSTANTIATE_TEST_CASE_P(ServiceWorkerBrowserTest, | 2842 INSTANTIATE_TEST_CASE_P(ServiceWorkerBrowserTest, |
2756 ServiceWorkerDisableWebSecurityTest, | 2843 ServiceWorkerDisableWebSecurityTest, |
2757 ::testing::Values(true, false)); | 2844 ::testing::Values(true, false)); |
2758 | 2845 |
2759 } // namespace content | 2846 } // namespace content |
OLD | NEW |