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