OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/path_service.h" | 6 #include "base/path_service.h" |
7 #include "base/strings/string_util.h" | 7 #include "base/strings/string_util.h" |
8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
9 #include "content/public/browser/web_contents.h" | 9 #include "content/public/browser/web_contents.h" |
10 #include "content/public/common/content_switches.h" | 10 #include "content/public/common/content_switches.h" |
(...skipping 29 matching lines...) Expand all Loading... |
40 private: | 40 private: |
41 WebContents* web_contents_; | 41 WebContents* web_contents_; |
42 ManifestBrowserTest* test_; | 42 ManifestBrowserTest* test_; |
43 }; | 43 }; |
44 | 44 |
45 class ManifestBrowserTest : public ContentBrowserTest { | 45 class ManifestBrowserTest : public ContentBrowserTest { |
46 protected: | 46 protected: |
47 friend MockWebContentsDelegate; | 47 friend MockWebContentsDelegate; |
48 | 48 |
49 ManifestBrowserTest() : console_error_count_(0), has_manifest_(false) { | 49 ManifestBrowserTest() : console_error_count_(0), has_manifest_(false) { |
50 cors_embedded_test_server_.reset(new net::test_server::EmbeddedTestServer); | 50 cors_embedded_test_server_.reset(new net::EmbeddedTestServer); |
51 base::FilePath test_data_dir; | 51 cors_embedded_test_server_->ServeFilesFromSourceDirectory( |
52 CHECK(PathService::Get(base::DIR_SOURCE_ROOT, &test_data_dir)); | 52 "content/test/data"); |
53 cors_embedded_test_server_->ServeFilesFromDirectory( | |
54 test_data_dir.AppendASCII("content/test/data/")); | |
55 } | 53 } |
56 | 54 |
57 ~ManifestBrowserTest() override {} | 55 ~ManifestBrowserTest() override {} |
58 | 56 |
59 void SetUpOnMainThread() override { | 57 void SetUpOnMainThread() override { |
60 ContentBrowserTest::SetUpOnMainThread(); | 58 ContentBrowserTest::SetUpOnMainThread(); |
61 DCHECK(shell()->web_contents()); | 59 DCHECK(shell()->web_contents()); |
62 | 60 |
63 mock_web_contents_delegate_.reset( | 61 mock_web_contents_delegate_.reset( |
64 new MockWebContentsDelegate(shell()->web_contents(), this)); | 62 new MockWebContentsDelegate(shell()->web_contents(), this)); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 } | 100 } |
103 | 101 |
104 unsigned int console_error_count() const { | 102 unsigned int console_error_count() const { |
105 return console_error_count_; | 103 return console_error_count_; |
106 } | 104 } |
107 | 105 |
108 void OnReceivedConsoleError() { | 106 void OnReceivedConsoleError() { |
109 console_error_count_++; | 107 console_error_count_++; |
110 } | 108 } |
111 | 109 |
112 net::test_server::EmbeddedTestServer* cors_embedded_test_server() const { | 110 net::EmbeddedTestServer* cors_embedded_test_server() const { |
113 return cors_embedded_test_server_.get(); | 111 return cors_embedded_test_server_.get(); |
114 } | 112 } |
115 | 113 |
116 private: | 114 private: |
117 scoped_refptr<MessageLoopRunner> message_loop_runner_; | 115 scoped_refptr<MessageLoopRunner> message_loop_runner_; |
118 scoped_ptr<MockWebContentsDelegate> mock_web_contents_delegate_; | 116 scoped_ptr<MockWebContentsDelegate> mock_web_contents_delegate_; |
119 scoped_ptr<net::test_server::EmbeddedTestServer> cors_embedded_test_server_; | 117 scoped_ptr<net::EmbeddedTestServer> cors_embedded_test_server_; |
120 Manifest manifest_; | 118 Manifest manifest_; |
121 int console_error_count_; | 119 int console_error_count_; |
122 bool has_manifest_; | 120 bool has_manifest_; |
123 | 121 |
124 DISALLOW_COPY_AND_ASSIGN(ManifestBrowserTest); | 122 DISALLOW_COPY_AND_ASSIGN(ManifestBrowserTest); |
125 }; | 123 }; |
126 | 124 |
127 // The implementation of AddMessageToConsole isn't inlined because it needs | 125 // The implementation of AddMessageToConsole isn't inlined because it needs |
128 // to know about |test_|. | 126 // to know about |test_|. |
129 bool MockWebContentsDelegate::AddMessageToConsole( | 127 bool MockWebContentsDelegate::AddMessageToConsole( |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 EXPECT_TRUE(has_manifest()); | 265 EXPECT_TRUE(has_manifest()); |
268 } | 266 } |
269 | 267 |
270 EXPECT_EQ(0u, console_error_count()); | 268 EXPECT_EQ(0u, console_error_count()); |
271 } | 269 } |
272 | 270 |
273 // If a page's manifest lives in a different origin, it should follow the CORS | 271 // If a page's manifest lives in a different origin, it should follow the CORS |
274 // rules and requesting the manifest should return an empty manifest (unless the | 272 // rules and requesting the manifest should return an empty manifest (unless the |
275 // response contains CORS headers). | 273 // response contains CORS headers). |
276 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, CORSManifest) { | 274 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, CORSManifest) { |
277 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 275 ASSERT_TRUE(embedded_test_server()->Start()); |
278 ASSERT_TRUE(cors_embedded_test_server()->InitializeAndWaitUntilReady()); | 276 ASSERT_TRUE(cors_embedded_test_server()->Start()); |
279 ASSERT_NE(embedded_test_server()->port(), | 277 ASSERT_NE(embedded_test_server()->port(), |
280 cors_embedded_test_server()->port()); | 278 cors_embedded_test_server()->port()); |
281 | 279 |
282 GURL test_url = | 280 GURL test_url = |
283 embedded_test_server()->GetURL("/manifest/dynamic-manifest.html"); | 281 embedded_test_server()->GetURL("/manifest/dynamic-manifest.html"); |
284 | 282 |
285 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 283 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
286 shell()->LoadURL(test_url); | 284 shell()->LoadURL(test_url); |
287 navigation_observer.Wait(); | 285 navigation_observer.Wait(); |
288 | 286 |
(...skipping 18 matching lines...) Expand all Loading... |
307 manifest_url = | 305 manifest_url = |
308 embedded_test_server()->GetURL("/manifest/dummy-manifest.json").spec(); | 306 embedded_test_server()->GetURL("/manifest/dummy-manifest.json").spec(); |
309 ASSERT_TRUE(content::ExecuteScript(shell()->web_contents(), | 307 ASSERT_TRUE(content::ExecuteScript(shell()->web_contents(), |
310 "setManifestTo('" + manifest_url + "')")); | 308 "setManifestTo('" + manifest_url + "')")); |
311 GetManifestAndWait(); | 309 GetManifestAndWait(); |
312 } | 310 } |
313 | 311 |
314 // If a page's manifest lives in a different origin, it should be accessible if | 312 // If a page's manifest lives in a different origin, it should be accessible if |
315 // it has valid access controls headers. | 313 // it has valid access controls headers. |
316 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, CORSManifestWithAcessControls) { | 314 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, CORSManifestWithAcessControls) { |
317 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 315 ASSERT_TRUE(embedded_test_server()->Start()); |
318 ASSERT_TRUE(cors_embedded_test_server()->InitializeAndWaitUntilReady()); | 316 ASSERT_TRUE(cors_embedded_test_server()->Start()); |
319 ASSERT_NE(embedded_test_server()->port(), | 317 ASSERT_NE(embedded_test_server()->port(), |
320 cors_embedded_test_server()->port()); | 318 cors_embedded_test_server()->port()); |
321 | 319 |
322 GURL test_url = | 320 GURL test_url = |
323 embedded_test_server()->GetURL("/manifest/dynamic-manifest.html"); | 321 embedded_test_server()->GetURL("/manifest/dynamic-manifest.html"); |
324 | 322 |
325 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 323 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
326 shell()->LoadURL(test_url); | 324 shell()->LoadURL(test_url); |
327 navigation_observer.Wait(); | 325 navigation_observer.Wait(); |
328 | 326 |
329 std::string manifest_url = cors_embedded_test_server()->GetURL( | 327 std::string manifest_url = cors_embedded_test_server()->GetURL( |
330 "/manifest/manifest-cors.json").spec(); | 328 "/manifest/manifest-cors.json").spec(); |
331 ASSERT_TRUE(content::ExecuteScript(shell()->web_contents(), | 329 ASSERT_TRUE(content::ExecuteScript(shell()->web_contents(), |
332 "setManifestTo('" + manifest_url + "')")); | 330 "setManifestTo('" + manifest_url + "')")); |
333 | 331 |
334 GetManifestAndWait(); | 332 GetManifestAndWait(); |
335 EXPECT_FALSE(manifest().IsEmpty()); | 333 EXPECT_FALSE(manifest().IsEmpty()); |
336 | 334 |
337 HasManifestAndWait(); | 335 HasManifestAndWait(); |
338 EXPECT_TRUE(has_manifest()); | 336 EXPECT_TRUE(has_manifest()); |
339 EXPECT_EQ(0u, console_error_count()); | 337 EXPECT_EQ(0u, console_error_count()); |
340 } | 338 } |
341 | 339 |
342 // If a page's manifest is in an insecure origin while the page is in a secure | 340 // If a page's manifest is in an insecure origin while the page is in a secure |
343 // origin, requesting the manifest should return the empty manifest. | 341 // origin, requesting the manifest should return the empty manifest. |
344 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, MixedContentManifest) { | 342 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, MixedContentManifest) { |
345 scoped_ptr<net::SpawnedTestServer> https_server(new net::SpawnedTestServer( | 343 scoped_ptr<net::EmbeddedTestServer> https_server( |
346 net::SpawnedTestServer::TYPE_HTTPS, | 344 new net::EmbeddedTestServer(net::EmbeddedTestServer::TYPE_HTTPS)); |
347 net::BaseTestServer::SSLOptions(net::BaseTestServer::SSLOptions::CERT_OK), | 345 https_server->ServeFilesFromSourceDirectory("content/test/data"); |
348 base::FilePath(FILE_PATH_LITERAL("content/test/data")))); | |
349 | 346 |
350 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 347 ASSERT_TRUE(embedded_test_server()->Start()); |
351 ASSERT_TRUE(https_server->Start()); | 348 ASSERT_TRUE(https_server->Start()); |
352 | 349 |
353 GURL test_url = | 350 GURL test_url = |
354 embedded_test_server()->GetURL("/manifest/dynamic-manifest.html"); | 351 embedded_test_server()->GetURL("/manifest/dynamic-manifest.html"); |
355 | 352 |
356 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 353 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
357 shell()->LoadURL(test_url); | 354 shell()->LoadURL(test_url); |
358 navigation_observer.Wait(); | 355 navigation_observer.Wait(); |
359 | 356 |
360 std::string manifest_url = | 357 std::string manifest_url = |
(...skipping 22 matching lines...) Expand all Loading... |
383 EXPECT_TRUE(manifest().IsEmpty()); | 380 EXPECT_TRUE(manifest().IsEmpty()); |
384 EXPECT_EQ(6u, console_error_count()); | 381 EXPECT_EQ(6u, console_error_count()); |
385 | 382 |
386 HasManifestAndWait(); | 383 HasManifestAndWait(); |
387 EXPECT_TRUE(has_manifest()); | 384 EXPECT_TRUE(has_manifest()); |
388 } | 385 } |
389 | 386 |
390 // If a page has a manifest and the page is navigated to a page without a | 387 // If a page has a manifest and the page is navigated to a page without a |
391 // manifest, the page's manifest should be updated. | 388 // manifest, the page's manifest should be updated. |
392 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, Navigation) { | 389 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, Navigation) { |
393 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 390 ASSERT_TRUE(embedded_test_server()->Start()); |
394 { | 391 { |
395 GURL test_url = | 392 GURL test_url = |
396 embedded_test_server()->GetURL("/manifest/dummy-manifest.html"); | 393 embedded_test_server()->GetURL("/manifest/dummy-manifest.html"); |
397 | 394 |
398 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 395 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
399 shell()->LoadURL(test_url); | 396 shell()->LoadURL(test_url); |
400 navigation_observer.Wait(); | 397 navigation_observer.Wait(); |
401 | 398 |
402 GetManifestAndWait(); | 399 GetManifestAndWait(); |
403 EXPECT_FALSE(manifest().IsEmpty()); | 400 EXPECT_FALSE(manifest().IsEmpty()); |
(...skipping 16 matching lines...) Expand all Loading... |
420 EXPECT_EQ(0u, console_error_count()); | 417 EXPECT_EQ(0u, console_error_count()); |
421 | 418 |
422 HasManifestAndWait(); | 419 HasManifestAndWait(); |
423 EXPECT_FALSE(has_manifest()); | 420 EXPECT_FALSE(has_manifest()); |
424 } | 421 } |
425 } | 422 } |
426 | 423 |
427 // If a page has a manifest and the page is navigated using pushState (ie. same | 424 // If a page has a manifest and the page is navigated using pushState (ie. same |
428 // page), it should keep its manifest state. | 425 // page), it should keep its manifest state. |
429 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, PushStateNavigation) { | 426 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, PushStateNavigation) { |
430 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 427 ASSERT_TRUE(embedded_test_server()->Start()); |
431 GURL test_url = | 428 GURL test_url = |
432 embedded_test_server()->GetURL("/manifest/dummy-manifest.html"); | 429 embedded_test_server()->GetURL("/manifest/dummy-manifest.html"); |
433 | 430 |
434 { | 431 { |
435 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 432 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
436 shell()->LoadURL(test_url); | 433 shell()->LoadURL(test_url); |
437 navigation_observer.Wait(); | 434 navigation_observer.Wait(); |
438 } | 435 } |
439 | 436 |
440 { | 437 { |
441 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 438 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
442 ASSERT_TRUE(content::ExecuteScript( | 439 ASSERT_TRUE(content::ExecuteScript( |
443 shell()->web_contents(), | 440 shell()->web_contents(), |
444 "history.pushState({foo: \"bar\"}, 'page', 'page.html');")); | 441 "history.pushState({foo: \"bar\"}, 'page', 'page.html');")); |
445 navigation_observer.Wait(); | 442 navigation_observer.Wait(); |
446 } | 443 } |
447 | 444 |
448 GetManifestAndWait(); | 445 GetManifestAndWait(); |
449 EXPECT_FALSE(manifest().IsEmpty()); | 446 EXPECT_FALSE(manifest().IsEmpty()); |
450 | 447 |
451 HasManifestAndWait(); | 448 HasManifestAndWait(); |
452 EXPECT_TRUE(has_manifest()); | 449 EXPECT_TRUE(has_manifest()); |
453 EXPECT_EQ(0u, console_error_count()); | 450 EXPECT_EQ(0u, console_error_count()); |
454 } | 451 } |
455 | 452 |
456 // If a page has a manifest and is navigated using an anchor (ie. same page), it | 453 // If a page has a manifest and is navigated using an anchor (ie. same page), it |
457 // should keep its manifest state. | 454 // should keep its manifest state. |
458 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, AnchorNavigation) { | 455 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, AnchorNavigation) { |
459 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); | 456 ASSERT_TRUE(embedded_test_server()->Start()); |
460 GURL test_url = | 457 GURL test_url = |
461 embedded_test_server()->GetURL("/manifest/dummy-manifest.html"); | 458 embedded_test_server()->GetURL("/manifest/dummy-manifest.html"); |
462 | 459 |
463 { | 460 { |
464 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 461 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
465 shell()->LoadURL(test_url); | 462 shell()->LoadURL(test_url); |
466 navigation_observer.Wait(); | 463 navigation_observer.Wait(); |
467 } | 464 } |
468 | 465 |
469 { | 466 { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
512 base::StringPrintf("{\"name\": \"%s\"}", iter->second.c_str())); | 509 base::StringPrintf("{\"name\": \"%s\"}", iter->second.c_str())); |
513 | 510 |
514 return http_response.Pass(); | 511 return http_response.Pass(); |
515 } | 512 } |
516 | 513 |
517 } // anonymous namespace | 514 } // anonymous namespace |
518 | 515 |
519 // This tests that when fetching a Manifest with 'use-credentials' set, the | 516 // This tests that when fetching a Manifest with 'use-credentials' set, the |
520 // cookies associated with it are passed along the request. | 517 // cookies associated with it are passed along the request. |
521 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, UseCredentialsSendCookies) { | 518 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, UseCredentialsSendCookies) { |
522 scoped_ptr<net::test_server::EmbeddedTestServer> custom_embedded_test_server( | 519 scoped_ptr<net::EmbeddedTestServer> custom_embedded_test_server( |
523 new net::test_server::EmbeddedTestServer()); | 520 new net::EmbeddedTestServer()); |
524 custom_embedded_test_server->RegisterRequestHandler( | 521 custom_embedded_test_server->RegisterRequestHandler( |
525 base::Bind(&CustomHandleRequestForCookies)); | 522 base::Bind(&CustomHandleRequestForCookies)); |
526 | 523 |
527 ASSERT_TRUE(custom_embedded_test_server->InitializeAndWaitUntilReady()); | 524 ASSERT_TRUE(custom_embedded_test_server->Start()); |
528 | 525 |
529 ASSERT_TRUE(SetCookie(shell()->web_contents()->GetBrowserContext(), | 526 ASSERT_TRUE(SetCookie(shell()->web_contents()->GetBrowserContext(), |
530 custom_embedded_test_server->base_url(), | 527 custom_embedded_test_server->base_url(), |
531 "foobar")); | 528 "foobar")); |
532 | 529 |
533 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 530 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
534 shell()->LoadURL(custom_embedded_test_server->GetURL("/index.html")); | 531 shell()->LoadURL(custom_embedded_test_server->GetURL("/index.html")); |
535 navigation_observer.Wait(); | 532 navigation_observer.Wait(); |
536 | 533 |
537 GetManifestAndWait(); | 534 GetManifestAndWait(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
571 http_response->set_content("{\"name\": \"no cookies\"}"); | 568 http_response->set_content("{\"name\": \"no cookies\"}"); |
572 | 569 |
573 return http_response.Pass(); | 570 return http_response.Pass(); |
574 } | 571 } |
575 | 572 |
576 } // anonymous namespace | 573 } // anonymous namespace |
577 | 574 |
578 // This tests that when fetching a Manifest without 'use-credentials' set, the | 575 // This tests that when fetching a Manifest without 'use-credentials' set, the |
579 // cookies associated with it are not passed along the request. | 576 // cookies associated with it are not passed along the request. |
580 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, NoUseCredentialsNoCookies) { | 577 IN_PROC_BROWSER_TEST_F(ManifestBrowserTest, NoUseCredentialsNoCookies) { |
581 scoped_ptr<net::test_server::EmbeddedTestServer> custom_embedded_test_server( | 578 scoped_ptr<net::EmbeddedTestServer> custom_embedded_test_server( |
582 new net::test_server::EmbeddedTestServer()); | 579 new net::EmbeddedTestServer()); |
583 custom_embedded_test_server->RegisterRequestHandler( | 580 custom_embedded_test_server->RegisterRequestHandler( |
584 base::Bind(&CustomHandleRequestForNoCookies)); | 581 base::Bind(&CustomHandleRequestForNoCookies)); |
585 | 582 |
586 ASSERT_TRUE(custom_embedded_test_server->InitializeAndWaitUntilReady()); | 583 ASSERT_TRUE(custom_embedded_test_server->Start()); |
587 | 584 |
588 ASSERT_TRUE(SetCookie(shell()->web_contents()->GetBrowserContext(), | 585 ASSERT_TRUE(SetCookie(shell()->web_contents()->GetBrowserContext(), |
589 custom_embedded_test_server->base_url(), | 586 custom_embedded_test_server->base_url(), |
590 "foobar")); | 587 "foobar")); |
591 | 588 |
592 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); | 589 TestNavigationObserver navigation_observer(shell()->web_contents(), 1); |
593 shell()->LoadURL(custom_embedded_test_server->GetURL("/index.html")); | 590 shell()->LoadURL(custom_embedded_test_server->GetURL("/index.html")); |
594 navigation_observer.Wait(); | 591 navigation_observer.Wait(); |
595 | 592 |
596 GetManifestAndWait(); | 593 GetManifestAndWait(); |
597 EXPECT_FALSE(manifest().IsEmpty()); | 594 EXPECT_FALSE(manifest().IsEmpty()); |
598 | 595 |
599 HasManifestAndWait(); | 596 HasManifestAndWait(); |
600 EXPECT_TRUE(has_manifest()); | 597 EXPECT_TRUE(has_manifest()); |
601 EXPECT_EQ(0u, console_error_count()); | 598 EXPECT_EQ(0u, console_error_count()); |
602 | 599 |
603 // The custom embedded test server will fill set the name to 'no cookies' if | 600 // The custom embedded test server will fill set the name to 'no cookies' if |
604 // it did not find cookies. | 601 // it did not find cookies. |
605 EXPECT_TRUE(base::EqualsASCII(manifest().name.string(), "no cookies")); | 602 EXPECT_TRUE(base::EqualsASCII(manifest().name.string(), "no cookies")); |
606 } | 603 } |
607 | 604 |
608 } // namespace content | 605 } // namespace content |
OLD | NEW |