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

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

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