Index: content/browser/renderer_host/render_process_host_unittest.cc |
diff --git a/content/browser/renderer_host/render_process_host_unittest.cc b/content/browser/renderer_host/render_process_host_unittest.cc |
index a846c714b2d15978fdff482ab6db010f76491edb..13825258663da34a2260345b379d40f1a580f3d9 100644 |
--- a/content/browser/renderer_host/render_process_host_unittest.cc |
+++ b/content/browser/renderer_host/render_process_host_unittest.cc |
@@ -10,14 +10,20 @@ |
#include "base/memory/ptr_util.h" |
#include "build/build_config.h" |
+#include "content/common/frame_messages.h" |
+#include "content/public/browser/content_browser_client.h" |
+#include "content/public/common/browser_side_navigation_policy.h" |
#include "content/public/common/content_constants.h" |
#include "content/public/test/mock_render_process_host.h" |
#include "content/public/test/test_utils.h" |
+#include "content/test/test_render_frame_host.h" |
#include "content/test/test_render_view_host.h" |
+#include "content/test/test_web_contents.h" |
+#include "third_party/WebKit/public/web/WebSandboxFlags.h" |
namespace content { |
-class RenderProcessHostUnitTest : public RenderViewHostTestHarness {}; |
+class RenderProcessHostUnitTest : public RenderViewHostImplTestHarness {}; |
// Tests that guest RenderProcessHosts are not considered suitable hosts when |
// searching for RenderProcessHost. |
@@ -84,4 +90,392 @@ TEST_F(RenderProcessHostUnitTest, NoRendererProcessLimitOnAndroid) { |
} |
#endif |
+// Tests that RenderProcessHost reuse considers committed sites correctly. |
+TEST_F(RenderProcessHostUnitTest, ReuseCommittedSite) { |
+ const GURL kUrl1("http://foo.com"); |
+ const GURL kUrl2("http://bar.com"); |
+ |
+ // At first, trying to get a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. |
+ scoped_refptr<SiteInstanceImpl> site_instance = |
+ SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Have the main frame navigate to the first url. Getting a RenderProcessHost |
+ // with the REUSE_PENDING_OR_COMMITTED_SITE policy should now return the |
+ // process of the main RFH. |
+ NavigateAndCommit(kUrl1); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Navigate away. Getting a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should again return a new process. |
+ NavigateAndCommit(kUrl2); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Now add a subframe that navigates to kUrl1. Getting a RenderProcessHost |
+ // with the REUSE_PENDING_OR_COMMITTED_SITE policy for kUrl1 should now |
+ // return the process of the subframe RFH. |
+ std::string unique_name("uniqueName0"); |
+ main_test_rfh()->OnCreateChildFrame( |
+ process()->GetNextRoutingID(), blink::WebTreeScopeType::kDocument, |
+ std::string(), unique_name, blink::WebSandboxFlags::kNone, |
+ ParsedFeaturePolicyHeader(), FrameOwnerProperties()); |
+ TestRenderFrameHost* subframe = static_cast<TestRenderFrameHost*>( |
+ contents()->GetFrameTree()->root()->child_at(0)->current_frame_host()); |
+ { |
+ FrameHostMsg_DidCommitProvisionalLoad_Params params; |
+ params.nav_entry_id = 0; |
+ params.frame_unique_name = unique_name; |
+ params.did_create_new_entry = false; |
+ params.url = kUrl1; |
+ params.transition = ui::PAGE_TRANSITION_AUTO_SUBFRAME; |
+ params.should_update_history = false; |
+ params.gesture = NavigationGestureUser; |
+ params.method = "GET"; |
+ params.page_state = PageState::CreateFromURL(kUrl1); |
+ subframe->SendRendererInitiatedNavigationRequest(kUrl1, false); |
+ subframe->PrepareForCommit(); |
+ subframe->SendNavigateWithParams(¶ms); |
+ } |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(subframe->GetProcess(), site_instance->GetProcess()); |
+} |
+ |
+// Tests that RenderProcessHost will not consider reusing a process that has |
+// committed an error page. |
+TEST_F(RenderProcessHostUnitTest, DoNotReuseError) { |
+ const GURL kUrl1("http://foo.com"); |
+ const GURL kUrl2("http://bar.com"); |
+ |
+ // At first, trying to get a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. |
+ scoped_refptr<SiteInstanceImpl> site_instance = |
+ SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Have the main frame navigate to the first url. Getting a RenderProcessHost |
+ // with the REUSE_PENDING_OR_COMMITTED_SITE policy should now return the |
+ // process of the main RFH. |
+ NavigateAndCommit(kUrl1); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Navigate away. Getting a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should again return a new process. |
+ NavigateAndCommit(kUrl2); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Navigate back and simulate an error. Getting a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. |
+ web_contents()->GetController().GoBack(); |
+ TestRenderFrameHost* pending_rfh = contents()->GetPendingMainFrame(); |
+ if (!IsBrowserSideNavigationEnabled()) |
+ pending_rfh->SimulateNavigationStart(kUrl1); |
+ pending_rfh->SimulateNavigationError(kUrl1, net::ERR_TIMED_OUT); |
+ pending_rfh->SimulateNavigationErrorPageCommit(); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+} |
+ |
+// Tests that RenderProcessHost reuse considers navigations correctly. |
+TEST_F(RenderProcessHostUnitTest, ReuseNavigationProcess) { |
+ // This is only applicable to PlzNavigate. |
+ if (!IsBrowserSideNavigationEnabled()) |
+ return; |
+ |
+ const GURL kUrl1("http://foo.com"); |
+ const GURL kUrl2("http://bar.com"); |
+ |
+ // At first, trying to get a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. |
+ scoped_refptr<SiteInstanceImpl> site_instance = |
+ SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Start a navigation. Now Getting RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current process. |
+ main_test_rfh()->SimulateNavigationStart(kUrl1); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl1); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Finish the navigation and start a new cross-site one. Getting |
+ // RenderProcessHost with the REUSE_PENDING_OR_COMMITTED_SITE policy should |
+ // return the process of the speculative RenderFrameHost. |
+ main_test_rfh()->PrepareForCommit(); |
+ main_test_rfh()->SendNavigate(0, true, kUrl1); |
+ contents()->GetController().LoadURL(kUrl2, Referrer(), |
+ ui::PAGE_TRANSITION_TYPED, std::string()); |
+ main_test_rfh()->SendBeforeUnloadACK(true); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl2); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(contents()->GetPendingMainFrame()->GetProcess(), |
+ site_instance->GetProcess()); |
+ |
+ // Remember the process id and cancel the navigation. Getting |
+ // RenderProcessHost with the REUSE_PENDING_OR_COMMITTED_SITE policy should |
+ // no longer return the process of the speculative RenderFrameHost. |
+ int speculative_process_host_id = |
+ contents()->GetPendingMainFrame()->GetProcess()->GetID(); |
+ contents()->GetPendingMainFrame()->SimulateNavigationError(kUrl2, |
+ net::ERR_ABORTED); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl2); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(speculative_process_host_id, site_instance->GetProcess()->GetID()); |
+} |
+ |
+// Tests that RenderProcessHost reuse considers navigations correctly during |
+// redirects. |
+TEST_F(RenderProcessHostUnitTest, ReuseNavigationProcessRedirects) { |
+ // This is only applicable to PlzNavigate. |
+ if (!IsBrowserSideNavigationEnabled()) |
+ return; |
+ |
+ const GURL kUrl("http://foo.com"); |
+ const GURL kRedirectUrl1("http://foo.com/redirect"); |
+ const GURL kRedirectUrl2("http://bar.com"); |
+ |
+ // At first, trying to get a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. |
+ scoped_refptr<SiteInstanceImpl> site_instance = |
+ SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Start a navigation. Now getting RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current process. |
+ main_test_rfh()->SimulateNavigationStart(kUrl); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Simulate a same-site redirect. Getting RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return the current process. |
+ main_test_rfh()->SimulateRedirect(kRedirectUrl1); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Simulate a cross-site redirect. Getting RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should not return the current |
+ // process, whether for the old site or the new site. |
+ main_test_rfh()->SimulateRedirect(kRedirectUrl2); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ site_instance = |
+ SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Once the navigation is ready to commit, Getting RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should not return the current |
+ // process for the final site, but not the initial one. |
+ main_test_rfh()->PrepareForCommit(); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ site_instance = |
+ SiteInstanceImpl::CreateForURL(browser_context(), kRedirectUrl2); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+} |
+ |
+class EffectiveURLContentBrowserClient : public ContentBrowserClient { |
+ public: |
+ EffectiveURLContentBrowserClient(const GURL& url_to_modify, |
+ const GURL& url_to_return) |
+ : url_to_modify_(url_to_modify), url_to_return_(url_to_return) {} |
+ ~EffectiveURLContentBrowserClient() override {} |
+ |
+ private: |
+ GURL GetEffectiveURL(BrowserContext* browser_context, |
+ const GURL& url) override { |
+ if (url == url_to_modify_) |
+ return url_to_return_; |
+ return url; |
+ } |
+ |
+ GURL url_to_modify_; |
+ GURL url_to_return_; |
+}; |
+ |
+// Tests that RenderProcessHost reuse works correctly even if the site URL of a |
+// URL changes. |
+TEST_F(RenderProcessHostUnitTest, ReuseSiteURLChanges) { |
+ const GURL kUrl("http://foo.com"); |
+ const GURL kModifiedSiteUrl("custom-scheme://custom"); |
+ |
+ // At first, trying to get a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. |
+ scoped_refptr<SiteInstanceImpl> site_instance = |
+ SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Have the main frame navigate to the first url. Getting a RenderProcessHost |
+ // with the REUSE_PENDING_OR_COMMITTED_SITE policy should now return the |
+ // process of the main RFH. |
+ NavigateAndCommit(kUrl); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Install the custom ContentBrowserClient. Site URLs are now modified. |
+ // Getting a RenderProcessHost with the REUSE_PENDING_OR_COMMITTED_SITE policy |
+ // should no longer return the process of the main RFH, as the RFH is |
+ // registered with the normal site URL. |
+ EffectiveURLContentBrowserClient modified_client(kUrl, kModifiedSiteUrl); |
+ ContentBrowserClient* regular_client = |
+ SetBrowserClientForTesting(&modified_client); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Reload. Getting a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should now return the process of the |
+ // main RFH, as it is now registered with the modified site URL. |
+ contents()->GetController().Reload(ReloadType::NORMAL, false); |
+ main_test_rfh()->PrepareForCommit(); |
+ main_test_rfh()->SendNavigate(0, true, kUrl); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Remove the custom ContentBrowserClient. Site URLs are back to normal. |
+ // Getting a RenderProcessHost with the REUSE_PENDING_OR_COMMITTED_SITE policy |
+ // should no longer return the process of the main RFH, as it is registered |
+ // with the modified site URL. |
+ SetBrowserClientForTesting(regular_client); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Reload. Getting a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should now return the process of the |
+ // main RFH, as it is now registered with the regular site URL. |
+ contents()->GetController().Reload(ReloadType::NORMAL, false); |
+ main_test_rfh()->PrepareForCommit(); |
+ main_test_rfh()->SendNavigate(0, true, kUrl); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+} |
+ |
+// Tests that RenderProcessHost reuse works correctly even if the site URL of a |
+// URL we're navigating to changes. |
+TEST_F(RenderProcessHostUnitTest, ReuseExpectedSiteURLChanges) { |
+ // This is only applicable to PlzNavigate. |
+ if (!IsBrowserSideNavigationEnabled()) |
+ return; |
+ |
+ const GURL kUrl("http://foo.com"); |
+ const GURL kModifiedSiteUrl("custom-scheme://custom"); |
+ |
+ // At first, trying to get a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return a new process. |
+ scoped_refptr<SiteInstanceImpl> site_instance = |
+ SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Start a navigation. Getting a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should now return the process of the |
+ // main RFH. |
+ main_test_rfh()->SimulateNavigationStart(kUrl); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Install the custom ContentBrowserClient. Site URLs are now modified. |
+ // Getting a RenderProcessHost with the REUSE_PENDING_OR_COMMITTED_SITE policy |
+ // should no longer return the process of the main RFH, as the RFH is |
+ // registered with the normal site URL. |
+ EffectiveURLContentBrowserClient modified_client(kUrl, kModifiedSiteUrl); |
+ ContentBrowserClient* regular_client = |
+ SetBrowserClientForTesting(&modified_client); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Have the navigation commit. Getting a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should now return the process of the |
+ // main RFH, as it was registered with the modified site URL at commit time. |
+ main_test_rfh()->PrepareForCommit(); |
+ main_test_rfh()->SendNavigate(0, true, kUrl); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Start a reload. Getting a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should return the process of the |
+ // main RFH. |
+ contents()->GetController().Reload(ReloadType::NORMAL, false); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Remove the custom ContentBrowserClient. Site URLs are back to normal. |
+ // Getting a RenderProcessHost with the REUSE_PENDING_OR_COMMITTED_SITE policy |
+ // should no longer return the process of the main RFH, as it is registered |
+ // with the modified site URL. |
+ SetBrowserClientForTesting(regular_client); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_NE(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+ |
+ // Finish the reload. Getting a RenderProcessHost with the |
+ // REUSE_PENDING_OR_COMMITTED_SITE policy should now return the process of the |
+ // main RFH, as it was registered with the regular site URL when it committed. |
+ main_test_rfh()->PrepareForCommit(); |
+ main_test_rfh()->SendNavigate(0, true, kUrl); |
+ site_instance = SiteInstanceImpl::CreateForURL(browser_context(), kUrl); |
+ site_instance->set_process_reuse_policy( |
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE); |
+ EXPECT_EQ(main_test_rfh()->GetProcess(), site_instance->GetProcess()); |
+} |
+ |
} // namespace content |