Index: content/browser/frame_host/navigation_controller_impl_browsertest.cc |
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc |
index db6deecf05b40ba85fbf6a58ff511424da894e12..eeb15ca4e4bef876004ec1308aceddae0856a06b 100644 |
--- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc |
+++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc |
@@ -6870,4 +6870,118 @@ IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, |
controller.GetLastCommittedEntry()->GetURL().spec()); |
} |
+// If the main frame does a load, it should not be reported as a subframe |
+// navigation. This used to occur in the following case: |
+// 1. You're on a site with frames. |
+// 2. You do a subframe navigation. This was stored with transition type |
+// MANUAL_SUBFRAME. |
+// 3. You navigate to some non-frame site. |
+// 4. You navigate back to the page from step 2. Since it was initially |
+// MANUAL_SUBFRAME, it will be that same transition type here. |
+// We don't want that, because any navigation that changes the toplevel frame |
+// should be tracked as a toplevel navigation (this allows us to update the URL |
+// bar, etc). |
+IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, |
+ GoBackToManualSubFrame) { |
+ GURL main_url(embedded_test_server()->GetURL( |
+ "/navigation_controller/page_with_iframe.html")); |
+ EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
+ |
+ FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) |
+ ->GetFrameTree() |
+ ->root(); |
+ |
+ ASSERT_EQ(1U, root->child_count()); |
+ ASSERT_NE(nullptr, root->child_at(0)); |
+ |
+ { |
+ // Iframe initial load. |
+ LoadCommittedCapturer capturer(root->child_at(0)); |
+ GURL frame_url(embedded_test_server()->GetURL( |
+ "/navigation_controller/simple_page_1.html")); |
+ NavigateFrameToURL(root->child_at(0), frame_url); |
+ capturer.Wait(); |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ capturer.transition_type(), ui::PAGE_TRANSITION_AUTO_SUBFRAME)); |
+ } |
+ |
+ { |
+ // Iframe manual navigation. |
+ FrameNavigateParamsCapturer capturer(root->child_at(0)); |
+ GURL frame_url(embedded_test_server()->GetURL( |
+ "/navigation_controller/simple_page_2.html")); |
+ NavigateFrameToURL(root->child_at(0), frame_url); |
+ capturer.Wait(); |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ capturer.transition(), ui::PAGE_TRANSITION_MANUAL_SUBFRAME)); |
+ EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.navigation_type()); |
+ } |
+ |
+ { |
+ // Main frame navigation. |
+ FrameNavigateParamsCapturer capturer(root); |
+ GURL main_url_2(embedded_test_server()->GetURL( |
+ "/navigation_controller/simple_page_2.html")); |
+ NavigateFrameToURL(root, main_url_2); |
+ capturer.Wait(); |
+ EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, capturer.navigation_type()); |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ capturer.transition(), ui::PAGE_TRANSITION_LINK)); |
+ } |
+ |
+ { |
+ // Check the history before going back. |
+ NavigationControllerImpl& controller = |
+ static_cast<NavigationControllerImpl&>( |
+ shell()->web_contents()->GetController()); |
+ EXPECT_EQ(3, controller.GetEntryCount()); |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ controller.GetEntryAtIndex(0)->GetTransitionType(), |
+ ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | |
+ ui::PAGE_TRANSITION_FROM_ADDRESS_BAR))); |
+ // TODO(creis, arthursonzogni): The correct PageTransition is still an open |
+ // question. Maybe PAGE_TRANSITION_MANUAL_SUBFRAME is more appropriate. |
+ // Please see https://crbug.com/740461. |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ controller.GetEntryAtIndex(1)->GetTransitionType(), |
+ ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | |
+ ui::PAGE_TRANSITION_FROM_ADDRESS_BAR))); |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ controller.GetEntryAtIndex(2)->GetTransitionType(), |
+ ui::PAGE_TRANSITION_LINK)); |
+ } |
+ |
+ { |
+ // Back. |
+ FrameNavigateParamsCapturer capturer(root); |
+ shell()->web_contents()->GetController().GoBack(); |
+ capturer.Wait(); |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ capturer.transition(), |
+ ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | |
+ ui::PAGE_TRANSITION_FORWARD_BACK | |
+ ui::PAGE_TRANSITION_FROM_ADDRESS_BAR))); |
+ } |
+ |
+ { |
+ // Check the history again. |
+ NavigationControllerImpl& controller = |
+ static_cast<NavigationControllerImpl&>( |
+ shell()->web_contents()->GetController()); |
+ EXPECT_EQ(3, controller.GetEntryCount()); |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ controller.GetEntryAtIndex(0)->GetTransitionType(), |
+ ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | |
+ ui::PAGE_TRANSITION_FROM_ADDRESS_BAR))); |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ controller.GetEntryAtIndex(1)->GetTransitionType(), |
+ ui::PageTransitionFromInt(ui::PAGE_TRANSITION_TYPED | |
+ ui::PAGE_TRANSITION_FORWARD_BACK | |
+ ui::PAGE_TRANSITION_FROM_ADDRESS_BAR))); |
+ EXPECT_TRUE(ui::PageTransitionTypeIncludingQualifiersIs( |
+ controller.GetEntryAtIndex(2)->GetTransitionType(), |
+ ui::PAGE_TRANSITION_LINK)); |
+ } |
+} |
+ |
} // namespace content |