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

Unified Diff: content/browser/frame_host/render_frame_host_manager_browsertest.cc

Issue 2546533007: Store the last committed origin in RenderFrameHostImpl. (Closed)
Patch Set: Rebase (and remove DCHECK) Created 4 years 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/frame_host/render_frame_host_manager_browsertest.cc
diff --git a/content/browser/frame_host/render_frame_host_manager_browsertest.cc b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
index d89d5557b455765428bca2253151f385ec4d9478..f30d331b88ced2fe98878bbaad2bd1404257f4ab 100644
--- a/content/browser/frame_host/render_frame_host_manager_browsertest.cc
+++ b/content/browser/frame_host/render_frame_host_manager_browsertest.cc
@@ -2947,4 +2947,87 @@ IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest,
shell()->web_contents()->GetMainFrame()->GetSiteInstance());
}
+// Verify that GetLastCommittedOrigin() is correct for the full lifetime of a
+// RenderFrameHost, including when it's pending, current, and pending deletion.
+// This is checked both for main frames and subframes. See
+// https://crbug.com/590035.
+IN_PROC_BROWSER_TEST_F(RenderFrameHostManagerTest, LastCommittedOrigin) {
+ StartEmbeddedServer();
+ GURL url_a(embedded_test_server()->GetURL("a.com", "/title1.html"));
+ EXPECT_TRUE(NavigateToURL(shell(), url_a));
+
+ WebContentsImpl* web_contents =
+ static_cast<WebContentsImpl*>(shell()->web_contents());
+ FrameTreeNode* root = web_contents->GetFrameTree()->root();
+ RenderFrameHostImpl* rfh_a = root->current_frame_host();
+ rfh_a->DisableSwapOutTimerForTesting();
+
+ EXPECT_EQ(url::Origin(url_a), rfh_a->GetLastCommittedOrigin());
+ EXPECT_EQ(rfh_a, web_contents->GetMainFrame());
+
+ // Start a navigation to a b.com URL, and don't wait for commit.
+ GURL url_b(embedded_test_server()->GetURL("b.com", "/title2.html"));
+ TestFrameNavigationObserver commit_observer(root);
+ RenderFrameDeletedObserver deleted_observer(rfh_a);
+ shell()->LoadURL(url_b);
+
+ // The pending RFH shouln't have a last committed origin (the default value
+ // is a unique origin). The current RFH shouldn't change its last committed
+ // origin before commit.
+ RenderFrameHostImpl* rfh_b =
+ IsBrowserSideNavigationEnabled()
+ ? root->render_manager()->speculative_frame_host()
+ : root->render_manager()->pending_frame_host();
+ EXPECT_EQ("null", rfh_b->GetLastCommittedOrigin().Serialize());
+ EXPECT_EQ(url::Origin(url_a), rfh_a->GetLastCommittedOrigin());
+
+ // Verify that the last committed origin is set for the b.com RHF once it
+ // commits.
+ commit_observer.WaitForCommit();
+ EXPECT_EQ(url::Origin(url_b), rfh_b->GetLastCommittedOrigin());
+ EXPECT_EQ(rfh_b, web_contents->GetMainFrame());
+
+ // The old RFH should now be pending deletion. Verify it still has correct
+ // last committed origin.
+ EXPECT_EQ(url::Origin(url_a), rfh_a->GetLastCommittedOrigin());
+ EXPECT_FALSE(rfh_a->is_active());
+
+ // Wait for |rfh_a| to be deleted and double-check |rfh_b|'s origin.
+ deleted_observer.WaitUntilDeleted();
+ EXPECT_EQ(url::Origin(url_b), rfh_b->GetLastCommittedOrigin());
+
+ // Navigate to a same-origin page with an about:blank iframe. The iframe
+ // should also have a b.com origin.
+ GURL url_b_with_frame(embedded_test_server()->GetURL(
+ "b.com", "/navigation_controller/page_with_iframe.html"));
+ EXPECT_TRUE(NavigateToURL(shell(), url_b_with_frame));
+ EXPECT_EQ(rfh_b, web_contents->GetMainFrame());
+ EXPECT_EQ(url::Origin(url_b), rfh_b->GetLastCommittedOrigin());
+ FrameTreeNode* child = root->child_at(0);
+ RenderFrameHostImpl* child_rfh_b = root->child_at(0)->current_frame_host();
+ child_rfh_b->DisableSwapOutTimerForTesting();
+ EXPECT_EQ(url::Origin(url_b), child_rfh_b->GetLastCommittedOrigin());
+
+ // Navigate subframe to c.com. Wait for commit but not full load, and then
+ // verify the subframe's origin.
+ GURL url_c(embedded_test_server()->GetURL("c.com", "/title3.html"));
+ {
+ TestFrameNavigationObserver commit_observer(root->child_at(0));
+ EXPECT_TRUE(
+ ExecuteScript(child, "location.href = '" + url_c.spec() + "';"));
+ commit_observer.WaitForCommit();
+ }
+ EXPECT_EQ(url::Origin(url_c),
+ child->current_frame_host()->GetLastCommittedOrigin());
+
+ // With OOPIFs, this navigation used a cross-process transfer. Ensure that
+ // the iframe's old RFH still has correct origin, even though it's pending
+ // deletion.
+ if (AreAllSitesIsolatedForTesting()) {
+ EXPECT_FALSE(child_rfh_b->is_active());
+ EXPECT_NE(child_rfh_b, child->current_frame_host());
+ EXPECT_EQ(url::Origin(url_b), child_rfh_b->GetLastCommittedOrigin());
+ }
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698