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

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

Issue 2473263003: Set "Service-Worker-Navigation-Preload" header (Closed)
Patch Set: Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | content/browser/service_worker/service_worker_fetch_dispatcher.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include <map> 8 #include <map>
9 #include <memory> 9 #include <memory>
10 #include <utility> 10 #include <utility>
(...skipping 1410 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | content/browser/service_worker/service_worker_fetch_dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698