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

Side by Side Diff: content/browser/site_per_process_browsertest.cc

Issue 1320023003: SitePerProcessBrowserTest: make some tests to use cross_site_iframe_factory (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "content/browser/site_per_process_browsertest.h" 5 #include "content/browser/site_per_process_browsertest.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
278 // SitePerProcessBrowserTest 278 // SitePerProcessBrowserTest
279 // 279 //
280 280
281 SitePerProcessBrowserTest::SitePerProcessBrowserTest() { 281 SitePerProcessBrowserTest::SitePerProcessBrowserTest() {
282 }; 282 };
283 283
284 std::string SitePerProcessBrowserTest::DepictFrameTree(FrameTreeNode* node) { 284 std::string SitePerProcessBrowserTest::DepictFrameTree(FrameTreeNode* node) {
285 return visualizer_.DepictFrameTree(node); 285 return visualizer_.DepictFrameTree(node);
286 } 286 }
287 287
288 void SitePerProcessBrowserTest::StartFrameAtDataURL() {
289 std::string data_url_script =
290 "var iframes = document.getElementById('test');iframes.src="
291 "'data:text/html,dataurl';";
292 ASSERT_TRUE(ExecuteScript(shell()->web_contents(), data_url_script));
293 }
294
295 void SitePerProcessBrowserTest::SetUpCommandLine( 288 void SitePerProcessBrowserTest::SetUpCommandLine(
296 base::CommandLine* command_line) { 289 base::CommandLine* command_line) {
297 IsolateAllSitesForTesting(command_line); 290 IsolateAllSitesForTesting(command_line);
298 }; 291 };
299 292
300 void SitePerProcessBrowserTest::SetUpOnMainThread() { 293 void SitePerProcessBrowserTest::SetUpOnMainThread() {
301 host_resolver()->AddRule("*", "127.0.0.1"); 294 host_resolver()->AddRule("*", "127.0.0.1");
302 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 295 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
303 SetupCrossSiteRedirector(embedded_test_server()); 296 SetupCrossSiteRedirector(embedded_test_server());
304 } 297 }
305 298
306 // Ensure that navigating subframes in --site-per-process mode works and the 299 // Ensure that navigating subframes in --site-per-process mode works and the
307 // correct documents are committed. 300 // correct documents are committed.
308 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CrossSiteIframe) { 301 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CrossSiteIframe) {
309 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); 302 GURL main_url(embedded_test_server()->GetURL(
303 "a.com", "/cross_site_iframe_factory.html?a(a,a(a,a(a)))"));
310 NavigateToURL(shell(), main_url); 304 NavigateToURL(shell(), main_url);
311 305
312 // It is safe to obtain the root frame tree node here, as it doesn't change. 306 // It is safe to obtain the root frame tree node here, as it doesn't change.
313 FrameTreeNode* root = 307 FrameTreeNode* root =
314 static_cast<WebContentsImpl*>(shell()->web_contents())-> 308 static_cast<WebContentsImpl*>(shell()->web_contents())->
315 GetFrameTree()->root(); 309 GetFrameTree()->root();
316 310
317 TestNavigationObserver observer(shell()->web_contents()); 311 TestNavigationObserver observer(shell()->web_contents());
318 312
319 // Load same-site page into iframe. 313 // Load same-site page into iframe.
320 FrameTreeNode* child = root->child_at(0); 314 FrameTreeNode* child = root->child_at(0);
321 GURL http_url(embedded_test_server()->GetURL("/title1.html")); 315 GURL http_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
322 NavigateFrameToURL(child, http_url); 316 NavigateFrameToURL(child, http_url);
323 EXPECT_EQ(http_url, observer.last_navigation_url()); 317 EXPECT_EQ(http_url, observer.last_navigation_url());
324 EXPECT_TRUE(observer.last_navigation_succeeded()); 318 EXPECT_TRUE(observer.last_navigation_succeeded());
325 { 319 {
326 // There should be only one RenderWidgetHost when there are no 320 // There should be only one RenderWidgetHost when there are no
327 // cross-process iframes. 321 // cross-process iframes.
328 std::set<RenderWidgetHostView*> views_set = 322 std::set<RenderWidgetHostView*> views_set =
329 static_cast<WebContentsImpl*>(shell()->web_contents()) 323 static_cast<WebContentsImpl*>(shell()->web_contents())
330 ->GetRenderWidgetHostViewsInTree(); 324 ->GetRenderWidgetHostViewsInTree();
331 EXPECT_EQ(1U, views_set.size()); 325 EXPECT_EQ(1U, views_set.size());
332 } 326 }
333 327
334 EXPECT_EQ( 328 EXPECT_EQ(
335 " Site A\n" 329 " Site A\n"
336 " |--Site A\n" 330 " |--Site A\n"
337 " +--Site A\n" 331 " +--Site A\n"
338 " |--Site A\n" 332 " |--Site A\n"
339 " +--Site A\n" 333 " +--Site A\n"
340 " +--Site A\n" 334 " +--Site A\n"
341 "Where A = http://127.0.0.1/", 335 "Where A = http://a.com/",
342 DepictFrameTree(root)); 336 DepictFrameTree(root));
343 337
344 // Load cross-site page into iframe. 338 // Load cross-site page into iframe.
345 GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html"); 339 GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html");
346 NavigateFrameToURL(root->child_at(0), url); 340 NavigateFrameToURL(root->child_at(0), url);
347 // Verify that the navigation succeeded and the expected URL was loaded. 341 // Verify that the navigation succeeded and the expected URL was loaded.
348 EXPECT_TRUE(observer.last_navigation_succeeded()); 342 EXPECT_TRUE(observer.last_navigation_succeeded());
349 EXPECT_EQ(url, observer.last_navigation_url()); 343 EXPECT_EQ(url, observer.last_navigation_url());
350 344
351 // Ensure that we have created a new process for the subframe. 345 // Ensure that we have created a new process for the subframe.
(...skipping 23 matching lines...) Expand all
375 proxy_to_parent->cross_process_frame_connector()->get_view_for_testing()); 369 proxy_to_parent->cross_process_frame_connector()->get_view_for_testing());
376 EXPECT_TRUE(child->current_frame_host()->GetRenderWidgetHost()); 370 EXPECT_TRUE(child->current_frame_host()->GetRenderWidgetHost());
377 371
378 EXPECT_EQ( 372 EXPECT_EQ(
379 " Site A ------------ proxies for B\n" 373 " Site A ------------ proxies for B\n"
380 " |--Site B ------- proxies for A\n" 374 " |--Site B ------- proxies for A\n"
381 " +--Site A ------- proxies for B\n" 375 " +--Site A ------- proxies for B\n"
382 " |--Site A -- proxies for B\n" 376 " |--Site A -- proxies for B\n"
383 " +--Site A -- proxies for B\n" 377 " +--Site A -- proxies for B\n"
384 " +--Site A -- proxies for B\n" 378 " +--Site A -- proxies for B\n"
385 "Where A = http://127.0.0.1/\n" 379 "Where A = http://a.com/\n"
386 " B = http://foo.com/", 380 " B = http://foo.com/",
387 DepictFrameTree(root)); 381 DepictFrameTree(root));
388 382
389 // Load another cross-site page into the same iframe. 383 // Load another cross-site page into the same iframe.
390 url = embedded_test_server()->GetURL("bar.com", "/title3.html"); 384 url = embedded_test_server()->GetURL("bar.com", "/title3.html");
391 NavigateFrameToURL(root->child_at(0), url); 385 NavigateFrameToURL(root->child_at(0), url);
392 EXPECT_TRUE(observer.last_navigation_succeeded()); 386 EXPECT_TRUE(observer.last_navigation_succeeded());
393 EXPECT_EQ(url, observer.last_navigation_url()); 387 EXPECT_EQ(url, observer.last_navigation_url());
394 388
395 // Check again that a new process is created and is different from the 389 // Check again that a new process is created and is different from the
(...skipping 23 matching lines...) Expand all
419 proxy_to_parent->cross_process_frame_connector()->get_view_for_testing()); 413 proxy_to_parent->cross_process_frame_connector()->get_view_for_testing());
420 EXPECT_TRUE(child->current_frame_host()->GetRenderWidgetHost()); 414 EXPECT_TRUE(child->current_frame_host()->GetRenderWidgetHost());
421 415
422 EXPECT_EQ( 416 EXPECT_EQ(
423 " Site A ------------ proxies for C\n" 417 " Site A ------------ proxies for C\n"
424 " |--Site C ------- proxies for A\n" 418 " |--Site C ------- proxies for A\n"
425 " +--Site A ------- proxies for C\n" 419 " +--Site A ------- proxies for C\n"
426 " |--Site A -- proxies for C\n" 420 " |--Site A -- proxies for C\n"
427 " +--Site A -- proxies for C\n" 421 " +--Site A -- proxies for C\n"
428 " +--Site A -- proxies for C\n" 422 " +--Site A -- proxies for C\n"
429 "Where A = http://127.0.0.1/\n" 423 "Where A = http://a.com/\n"
430 " C = http://bar.com/", 424 " C = http://bar.com/",
431 DepictFrameTree(root)); 425 DepictFrameTree(root));
432 } 426 }
433 427
434 // Tests OOPIF rendering by checking that the RWH of the iframe generates 428 // Tests OOPIF rendering by checking that the RWH of the iframe generates
435 // OnSwapCompositorFrame message. 429 // OnSwapCompositorFrame message.
436 #if defined(OS_ANDROID) 430 #if defined(OS_ANDROID)
437 // http://crbug.com/471850 431 // http://crbug.com/471850
438 #define MAYBE_CompositorFrameSwapped DISABLED_CompositorFrameSwapped 432 #define MAYBE_CompositorFrameSwapped DISABLED_CompositorFrameSwapped
439 #else 433 #else
440 #define MAYBE_CompositorFrameSwapped CompositorFrameSwapped 434 #define MAYBE_CompositorFrameSwapped CompositorFrameSwapped
441 #endif 435 #endif
442 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 436 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
443 MAYBE_CompositorFrameSwapped) { 437 MAYBE_CompositorFrameSwapped) {
444 GURL main_url( 438 GURL main_url(embedded_test_server()->GetURL(
445 embedded_test_server()->GetURL("/frame_tree/page_with_one_frame.html")); 439 "a.com", "/cross_site_iframe_factory.html?a(baz)"));
446 NavigateToURL(shell(), main_url); 440 NavigateToURL(shell(), main_url);
447 441
448 // It is safe to obtain the root frame tree node here, as it doesn't change. 442 // It is safe to obtain the root frame tree node here, as it doesn't change.
449 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) 443 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
450 ->GetFrameTree() 444 ->GetFrameTree()
451 ->root(); 445 ->root();
452 ASSERT_EQ(1U, root->child_count()); 446 ASSERT_EQ(1U, root->child_count());
453 447
454 FrameTreeNode* child_node = root->child_at(0); 448 FrameTreeNode* child_node = root->child_at(0);
455 GURL site_url(embedded_test_server()->GetURL("baz.com", "/title1.html")); 449 GURL site_url(embedded_test_server()->GetURL(
450 "baz.com", "/cross_site_iframe_factory.html?baz()"));
456 EXPECT_EQ(site_url, child_node->current_url()); 451 EXPECT_EQ(site_url, child_node->current_url());
457 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), 452 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
458 child_node->current_frame_host()->GetSiteInstance()); 453 child_node->current_frame_host()->GetSiteInstance());
459 RenderWidgetHostViewBase* rwhv_base = static_cast<RenderWidgetHostViewBase*>( 454 RenderWidgetHostViewBase* rwhv_base = static_cast<RenderWidgetHostViewBase*>(
460 child_node->current_frame_host()->GetRenderWidgetHost()->GetView()); 455 child_node->current_frame_host()->GetRenderWidgetHost()->GetView());
461 456
462 // Wait for OnSwapCompositorFrame message. 457 // Wait for OnSwapCompositorFrame message.
463 while (rwhv_base->RendererFrameNumber() <= 0) { 458 while (rwhv_base->RendererFrameNumber() <= 0) {
464 // TODO(lazyboy): Find a better way to avoid sleeping like this. See 459 // TODO(lazyboy): Find a better way to avoid sleeping like this. See
465 // http://crbug.com/405282 for details. 460 // http://crbug.com/405282 for details.
466 base::RunLoop run_loop; 461 base::RunLoop run_loop;
467 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 462 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
468 FROM_HERE, run_loop.QuitClosure(), 463 FROM_HERE, run_loop.QuitClosure(),
469 base::TimeDelta::FromMilliseconds(10)); 464 base::TimeDelta::FromMilliseconds(10));
470 run_loop.Run(); 465 run_loop.Run();
471 } 466 }
472 } 467 }
473 468
474 // Ensure that OOPIFs are deleted after navigating to a new main frame. 469 // Ensure that OOPIFs are deleted after navigating to a new main frame.
475 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CleanupCrossSiteIframe) { 470 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CleanupCrossSiteIframe) {
476 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); 471 GURL main_url(embedded_test_server()->GetURL(
472 "a.com", "/cross_site_iframe_factory.html?a(a,a(a,a(a)))"));
477 NavigateToURL(shell(), main_url); 473 NavigateToURL(shell(), main_url);
478 474
479 // It is safe to obtain the root frame tree node here, as it doesn't change. 475 // It is safe to obtain the root frame tree node here, as it doesn't change.
480 FrameTreeNode* root = 476 FrameTreeNode* root =
481 static_cast<WebContentsImpl*>(shell()->web_contents())-> 477 static_cast<WebContentsImpl*>(shell()->web_contents())->
482 GetFrameTree()->root(); 478 GetFrameTree()->root();
483 479
484 TestNavigationObserver observer(shell()->web_contents()); 480 TestNavigationObserver observer(shell()->web_contents());
485 481
486 // Load a cross-site page into both iframes. 482 // Load a cross-site page into both iframes.
487 GURL foo_url = embedded_test_server()->GetURL("foo.com", "/title2.html"); 483 GURL foo_url = embedded_test_server()->GetURL("foo.com", "/title2.html");
488 NavigateFrameToURL(root->child_at(0), foo_url); 484 NavigateFrameToURL(root->child_at(0), foo_url);
489 EXPECT_TRUE(observer.last_navigation_succeeded()); 485 EXPECT_TRUE(observer.last_navigation_succeeded());
490 EXPECT_EQ(foo_url, observer.last_navigation_url()); 486 EXPECT_EQ(foo_url, observer.last_navigation_url());
491 NavigateFrameToURL(root->child_at(1), foo_url); 487 NavigateFrameToURL(root->child_at(1), foo_url);
492 EXPECT_TRUE(observer.last_navigation_succeeded()); 488 EXPECT_TRUE(observer.last_navigation_succeeded());
493 EXPECT_EQ(foo_url, observer.last_navigation_url()); 489 EXPECT_EQ(foo_url, observer.last_navigation_url());
494 490
495 // Ensure that we have created a new process for the subframes. 491 // Ensure that we have created a new process for the subframes.
496 EXPECT_EQ( 492 EXPECT_EQ(
497 " Site A ------------ proxies for B\n" 493 " Site A ------------ proxies for B\n"
498 " |--Site B ------- proxies for A\n" 494 " |--Site B ------- proxies for A\n"
499 " +--Site B ------- proxies for A\n" 495 " +--Site B ------- proxies for A\n"
500 "Where A = http://127.0.0.1/\n" 496 "Where A = http://a.com/\n"
501 " B = http://foo.com/", 497 " B = http://foo.com/",
502 DepictFrameTree(root)); 498 DepictFrameTree(root));
503 499
504 int subframe_process_id = root->child_at(0) 500 int subframe_process_id = root->child_at(0)
505 ->current_frame_host() 501 ->current_frame_host()
506 ->GetSiteInstance() 502 ->GetSiteInstance()
507 ->GetProcess() 503 ->GetProcess()
508 ->GetID(); 504 ->GetID();
509 int subframe_rvh_id = root->child_at(0) 505 int subframe_rvh_id = root->child_at(0)
510 ->current_frame_host() 506 ->current_frame_host()
511 ->render_view_host() 507 ->render_view_host()
512 ->GetRoutingID(); 508 ->GetRoutingID();
513 EXPECT_TRUE(RenderViewHost::FromID(subframe_process_id, subframe_rvh_id)); 509 EXPECT_TRUE(RenderViewHost::FromID(subframe_process_id, subframe_rvh_id));
514 510
515 // Use Javascript in the parent to remove one of the frames and ensure that 511 // Use Javascript in the parent to remove one of the frames and ensure that
516 // the subframe goes away. 512 // the subframe goes away.
517 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 513 EXPECT_TRUE(ExecuteScript(shell()->web_contents(),
518 "document.body.removeChild(" 514 "document.body.removeChild("
519 "document.querySelectorAll('iframe')[0])")); 515 "document.querySelectorAll('iframe')[0])"));
520 ASSERT_EQ(1U, root->child_count()); 516 ASSERT_EQ(1U, root->child_count());
521 517
522 // Load a new same-site page in the top-level frame and ensure the other 518 // Load a new same-site page in the top-level frame and ensure the other
523 // subframe goes away. 519 // subframe goes away.
524 GURL new_url(embedded_test_server()->GetURL("/title1.html")); 520 GURL new_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
525 NavigateToURL(shell(), new_url); 521 NavigateToURL(shell(), new_url);
526 ASSERT_EQ(0U, root->child_count()); 522 ASSERT_EQ(0U, root->child_count());
527 523
528 // Ensure the RVH for the subframe gets cleaned up when the frame goes away. 524 // Ensure the RVH for the subframe gets cleaned up when the frame goes away.
529 EXPECT_FALSE(RenderViewHost::FromID(subframe_process_id, subframe_rvh_id)); 525 EXPECT_FALSE(RenderViewHost::FromID(subframe_process_id, subframe_rvh_id));
530 } 526 }
531 527
532 // Ensure that root frames cannot be detached. 528 // Ensure that root frames cannot be detached.
533 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, RestrictFrameDetach) { 529 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, RestrictFrameDetach) {
534 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); 530 GURL main_url(embedded_test_server()->GetURL(
531 "a.com", "/cross_site_iframe_factory.html?a(a,a(a,a(a)))"));
535 NavigateToURL(shell(), main_url); 532 NavigateToURL(shell(), main_url);
536 533
537 // It is safe to obtain the root frame tree node here, as it doesn't change. 534 // It is safe to obtain the root frame tree node here, as it doesn't change.
538 FrameTreeNode* root = 535 FrameTreeNode* root =
539 static_cast<WebContentsImpl*>(shell()->web_contents())-> 536 static_cast<WebContentsImpl*>(shell()->web_contents())->
540 GetFrameTree()->root(); 537 GetFrameTree()->root();
541 538
542 TestNavigationObserver observer(shell()->web_contents()); 539 TestNavigationObserver observer(shell()->web_contents());
543 540
544 // Load cross-site pages into both iframes. 541 // Load cross-site pages into both iframes.
(...skipping 14 matching lines...) Expand all
559 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), foo_site_instance); 556 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), foo_site_instance);
560 FrameTreeNode* bar_child = root->child_at(1); 557 FrameTreeNode* bar_child = root->child_at(1);
561 SiteInstance* bar_site_instance = 558 SiteInstance* bar_site_instance =
562 bar_child->current_frame_host()->GetSiteInstance(); 559 bar_child->current_frame_host()->GetSiteInstance();
563 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), bar_site_instance); 560 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), bar_site_instance);
564 561
565 EXPECT_EQ( 562 EXPECT_EQ(
566 " Site A ------------ proxies for B C\n" 563 " Site A ------------ proxies for B C\n"
567 " |--Site B ------- proxies for A C\n" 564 " |--Site B ------- proxies for A C\n"
568 " +--Site C ------- proxies for A B\n" 565 " +--Site C ------- proxies for A B\n"
569 "Where A = http://127.0.0.1/\n" 566 "Where A = http://a.com/\n"
570 " B = http://foo.com/\n" 567 " B = http://foo.com/\n"
571 " C = http://bar.com/", 568 " C = http://bar.com/",
572 DepictFrameTree(root)); 569 DepictFrameTree(root));
573 570
574 // Simulate an attempt to detach the root frame from foo_site_instance. This 571 // Simulate an attempt to detach the root frame from foo_site_instance. This
575 // should kill foo_site_instance's process. 572 // should kill foo_site_instance's process.
576 RenderFrameProxyHost* foo_mainframe_rfph = 573 RenderFrameProxyHost* foo_mainframe_rfph =
577 root->render_manager()->GetRenderFrameProxyHost(foo_site_instance); 574 root->render_manager()->GetRenderFrameProxyHost(foo_site_instance);
578 content::RenderProcessHostWatcher foo_terminated( 575 content::RenderProcessHostWatcher foo_terminated(
579 foo_mainframe_rfph->GetProcess(), 576 foo_mainframe_rfph->GetProcess(),
580 content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); 577 content::RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
581 FrameHostMsg_Detach evil_msg2(foo_mainframe_rfph->GetRoutingID()); 578 FrameHostMsg_Detach evil_msg2(foo_mainframe_rfph->GetRoutingID());
582 IPC::IpcSecurityTestUtil::PwnMessageReceived( 579 IPC::IpcSecurityTestUtil::PwnMessageReceived(
583 foo_mainframe_rfph->GetProcess()->GetChannel(), evil_msg2); 580 foo_mainframe_rfph->GetProcess()->GetChannel(), evil_msg2);
584 foo_terminated.Wait(); 581 foo_terminated.Wait();
585 582
586 EXPECT_EQ( 583 EXPECT_EQ(
587 " Site A ------------ proxies for B C\n" 584 " Site A ------------ proxies for B C\n"
588 " |--Site B ------- proxies for A C\n" 585 " |--Site B ------- proxies for A C\n"
589 " +--Site C ------- proxies for A B\n" 586 " +--Site C ------- proxies for A B\n"
590 "Where A = http://127.0.0.1/\n" 587 "Where A = http://a.com/\n"
591 " B = http://foo.com/ (no process)\n" 588 " B = http://foo.com/ (no process)\n"
592 " C = http://bar.com/", 589 " C = http://bar.com/",
593 DepictFrameTree(root)); 590 DepictFrameTree(root));
594 } 591 }
595 592
596 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 593 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, NavigateRemoteFrame) {
597 NavigateRemoteFrame) { 594 GURL main_url(embedded_test_server()->GetURL(
598 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); 595 "a.com", "/cross_site_iframe_factory.html?a(a,a(a,a(a)))"));
599 NavigateToURL(shell(), main_url); 596 NavigateToURL(shell(), main_url);
600 597
601 // It is safe to obtain the root frame tree node here, as it doesn't change. 598 // It is safe to obtain the root frame tree node here, as it doesn't change.
602 FrameTreeNode* root = 599 FrameTreeNode* root =
603 static_cast<WebContentsImpl*>(shell()->web_contents())-> 600 static_cast<WebContentsImpl*>(shell()->web_contents())->
604 GetFrameTree()->root(); 601 GetFrameTree()->root();
605 602
606 TestNavigationObserver observer(shell()->web_contents()); 603 TestNavigationObserver observer(shell()->web_contents());
607 604
608 // Load same-site page into iframe. 605 // Load same-site page into iframe.
609 FrameTreeNode* child = root->child_at(0); 606 FrameTreeNode* child = root->child_at(0);
610 GURL http_url(embedded_test_server()->GetURL("/title1.html")); 607 GURL http_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
611 NavigateFrameToURL(child, http_url); 608 NavigateFrameToURL(child, http_url);
612 EXPECT_EQ(http_url, observer.last_navigation_url()); 609 EXPECT_EQ(http_url, observer.last_navigation_url());
613 EXPECT_TRUE(observer.last_navigation_succeeded()); 610 EXPECT_TRUE(observer.last_navigation_succeeded());
614 611
615 // Load cross-site page into iframe. 612 // Load cross-site page into iframe.
616 GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html"); 613 GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html");
617 NavigateFrameToURL(root->child_at(0), url); 614 NavigateFrameToURL(root->child_at(0), url);
618 EXPECT_TRUE(observer.last_navigation_succeeded()); 615 EXPECT_TRUE(observer.last_navigation_succeeded());
619 EXPECT_EQ(url, observer.last_navigation_url()); 616 EXPECT_EQ(url, observer.last_navigation_url());
620 617
621 // Ensure that we have created a new process for the subframe. 618 // Ensure that we have created a new process for the subframe.
622 ASSERT_EQ(2U, root->child_count()); 619 EXPECT_EQ(
620 " Site A ------------ proxies for B\n"
621 " |--Site B ------- proxies for A\n"
622 " +--Site A ------- proxies for B\n"
623 " |--Site A -- proxies for B\n"
624 " +--Site A -- proxies for B\n"
625 " +--Site A -- proxies for B\n"
626 "Where A = http://a.com/\n"
627 " B = http://foo.com/",
628 DepictFrameTree(root));
623 SiteInstance* site_instance = child->current_frame_host()->GetSiteInstance(); 629 SiteInstance* site_instance = child->current_frame_host()->GetSiteInstance();
624 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site_instance); 630 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site_instance);
625 631
626 // Emulate the main frame changing the src of the iframe such that it 632 // Emulate the main frame changing the src of the iframe such that it
627 // navigates cross-site. 633 // navigates cross-site.
628 url = embedded_test_server()->GetURL("bar.com", "/title3.html"); 634 url = embedded_test_server()->GetURL("bar.com", "/title3.html");
629 NavigateIframeToURL(shell()->web_contents(), "test", url); 635 NavigateIframeToURL(shell()->web_contents(), "child-0", url);
630 EXPECT_TRUE(observer.last_navigation_succeeded()); 636 EXPECT_TRUE(observer.last_navigation_succeeded());
631 EXPECT_EQ(url, observer.last_navigation_url()); 637 EXPECT_EQ(url, observer.last_navigation_url());
632 638
633 // Check again that a new process is created and is different from the 639 // Check again that a new process is created and is different from the
634 // top level one and the previous one. 640 // top level one and the previous one.
635 ASSERT_EQ(2U, root->child_count()); 641 EXPECT_EQ(
636 child = root->child_at(0); 642 " Site A ------------ proxies for C\n"
637 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), 643 " |--Site C ------- proxies for A\n"
638 child->current_frame_host()->GetSiteInstance()); 644 " +--Site A ------- proxies for C\n"
639 EXPECT_NE(site_instance, 645 " |--Site A -- proxies for C\n"
640 child->current_frame_host()->GetSiteInstance()); 646 " +--Site A -- proxies for C\n"
647 " +--Site A -- proxies for C\n"
648 "Where A = http://a.com/\n"
649 " C = http://bar.com/",
650 DepictFrameTree(root));
641 651
642 // Navigate back to the parent's origin and ensure we return to the 652 // Navigate back to the parent's origin and ensure we return to the
643 // parent's process. 653 // parent's process.
644 NavigateFrameToURL(child, http_url); 654 NavigateFrameToURL(child, http_url);
645 EXPECT_EQ(http_url, observer.last_navigation_url()); 655 EXPECT_EQ(http_url, observer.last_navigation_url());
646 EXPECT_TRUE(observer.last_navigation_succeeded()); 656 EXPECT_TRUE(observer.last_navigation_succeeded());
647 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(), 657 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(),
648 child->current_frame_host()->GetSiteInstance()); 658 child->current_frame_host()->GetSiteInstance());
649 } 659 }
650 660
651 #if defined(OS_WIN)
652 // http://crbug.com/465722
653 #define MAYBE_NavigateRemoteFrameToBlankAndDataURLs \
654 DISABLED_NavigateRemoteFrameToBlankAndDataURLs
655 #else
656 #define MAYBE_NavigateRemoteFrameToBlankAndDataURLs \
657 NavigateRemoteFrameToBlankAndDataURLs
658 #endif
659
660 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 661 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
661 MAYBE_NavigateRemoteFrameToBlankAndDataURLs) { 662 NavigateRemoteFrameToBlankAndDataURLs) {
Charlie Reis 2015/08/27 21:14:48 Sure, we can give re-enabling this a try to see if
662 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); 663 GURL main_url(embedded_test_server()->GetURL(
664 "a.com", "/cross_site_iframe_factory.html?a(a,a(a))"));
663 NavigateToURL(shell(), main_url); 665 NavigateToURL(shell(), main_url);
664 666
665 // It is safe to obtain the root frame tree node here, as it doesn't change. 667 // It is safe to obtain the root frame tree node here, as it doesn't change.
666 FrameTreeNode* root = 668 FrameTreeNode* root =
667 static_cast<WebContentsImpl*>(shell()->web_contents())-> 669 static_cast<WebContentsImpl*>(shell()->web_contents())->
668 GetFrameTree()->root(); 670 GetFrameTree()->root();
669 671
670 TestNavigationObserver observer(shell()->web_contents()); 672 TestNavigationObserver observer(shell()->web_contents());
671 673
672 // Load same-site page into iframe. 674 // Load same-site page into iframe.
673 FrameTreeNode* child = root->child_at(0); 675 FrameTreeNode* child = root->child_at(0);
674 GURL http_url(embedded_test_server()->GetURL("/title1.html")); 676 GURL http_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
675 NavigateFrameToURL(child, http_url); 677 NavigateFrameToURL(child, http_url);
676 EXPECT_EQ(http_url, observer.last_navigation_url()); 678 EXPECT_EQ(http_url, observer.last_navigation_url());
677 EXPECT_TRUE(observer.last_navigation_succeeded()); 679 EXPECT_TRUE(observer.last_navigation_succeeded());
680 EXPECT_EQ(
681 " Site A\n"
682 " |--Site A\n"
683 " +--Site A\n"
684 " +--Site A\n"
685 "Where A = http://a.com/",
686 DepictFrameTree(root));
678 687
679 // Load cross-site page into iframe. 688 // Load cross-site page into iframe.
680 GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html"); 689 GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html");
681 NavigateFrameToURL(root->child_at(0), url); 690 NavigateFrameToURL(root->child_at(0), url);
682 EXPECT_TRUE(observer.last_navigation_succeeded()); 691 EXPECT_TRUE(observer.last_navigation_succeeded());
683 EXPECT_EQ(url, observer.last_navigation_url()); 692 EXPECT_EQ(url, observer.last_navigation_url());
684 ASSERT_EQ(2U, root->child_count()); 693 EXPECT_EQ(
685 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), 694 " Site A ------------ proxies for B\n"
686 root->child_at(0)->current_frame_host()->GetSiteInstance()); 695 " |--Site B ------- proxies for A\n"
696 " +--Site A ------- proxies for B\n"
697 " +--Site A -- proxies for B\n"
698 "Where A = http://a.com/\n"
699 " B = http://foo.com/",
700 DepictFrameTree(root));
687 701
688 // Navigate iframe to a data URL. The navigation happens from a script in the 702 // Navigate iframe to a data URL. The navigation happens from a script in the
689 // parent frame, so the data URL should be committed in the same SiteInstance 703 // parent frame, so the data URL should be committed in the same SiteInstance
690 // as the parent frame. 704 // as the parent frame.
691 GURL data_url("data:text/html,dataurl"); 705 GURL data_url("data:text/html,dataurl");
692 NavigateIframeToURL(shell()->web_contents(), "test", data_url); 706 NavigateIframeToURL(shell()->web_contents(), "child-0", data_url);
693 EXPECT_TRUE(observer.last_navigation_succeeded()); 707 EXPECT_TRUE(observer.last_navigation_succeeded());
694 EXPECT_EQ(data_url, observer.last_navigation_url()); 708 EXPECT_EQ(data_url, observer.last_navigation_url());
695 709
696 // Ensure that we have navigated using the top level process. 710 // Ensure that we have navigated using the top level process.
697 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(), 711 EXPECT_EQ(
698 root->child_at(0)->current_frame_host()->GetSiteInstance()); 712 " Site A\n"
713 " |--Site A\n"
714 " +--Site A\n"
715 " +--Site A\n"
716 "Where A = http://a.com/",
717 DepictFrameTree(root));
699 718
700 // Load cross-site page into iframe. 719 // Load cross-site page into iframe.
701 url = embedded_test_server()->GetURL("bar.com", "/title2.html"); 720 url = embedded_test_server()->GetURL("bar.com", "/title2.html");
702 NavigateFrameToURL(root->child_at(0), url); 721 NavigateFrameToURL(root->child_at(0), url);
703 EXPECT_TRUE(observer.last_navigation_succeeded()); 722 EXPECT_TRUE(observer.last_navigation_succeeded());
704 EXPECT_EQ(url, observer.last_navigation_url()); 723 EXPECT_EQ(url, observer.last_navigation_url());
705 ASSERT_EQ(2U, root->child_count()); 724 EXPECT_EQ(
706 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), 725 " Site A ------------ proxies for C\n"
707 root->child_at(0)->current_frame_host()->GetSiteInstance()); 726 " |--Site C ------- proxies for A\n"
727 " +--Site A ------- proxies for C\n"
728 " +--Site A -- proxies for C\n"
729 "Where A = http://a.com/\n"
730 " C = http://bar.com/",
731 DepictFrameTree(root));
708 732
709 // Navigate iframe to about:blank. The navigation happens from a script in the 733 // Navigate iframe to about:blank. The navigation happens from a script in the
710 // parent frame, so it should be committed in the same SiteInstance as the 734 // parent frame, so it should be committed in the same SiteInstance as the
711 // parent frame. 735 // parent frame.
712 GURL about_blank_url("about:blank"); 736 GURL about_blank_url("about:blank");
713 NavigateIframeToURL(shell()->web_contents(), "test", about_blank_url); 737 NavigateIframeToURL(shell()->web_contents(), "child-0", about_blank_url);
714 EXPECT_TRUE(observer.last_navigation_succeeded()); 738 EXPECT_TRUE(observer.last_navigation_succeeded());
715 EXPECT_EQ(about_blank_url, observer.last_navigation_url()); 739 EXPECT_EQ(about_blank_url, observer.last_navigation_url());
716 740
717 // Ensure that we have navigated using the top level process. 741 // Ensure that we have navigated using the top level process.
718 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(), 742 EXPECT_EQ(
719 root->child_at(0)->current_frame_host()->GetSiteInstance()); 743 " Site A\n"
744 " |--Site A\n"
745 " +--Site A\n"
746 " +--Site A\n"
747 "Where A = http://a.com/",
748 DepictFrameTree(root));
720 } 749 }
721 750
722 // This test checks that killing a renderer process of a remote frame 751 // This test checks that killing a renderer process of a remote frame
723 // and then navigating some other frame to the same SiteInstance of the killed 752 // and then navigating some other frame to the same SiteInstance of the killed
724 // process works properly. 753 // process works properly.
725 // This can be illustrated as follows, 754 // This can be illustrated as follows,
726 // where 1/2/3 are FrameTreeNode-s and A/B are processes and B* is the killed 755 // where 1/2/3 are FrameTreeNode-s and A/B are processes and B* is the killed
727 // B process: 756 // B process:
728 // 757 //
729 // 1 A A A 758 // 1 A A A
730 // / \ -> / \ -> Kill B -> / \ -> Navigate 3 to B -> / \ . 759 // / \ -> / \ -> Kill B -> / \ -> Navigate 3 to B -> / \ .
731 // 2 3 B A B* A B* B 760 // 2 3 B A B* A B* B
732 // 761 //
733 // Initially, node1.proxy_hosts_ = {B} 762 // Initially, node1.proxy_hosts_ = {B}
734 // After we kill B, we make sure B stays in node1.proxy_hosts_, then we navigate 763 // After we kill B, we make sure B stays in node1.proxy_hosts_, then we navigate
735 // 3 to B and we expect that to complete normally. 764 // 3 to B and we expect that to complete normally.
736 // See http://crbug.com/432107. 765 // See http://crbug.com/432107.
737 // 766 //
738 // Note that due to http://crbug.com/450681, node2 cannot be re-navigated to 767 // Note that due to http://crbug.com/450681, node2 cannot be re-navigated to
739 // site B and stays in not rendered state. 768 // site B and stays in not rendered state.
740 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 769 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
741 NavigateRemoteFrameToKilledProcess) { 770 NavigateRemoteFrameToKilledProcess) {
742 GURL main_url(embedded_test_server()->GetURL( 771 GURL main_url(embedded_test_server()->GetURL(
743 "/frame_tree/page_with_two_frames.html")); 772 "foo.com", "/cross_site_iframe_factory.html?foo.com(bar.com, foo.com)"));
744 NavigateToURL(shell(), main_url); 773 NavigateToURL(shell(), main_url);
745 774
746 // It is safe to obtain the root frame tree node here, as it doesn't change. 775 // It is safe to obtain the root frame tree node here, as it doesn't change.
747 FrameTreeNode* root = 776 FrameTreeNode* root =
748 static_cast<WebContentsImpl*>(shell()->web_contents())-> 777 static_cast<WebContentsImpl*>(shell()->web_contents())->
749 GetFrameTree()->root(); 778 GetFrameTree()->root();
750 779
751 TestNavigationObserver observer(shell()->web_contents()); 780 TestNavigationObserver observer(shell()->web_contents());
752 ASSERT_EQ(2U, root->child_count()); 781 ASSERT_EQ(2U, root->child_count());
753 782
754 // Make sure node2 points to the correct cross-site page. 783 // Make sure node2 points to the correct cross-site page.
755 GURL site_b_url = embedded_test_server()->GetURL("bar.com", "/title1.html"); 784 GURL site_b_url = embedded_test_server()->GetURL(
785 "bar.com", "/cross_site_iframe_factory.html?bar.com()");
756 FrameTreeNode* node2 = root->child_at(0); 786 FrameTreeNode* node2 = root->child_at(0);
757 EXPECT_EQ(site_b_url, node2->current_url()); 787 EXPECT_EQ(site_b_url, node2->current_url());
758 788
759 // Kill that cross-site renderer. 789 // Kill that cross-site renderer.
760 RenderProcessHost* child_process = 790 RenderProcessHost* child_process =
761 node2->current_frame_host()->GetProcess(); 791 node2->current_frame_host()->GetProcess();
762 RenderProcessHostWatcher crash_observer( 792 RenderProcessHostWatcher crash_observer(
763 child_process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); 793 child_process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
764 child_process->Shutdown(0, false); 794 child_process->Shutdown(0, false);
765 crash_observer.Wait(); 795 crash_observer.Wait();
(...skipping 17 matching lines...) Expand all
783 // 813 //
784 // Initially, node1.proxy_hosts_ = {B, C} 814 // Initially, node1.proxy_hosts_ = {B, C}
785 // After we kill B, we make sure B stays in node1.proxy_hosts_, but 815 // After we kill B, we make sure B stays in node1.proxy_hosts_, but
786 // C gets cleared from node1.proxy_hosts_. 816 // C gets cleared from node1.proxy_hosts_.
787 // 817 //
788 // Note that due to http://crbug.com/450681, node2 cannot be re-navigated to 818 // Note that due to http://crbug.com/450681, node2 cannot be re-navigated to
789 // site B and stays in not rendered state. 819 // site B and stays in not rendered state.
790 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 820 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
791 NavigateRemoteFrameToKilledProcessWithSubtree) { 821 NavigateRemoteFrameToKilledProcessWithSubtree) {
792 GURL main_url(embedded_test_server()->GetURL( 822 GURL main_url(embedded_test_server()->GetURL(
793 "a.com", "/frame_tree/page_with_two_frames_nested.html")); 823 "a.com", "/cross_site_iframe_factory.html?a(bar(baz), a)"));
794 NavigateToURL(shell(), main_url); 824 NavigateToURL(shell(), main_url);
795 825
796 // It is safe to obtain the root frame tree node here, as it doesn't change. 826 // It is safe to obtain the root frame tree node here, as it doesn't change.
797 FrameTreeNode* root = 827 FrameTreeNode* root =
798 static_cast<WebContentsImpl*>(shell()->web_contents())-> 828 static_cast<WebContentsImpl*>(shell()->web_contents())->
799 GetFrameTree()->root(); 829 GetFrameTree()->root();
800 TestNavigationObserver observer(shell()->web_contents()); 830 TestNavigationObserver observer(shell()->web_contents());
801 831
802 ASSERT_EQ(2U, root->child_count()); 832 ASSERT_EQ(2U, root->child_count());
803 833
804 GURL site_b_url( 834 GURL site_b_url(embedded_test_server()->GetURL(
805 embedded_test_server()->GetURL( 835 "bar.com", "/cross_site_iframe_factory.html?bar(baz())"));
806 "bar.com", "/frame_tree/page_with_one_frame.html"));
807 // We can't use a TestNavigationObserver to verify the URL here, 836 // We can't use a TestNavigationObserver to verify the URL here,
808 // since the frame has children that may have clobbered it in the observer. 837 // since the frame has children that may have clobbered it in the observer.
809 EXPECT_EQ(site_b_url, root->child_at(0)->current_url()); 838 EXPECT_EQ(site_b_url, root->child_at(0)->current_url());
810 839
811 // Ensure that a new process is created for node2. 840 // Ensure that a new process is created for node2.
812 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), 841 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
813 root->child_at(0)->current_frame_host()->GetSiteInstance()); 842 root->child_at(0)->current_frame_host()->GetSiteInstance());
814 // Ensure that a new process is *not* created for node3. 843 // Ensure that a new process is *not* created for node3.
815 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(), 844 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(),
816 root->child_at(1)->current_frame_host()->GetSiteInstance()); 845 root->child_at(1)->current_frame_host()->GetSiteInstance());
817 846
818 ASSERT_EQ(1U, root->child_at(0)->child_count()); 847 ASSERT_EQ(1U, root->child_at(0)->child_count());
819 848
820 // Make sure node4 points to the correct cross-site page. 849 // Make sure node4 points to the correct cross-site page.
821 FrameTreeNode* node4 = root->child_at(0)->child_at(0); 850 FrameTreeNode* node4 = root->child_at(0)->child_at(0);
822 GURL site_c_url(embedded_test_server()->GetURL("baz.com", "/title1.html")); 851 GURL site_c_url(embedded_test_server()->GetURL(
852 "baz.com", "/cross_site_iframe_factory.html?baz()"));
823 EXPECT_EQ(site_c_url, node4->current_url()); 853 EXPECT_EQ(site_c_url, node4->current_url());
824 854
825 // |site_instance_c| is expected to go away once we kill |child_process_b| 855 // |site_instance_c| is expected to go away once we kill |child_process_b|
826 // below, so create a local scope so we can extend the lifetime of 856 // below, so create a local scope so we can extend the lifetime of
827 // |site_instance_c| with a refptr. 857 // |site_instance_c| with a refptr.
828 { 858 {
829 // Initially each frame has proxies for the other sites. 859 // Initially each frame has proxies for the other sites.
830 EXPECT_EQ( 860 EXPECT_EQ(
831 " Site A ------------ proxies for B C\n" 861 " Site A ------------ proxies for B C\n"
832 " |--Site B ------- proxies for A C\n" 862 " |--Site B ------- proxies for A C\n"
(...skipping 353 matching lines...) Expand 10 before | Expand all | Expand 10 after
1186 "Where A = http://a.com/\n" 1216 "Where A = http://a.com/\n"
1187 " B = http://bar.com/ (no process)", 1217 " B = http://bar.com/ (no process)",
1188 DepictFrameTree(root)); 1218 DepictFrameTree(root));
1189 1219
1190 EXPECT_EQ(0U, site_instance_c->active_frame_count()); 1220 EXPECT_EQ(0U, site_instance_c->active_frame_count());
1191 } 1221 }
1192 1222
1193 // Crash a subframe and ensures its children are cleared from the FrameTree. 1223 // Crash a subframe and ensures its children are cleared from the FrameTree.
1194 // See http://crbug.com/338508. 1224 // See http://crbug.com/338508.
1195 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CrashSubframe) { 1225 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CrashSubframe) {
1196 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); 1226 GURL main_url(embedded_test_server()->GetURL(
1227 "a.com", "/cross_site_iframe_factory.html?a(b)"));
1197 NavigateToURL(shell(), main_url); 1228 NavigateToURL(shell(), main_url);
1198 1229
1199 StartFrameAtDataURL();
Charlie Reis 2015/08/27 21:14:48 Nice. I'm not sure if the motivation for this met
1200
1201 // Load cross-site page into iframe.
1202 EXPECT_TRUE(NavigateIframeToURL(
1203 shell()->web_contents(), "test",
1204 embedded_test_server()->GetURL("/cross-site/foo.com/title2.html")));
1205
1206 // Check the subframe process. 1230 // Check the subframe process.
1207 FrameTreeNode* root = 1231 FrameTreeNode* root =
1208 static_cast<WebContentsImpl*>(shell()->web_contents())-> 1232 static_cast<WebContentsImpl*>(shell()->web_contents())->
1209 GetFrameTree()->root(); 1233 GetFrameTree()->root();
1210 ASSERT_EQ(2U, root->child_count()); 1234 EXPECT_EQ(
1235 " Site A ------------ proxies for B\n"
1236 " +--Site B ------- proxies for A\n"
1237 "Where A = http://a.com/\n"
1238 " B = http://b.com/",
1239 DepictFrameTree(root));
1211 FrameTreeNode* child = root->child_at(0); 1240 FrameTreeNode* child = root->child_at(0);
1212 EXPECT_EQ(main_url, root->current_url());
1213 EXPECT_EQ("foo.com", child->current_url().host());
1214 EXPECT_EQ("/title2.html", child->current_url().path());
1215
1216 EXPECT_TRUE( 1241 EXPECT_TRUE(
1217 child->current_frame_host()->render_view_host()->IsRenderViewLive()); 1242 child->current_frame_host()->render_view_host()->IsRenderViewLive());
1218 EXPECT_TRUE(child->current_frame_host()->IsRenderFrameLive()); 1243 EXPECT_TRUE(child->current_frame_host()->IsRenderFrameLive());
1219 1244
1220 // Crash the subframe process. 1245 // Crash the subframe process.
1221 RenderProcessHost* root_process = root->current_frame_host()->GetProcess(); 1246 RenderProcessHost* root_process = root->current_frame_host()->GetProcess();
1222 RenderProcessHost* child_process = child->current_frame_host()->GetProcess(); 1247 RenderProcessHost* child_process = child->current_frame_host()->GetProcess();
1223 { 1248 {
1224 RenderProcessHostWatcher crash_observer( 1249 RenderProcessHostWatcher crash_observer(
1225 child_process, 1250 child_process,
1226 RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); 1251 RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
1227 child_process->Shutdown(0, false); 1252 child_process->Shutdown(0, false);
1228 crash_observer.Wait(); 1253 crash_observer.Wait();
1229 } 1254 }
1230 1255
1231 // Ensure that the child frame still exists but has been cleared. 1256 // Ensure that the child frame still exists but has been cleared.
1232 EXPECT_EQ(2U, root->child_count()); 1257 EXPECT_EQ(
1258 " Site A ------------ proxies for B\n"
1259 " +--Site B ------- proxies for A\n"
1260 "Where A = http://a.com/\n"
1261 " B = http://b.com/ (no process)",
1262 DepictFrameTree(root));
1263 EXPECT_EQ(1U, root->child_count());
1233 EXPECT_EQ(main_url, root->current_url()); 1264 EXPECT_EQ(main_url, root->current_url());
1234 EXPECT_EQ(GURL(), child->current_url()); 1265 EXPECT_EQ(GURL(), child->current_url());
1235 1266
1236 EXPECT_FALSE( 1267 EXPECT_FALSE(
1237 child->current_frame_host()->render_view_host()->IsRenderViewLive()); 1268 child->current_frame_host()->render_view_host()->IsRenderViewLive());
1238 EXPECT_FALSE(child->current_frame_host()->IsRenderFrameLive()); 1269 EXPECT_FALSE(child->current_frame_host()->IsRenderFrameLive());
1239 EXPECT_FALSE(child->current_frame_host()->render_frame_created_); 1270 EXPECT_FALSE(child->current_frame_host()->render_frame_created_);
1240 1271
1241 // Now crash the top-level page to clear the child frame. 1272 // Now crash the top-level page to clear the child frame.
1242 { 1273 {
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after
1503 // DidFailProvisionalLoad when navigating to client_redirect_http_url. 1534 // DidFailProvisionalLoad when navigating to client_redirect_http_url.
1504 EXPECT_EQ(observer.last_navigation_url(), client_redirect_http_url); 1535 EXPECT_EQ(observer.last_navigation_url(), client_redirect_http_url);
1505 EXPECT_FALSE(observer.last_navigation_succeeded()); 1536 EXPECT_FALSE(observer.last_navigation_succeeded());
1506 } 1537 }
1507 } 1538 }
1508 1539
1509 // Ensure that when navigating a frame cross-process RenderFrameProxyHosts are 1540 // Ensure that when navigating a frame cross-process RenderFrameProxyHosts are
1510 // created in the FrameTree skipping the subtree of the navigating frame. 1541 // created in the FrameTree skipping the subtree of the navigating frame.
1511 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 1542 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
1512 ProxyCreationSkipsSubtree) { 1543 ProxyCreationSkipsSubtree) {
1513 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); 1544 GURL main_url(embedded_test_server()->GetURL(
1545 "a.com", "/cross_site_iframe_factory.html?a(a,a(a,a(a)))"));
1514 NavigateToURL(shell(), main_url); 1546 NavigateToURL(shell(), main_url);
1515 1547
1516 // It is safe to obtain the root frame tree node here, as it doesn't change. 1548 // It is safe to obtain the root frame tree node here, as it doesn't change.
1517 FrameTreeNode* root = 1549 FrameTreeNode* root =
1518 static_cast<WebContentsImpl*>(shell()->web_contents())-> 1550 static_cast<WebContentsImpl*>(shell()->web_contents())->
1519 GetFrameTree()->root(); 1551 GetFrameTree()->root();
1520 1552
1521 EXPECT_TRUE(root->child_at(1) != NULL); 1553 EXPECT_TRUE(root->child_at(1) != NULL);
1522 EXPECT_EQ(2U, root->child_at(1)->child_count()); 1554 EXPECT_EQ(2U, root->child_at(1)->child_count());
1523 1555
1524 { 1556 {
1525 // Load same-site page into iframe. 1557 // Load same-site page into iframe.
1526 TestNavigationObserver observer(shell()->web_contents()); 1558 TestNavigationObserver observer(shell()->web_contents());
1527 GURL http_url(embedded_test_server()->GetURL("/title1.html")); 1559 GURL http_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
1528 NavigateFrameToURL(root->child_at(0), http_url); 1560 NavigateFrameToURL(root->child_at(0), http_url);
1529 EXPECT_EQ(http_url, observer.last_navigation_url()); 1561 EXPECT_EQ(http_url, observer.last_navigation_url());
1530 EXPECT_TRUE(observer.last_navigation_succeeded()); 1562 EXPECT_TRUE(observer.last_navigation_succeeded());
1531 EXPECT_EQ( 1563 EXPECT_EQ(
1532 " Site A\n" 1564 " Site A\n"
1533 " |--Site A\n" 1565 " |--Site A\n"
1534 " +--Site A\n" 1566 " +--Site A\n"
1535 " |--Site A\n" 1567 " |--Site A\n"
1536 " +--Site A\n" 1568 " +--Site A\n"
1537 " +--Site A\n" 1569 " +--Site A\n"
1538 "Where A = http://127.0.0.1/", 1570 "Where A = http://a.com/",
1539 DepictFrameTree(root)); 1571 DepictFrameTree(root));
1540 } 1572 }
1541 1573
1542 // Create the cross-site URL to navigate to. 1574 // Create the cross-site URL to navigate to.
1543 GURL cross_site_url = 1575 GURL cross_site_url =
1544 embedded_test_server()->GetURL("foo.com", "/frame_tree/1-1.html"); 1576 embedded_test_server()->GetURL("foo.com", "/frame_tree/1-1.html");
1545 1577
1546 // Load cross-site page into the second iframe without waiting for the 1578 // Load cross-site page into the second iframe without waiting for the
1547 // navigation to complete. Once LoadURLWithParams returns, we would expect 1579 // navigation to complete. Once LoadURLWithParams returns, we would expect
1548 // proxies to have been created in the frame tree, but children of the 1580 // proxies to have been created in the frame tree, but children of the
(...skipping 23 matching lines...) Expand all
1572 } 1604 }
1573 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site); 1605 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site);
1574 1606
1575 std::string tree = base::StringPrintf( 1607 std::string tree = base::StringPrintf(
1576 " Site A ------------ proxies for B\n" 1608 " Site A ------------ proxies for B\n"
1577 " |--Site A ------- proxies for B\n" 1609 " |--Site A ------- proxies for B\n"
1578 " +--Site A (B %s)\n" 1610 " +--Site A (B %s)\n"
1579 " |--Site A\n" 1611 " |--Site A\n"
1580 " +--Site A\n" 1612 " +--Site A\n"
1581 " +--Site A\n" 1613 " +--Site A\n"
1582 "Where A = http://127.0.0.1/\n" 1614 "Where A = http://a.com/\n"
1583 " B = http://foo.com/", 1615 " B = http://foo.com/",
1584 cross_site_rfh_type.c_str()); 1616 cross_site_rfh_type.c_str());
1585 EXPECT_EQ(tree, DepictFrameTree(root)); 1617 EXPECT_EQ(tree, DepictFrameTree(root));
1586 1618
1587 // Now that the verification is done, run the message loop and wait for the 1619 // Now that the verification is done, run the message loop and wait for the
1588 // navigation to complete. 1620 // navigation to complete.
1589 navigation_observer.Wait(); 1621 navigation_observer.Wait();
1590 EXPECT_FALSE(child->render_manager()->pending_frame_host()); 1622 EXPECT_FALSE(child->render_manager()->pending_frame_host());
1591 EXPECT_TRUE(observer.last_navigation_succeeded()); 1623 EXPECT_TRUE(observer.last_navigation_succeeded());
1592 EXPECT_EQ(cross_site_url, observer.last_navigation_url()); 1624 EXPECT_EQ(cross_site_url, observer.last_navigation_url());
1593 1625
1594 EXPECT_EQ( 1626 EXPECT_EQ(
1595 " Site A ------------ proxies for B\n" 1627 " Site A ------------ proxies for B\n"
1596 " |--Site A ------- proxies for B\n" 1628 " |--Site A ------- proxies for B\n"
1597 " +--Site B ------- proxies for A\n" 1629 " +--Site B ------- proxies for A\n"
1598 "Where A = http://127.0.0.1/\n" 1630 "Where A = http://a.com/\n"
1599 " B = http://foo.com/", 1631 " B = http://foo.com/",
1600 DepictFrameTree(root)); 1632 DepictFrameTree(root));
1601 } 1633 }
1602 1634
1603 // Load another cross-site page into the same iframe. 1635 // Load another cross-site page into the same iframe.
1604 cross_site_url = embedded_test_server()->GetURL("bar.com", "/title2.html"); 1636 cross_site_url = embedded_test_server()->GetURL("bar.com", "/title2.html");
1605 { 1637 {
1606 // Perform the same checks as the first cross-site navigation, since 1638 // Perform the same checks as the first cross-site navigation, since
1607 // there have been issues in subsequent cross-site navigations. Also ensure 1639 // there have been issues in subsequent cross-site navigations. Also ensure
1608 // that the SiteInstance has properly changed. 1640 // that the SiteInstance has properly changed.
(...skipping 15 matching lines...) Expand all
1624 } else { 1656 } else {
1625 site2 = child->render_manager()->pending_frame_host()->GetSiteInstance(); 1657 site2 = child->render_manager()->pending_frame_host()->GetSiteInstance();
1626 } 1658 }
1627 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site2); 1659 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site2);
1628 EXPECT_NE(site, site2); 1660 EXPECT_NE(site, site2);
1629 1661
1630 std::string tree = base::StringPrintf( 1662 std::string tree = base::StringPrintf(
1631 " Site A ------------ proxies for B C\n" 1663 " Site A ------------ proxies for B C\n"
1632 " |--Site A ------- proxies for B C\n" 1664 " |--Site A ------- proxies for B C\n"
1633 " +--Site B (C %s) -- proxies for A\n" 1665 " +--Site B (C %s) -- proxies for A\n"
1634 "Where A = http://127.0.0.1/\n" 1666 "Where A = http://a.com/\n"
1635 " B = http://foo.com/\n" 1667 " B = http://foo.com/\n"
1636 " C = http://bar.com/", 1668 " C = http://bar.com/",
1637 cross_site_rfh_type.c_str()); 1669 cross_site_rfh_type.c_str());
1638 EXPECT_EQ(tree, DepictFrameTree(root)); 1670 EXPECT_EQ(tree, DepictFrameTree(root));
1639 1671
1640 navigation_observer.Wait(); 1672 navigation_observer.Wait();
1641 EXPECT_TRUE(observer.last_navigation_succeeded()); 1673 EXPECT_TRUE(observer.last_navigation_succeeded());
1642 EXPECT_EQ(cross_site_url, observer.last_navigation_url()); 1674 EXPECT_EQ(cross_site_url, observer.last_navigation_url());
1643 EXPECT_EQ(0U, child->child_count()); 1675 EXPECT_EQ(0U, child->child_count());
1644 } 1676 }
(...skipping 1343 matching lines...) Expand 10 before | Expand all | Expand 10 after
2988 success = false; 3020 success = false;
2989 EXPECT_TRUE(ExecuteScriptAndExtractBool( 3021 EXPECT_TRUE(ExecuteScriptAndExtractBool(
2990 popup_root->child_at(1)->current_frame_host(), 3022 popup_root->child_at(1)->current_frame_host(),
2991 "window.domAutomationController.send(" 3023 "window.domAutomationController.send("
2992 " window.opener === window.opener.parent.frames['frame1']);", 3024 " window.opener === window.opener.parent.frames['frame1']);",
2993 &success)); 3025 &success));
2994 EXPECT_TRUE(success); 3026 EXPECT_TRUE(success);
2995 } 3027 }
2996 3028
2997 } // namespace content 3029 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/site_per_process_browsertest.h ('k') | content/test/data/cross_site_iframe_factory.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698