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

Unified Diff: content/browser/isolated_origin_browsertest.cc

Issue 2920473005: Consolidate isolated origin subframes into existing processes. (Closed)
Patch Set: Created 3 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/isolated_origin_browsertest.cc
diff --git a/content/browser/isolated_origin_browsertest.cc b/content/browser/isolated_origin_browsertest.cc
index 95dab9968a76fb2a0a846a0661677b75cfabef49..d44a1ba3ee54e0235c566966fa6e90aced6e6740 100644
--- a/content/browser/isolated_origin_browsertest.cc
+++ b/content/browser/isolated_origin_browsertest.cc
@@ -255,6 +255,88 @@ IN_PROC_BROWSER_TEST_F(IsolatedOriginTest,
EXPECT_FALSE(child->current_frame_host()->IsCrossProcessSubframe());
}
+// Check that a new isolated origin subframe will attempt to reuse an existing
+// process for that isolated origin, even across BrowsingInstances. Also check
+// that main frame navigations to an isolated origin keep using the default
+// process model and do not reuse existing processes.
+IN_PROC_BROWSER_TEST_F(IsolatedOriginTest, SubframeReusesExistingProcess) {
+ GURL top_url(
+ embedded_test_server()->GetURL("www.foo.com", "/page_with_iframe.html"));
+ EXPECT_TRUE(NavigateToURL(shell(), top_url));
+ FrameTreeNode* root = web_contents()->GetFrameTree()->root();
+ FrameTreeNode* child = root->child_at(0);
+
+ // Open an unrelated tab in a separate BrowsingInstance, and navigate it to
+ // to an isolated origin. This SiteInstance should have a default process
+ // reuse policy - only subframes attempt process reuse.
+ GURL isolated_url(embedded_test_server()->GetURL("isolated.foo.com",
+ "/page_with_iframe.html"));
+ Shell* second_shell = CreateBrowser();
+ EXPECT_TRUE(NavigateToURL(second_shell, isolated_url));
+ scoped_refptr<SiteInstanceImpl> second_shell_instance =
+ static_cast<SiteInstanceImpl*>(
+ second_shell->web_contents()->GetMainFrame()->GetSiteInstance());
+ EXPECT_FALSE(second_shell_instance->IsRelatedSiteInstance(
+ root->current_frame_host()->GetSiteInstance()));
+ RenderProcessHost* isolated_process = second_shell_instance->GetProcess();
+ EXPECT_EQ(SiteInstanceImpl::ProcessReusePolicy::DEFAULT,
+ second_shell_instance->process_reuse_policy());
+
+ // Now navigate the first tab's subframe to an isolated origin. See that it
+ // reuses the existing |isolated_process|.
+ NavigateIframeToURL(web_contents(), "test_iframe", isolated_url);
+ EXPECT_EQ(isolated_url, child->current_url());
+ EXPECT_EQ(isolated_process, child->current_frame_host()->GetProcess());
+ EXPECT_EQ(
+ SiteInstanceImpl::ProcessReusePolicy::REUSE_PENDING_OR_COMMITTED_SITE,
+ child->current_frame_host()->GetSiteInstance()->process_reuse_policy());
+
+ EXPECT_TRUE(child->current_frame_host()->IsCrossProcessSubframe());
+ EXPECT_EQ(isolated_url.GetOrigin(),
+ child->current_frame_host()->GetSiteInstance()->GetSiteURL());
+
+ // The subframe's SiteInstance should still be different from second_shell's
+ // SiteInstance, and they should be in separate BrowsingInstances.
+ EXPECT_NE(second_shell_instance,
+ child->current_frame_host()->GetSiteInstance());
+ EXPECT_FALSE(second_shell_instance->IsRelatedSiteInstance(
+ child->current_frame_host()->GetSiteInstance()));
+
+ // Navigate the second tab to a normal URL with a same-site subframe. This
+ // leaves only the first tab's subframe in the isolated origin process.
+ EXPECT_TRUE(NavigateToURL(second_shell, top_url));
+ EXPECT_NE(isolated_process,
+ second_shell->web_contents()->GetMainFrame()->GetProcess());
+
+ // Navigate the second tab's subframe to an isolated origin, and check that
+ // this new subframe reuses the isolated process of the subframe in the first
+ // tab, even though the two are in separate BrowsingInstances.
+ NavigateIframeToURL(second_shell->web_contents(), "test_iframe",
+ isolated_url);
+ FrameTreeNode* second_subframe =
+ static_cast<WebContentsImpl*>(second_shell->web_contents())
+ ->GetFrameTree()
+ ->root()
+ ->child_at(0);
+ EXPECT_EQ(isolated_process,
+ second_subframe->current_frame_host()->GetProcess());
+ EXPECT_NE(child->current_frame_host()->GetSiteInstance(),
+ second_subframe->current_frame_host()->GetSiteInstance());
+
+ // Open a third, unrelated tab, navigate it to an isolated origin, and check
+ // that its main frame doesn't share a process with the existing isolated
+ // subframes.
+ Shell* third_shell = CreateBrowser();
+ EXPECT_TRUE(NavigateToURL(third_shell, isolated_url));
+ SiteInstanceImpl* third_shell_instance = static_cast<SiteInstanceImpl*>(
+ third_shell->web_contents()->GetMainFrame()->GetSiteInstance());
+ EXPECT_NE(third_shell_instance,
+ second_subframe->current_frame_host()->GetSiteInstance());
+ EXPECT_NE(third_shell_instance,
+ child->current_frame_host()->GetSiteInstance());
+ EXPECT_NE(third_shell_instance->GetProcess(), isolated_process);
+}
+
// Check that isolated origins can access cookies. This requires cookie checks
// on the IO thread to be aware of isolated origins.
IN_PROC_BROWSER_TEST_F(IsolatedOriginTest, Cookies) {

Powered by Google App Engine
This is Rietveld 408576698