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

Side by Side Diff: content/browser/frame_host/render_frame_host_manager_browsertest.cc

Issue 1886413002: Always swap with a replacement proxy in OnSwapOut. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Charlie's comments Created 4 years, 7 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <set> 8 #include <set>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 2383 matching lines...) Expand 10 before | Expand all | Expand 10 after
2394 commit_observer.WaitForCommit(); 2394 commit_observer.WaitForCommit();
2395 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), 2395 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
2396 new_shell->web_contents()->GetSiteInstance()); 2396 new_shell->web_contents()->GetSiteInstance());
2397 EXPECT_TRUE(root->render_manager()->GetRenderFrameProxyHost(site_instance_a)); 2397 EXPECT_TRUE(root->render_manager()->GetRenderFrameProxyHost(site_instance_a));
2398 2398
2399 // The previous RFH should still be pending deletion, as we wait for either 2399 // The previous RFH should still be pending deletion, as we wait for either
2400 // the SwapOut ACK or a timeout. 2400 // the SwapOut ACK or a timeout.
2401 ASSERT_TRUE(rfh_a->IsRenderFrameLive()); 2401 ASSERT_TRUE(rfh_a->IsRenderFrameLive());
2402 ASSERT_FALSE(rfh_a->is_active()); 2402 ASSERT_FALSE(rfh_a->is_active());
2403 2403
2404 // The corresponding RVH should not be pending deletion due to the proxy. 2404 // The corresponding RVH should still be referenced by the proxy and the old
2405 EXPECT_FALSE(root->render_manager()->IsViewPendingDeletion( 2405 // frame.
2406 rfh_a->render_view_host())); 2406 RenderViewHostImpl* rvh_a = rfh_a->render_view_host();
2407 EXPECT_EQ(2, rvh_a->ref_count());
2407 2408
2408 // Kill the old process. 2409 // Kill the old process.
2409 RenderProcessHost* process = rfh_a->GetProcess(); 2410 RenderProcessHost* process = rfh_a->GetProcess();
2410 RenderProcessHostWatcher crash_observer( 2411 RenderProcessHostWatcher crash_observer(
2411 process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); 2412 process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
2412 process->Shutdown(0, false); 2413 process->Shutdown(0, false);
2413 crash_observer.Wait(); 2414 crash_observer.Wait();
2414 EXPECT_FALSE(popup_root->current_frame_host()->IsRenderFrameLive()); 2415 EXPECT_FALSE(popup_root->current_frame_host()->IsRenderFrameLive());
2415 // |rfh_a| is now deleted, thanks to the bug fix. 2416 // |rfh_a| is now deleted, thanks to the bug fix.
2416 2417
2418 // With |rfh_a| gone, the RVH should only be referenced by the (dead) proxy.
2419 EXPECT_EQ(1, rvh_a->ref_count());
2420 EXPECT_TRUE(root->render_manager()->GetRenderFrameProxyHost(site_instance_a));
2421 EXPECT_FALSE(root->render_manager()
2422 ->GetRenderFrameProxyHost(site_instance_a)
2423 ->is_render_frame_proxy_live());
2424
2417 // Close the popup so there is no proxy for a.com in the original tab. 2425 // Close the popup so there is no proxy for a.com in the original tab.
2418 new_shell->Close(); 2426 new_shell->Close();
2419 EXPECT_FALSE( 2427 EXPECT_FALSE(
2420 root->render_manager()->GetRenderFrameProxyHost(site_instance_a)); 2428 root->render_manager()->GetRenderFrameProxyHost(site_instance_a));
2421 2429
2430 // This should delete the RVH as well.
2431 EXPECT_FALSE(root->frame_tree()->GetRenderViewHost(site_instance_a));
2432
2422 // Go back in the main frame from b.com to a.com. In https://crbug.com/581912, 2433 // Go back in the main frame from b.com to a.com. In https://crbug.com/581912,
2423 // the browser process would crash here because there was no main frame 2434 // the browser process would crash here because there was no main frame
2424 // routing ID or proxy in RVHI::CreateRenderView. 2435 // routing ID or proxy in RVHI::CreateRenderView.
2425 { 2436 {
2426 TestNavigationObserver back_nav_load_observer(shell()->web_contents()); 2437 TestNavigationObserver back_nav_load_observer(shell()->web_contents());
2427 shell()->web_contents()->GetController().GoBack(); 2438 shell()->web_contents()->GetController().GoBack();
2428 back_nav_load_observer.Wait(); 2439 back_nav_load_observer.Wait();
2429 } 2440 }
2430 } 2441 }
2431 2442
(...skipping 15 matching lines...) Expand all
2447 // Navigate the tab to a different site, and only wait for commit, not load 2458 // Navigate the tab to a different site, and only wait for commit, not load
2448 // stop. 2459 // stop.
2449 RenderFrameHostImpl* rfh_a = root->current_frame_host(); 2460 RenderFrameHostImpl* rfh_a = root->current_frame_host();
2450 rfh_a->DisableSwapOutTimerForTesting(); 2461 rfh_a->DisableSwapOutTimerForTesting();
2451 SiteInstanceImpl* site_instance_a = rfh_a->GetSiteInstance(); 2462 SiteInstanceImpl* site_instance_a = rfh_a->GetSiteInstance();
2452 TestFrameNavigationObserver commit_observer(root); 2463 TestFrameNavigationObserver commit_observer(root);
2453 shell()->LoadURL(embedded_test_server()->GetURL("b.com", "/title2.html")); 2464 shell()->LoadURL(embedded_test_server()->GetURL("b.com", "/title2.html"));
2454 commit_observer.WaitForCommit(); 2465 commit_observer.WaitForCommit();
2455 EXPECT_NE(site_instance_a, shell()->web_contents()->GetSiteInstance()); 2466 EXPECT_NE(site_instance_a, shell()->web_contents()->GetSiteInstance());
2456 2467
2457 // The previous RFH and RVH should still be pending deletion, as we wait for 2468 // The previous RFH should still be pending deletion, as we wait for either
2458 // either the SwapOut ACK or a timeout. 2469 // the SwapOut ACK or a timeout.
2459 ASSERT_TRUE(rfh_a->IsRenderFrameLive()); 2470 ASSERT_TRUE(rfh_a->IsRenderFrameLive());
2460 ASSERT_FALSE(rfh_a->is_active()); 2471 ASSERT_FALSE(rfh_a->is_active());
2461 EXPECT_TRUE(root->render_manager()->IsViewPendingDeletion( 2472
2462 rfh_a->render_view_host())); 2473 // When the previous RFH was swapped out, it should have still gotten a
2474 // replacement proxy even though it's the last active frame in the process.
2475 EXPECT_TRUE(root->render_manager()->GetRenderFrameProxyHost(site_instance_a));
2463 2476
2464 // Open a popup in the new B process. 2477 // Open a popup in the new B process.
2465 Shell* new_shell = 2478 Shell* new_shell =
2466 OpenPopup(shell()->web_contents(), GURL(url::kAboutBlankURL), "foo"); 2479 OpenPopup(shell()->web_contents(), GURL(url::kAboutBlankURL), "foo");
2467 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(), 2480 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(),
2468 new_shell->web_contents()->GetSiteInstance()); 2481 new_shell->web_contents()->GetSiteInstance());
2469 2482
2470 // Navigate the popup to the original site, but don't wait for commit (which 2483 // Navigate the popup to the original site, but don't wait for commit (which
2471 // won't happen). This creates a proxy in the original tab, alongside the 2484 // won't happen). This should reuse the proxy in the original tab, which at
2472 // RFH and RVH pending deletion. 2485 // this point exists alongside the RFH pending deletion.
2473 new_shell->LoadURL(embedded_test_server()->GetURL("a.com", "/title2.html")); 2486 new_shell->LoadURL(embedded_test_server()->GetURL("a.com", "/title2.html"));
2474 EXPECT_TRUE(root->render_manager()->GetRenderFrameProxyHost(site_instance_a)); 2487 EXPECT_TRUE(root->render_manager()->GetRenderFrameProxyHost(site_instance_a));
2475 2488
2476 // Kill the old process. 2489 // Kill the old process.
2477 RenderProcessHost* process = rfh_a->GetProcess(); 2490 RenderProcessHost* process = rfh_a->GetProcess();
2478 RenderProcessHostWatcher crash_observer( 2491 RenderProcessHostWatcher crash_observer(
2479 process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); 2492 process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
2480 process->Shutdown(0, false); 2493 process->Shutdown(0, false);
2481 crash_observer.Wait(); 2494 crash_observer.Wait();
2482 // |rfh_a| is now deleted, thanks to the bug fix. 2495 // |rfh_a| is now deleted, thanks to the bug fix.
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
2682 // Accessing a property with normal security checks should throw a 2695 // Accessing a property with normal security checks should throw a
2683 // SecurityError if the same-origin windows are in different processes. 2696 // SecurityError if the same-origin windows are in different processes.
2684 EXPECT_THAT(result, 2697 EXPECT_THAT(result,
2685 ::testing::MatchesRegex("SecurityError: Blocked a frame with " 2698 ::testing::MatchesRegex("SecurityError: Blocked a frame with "
2686 "origin \"http://a.com:\\d+\" from " 2699 "origin \"http://a.com:\\d+\" from "
2687 "accessing a cross-origin frame.")); 2700 "accessing a cross-origin frame."));
2688 } 2701 }
2689 } 2702 }
2690 2703
2691 } // namespace content 2704 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698