Index: content/browser/frame_host/render_frame_host_manager_unittest.cc |
diff --git a/content/browser/frame_host/render_frame_host_manager_unittest.cc b/content/browser/frame_host/render_frame_host_manager_unittest.cc |
index 7ac3f3727e65ee9b7c8b1bea9d9d35da835e5bd5..6f6d50a3cbd32d0930299b8a36e8bdba5cf20a62 100644 |
--- a/content/browser/frame_host/render_frame_host_manager_unittest.cc |
+++ b/content/browser/frame_host/render_frame_host_manager_unittest.cc |
@@ -2,13 +2,17 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
+#include "base/command_line.h" |
#include "base/files/file_path.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "base/time/time.h" |
#include "content/browser/frame_host/cross_site_transferring_request.h" |
+#include "content/browser/frame_host/navigation_commit_info.h" |
#include "content/browser/frame_host/navigation_controller_impl.h" |
#include "content/browser/frame_host/navigation_entry_impl.h" |
#include "content/browser/frame_host/navigation_request.h" |
#include "content/browser/frame_host/navigator.h" |
+#include "content/browser/frame_host/navigator_impl.h" |
#include "content/browser/frame_host/render_frame_host_manager.h" |
#include "content/browser/site_instance_impl.h" |
#include "content/browser/webui/web_ui_controller_factory_registry.h" |
@@ -23,6 +27,7 @@ |
#include "content/public/browser/web_contents_observer.h" |
#include "content/public/browser/web_ui_controller.h" |
#include "content/public/common/bindings_policy.h" |
+#include "content/public/common/content_switches.h" |
#include "content/public/common/javascript_message_type.h" |
#include "content/public/common/page_transition_types.h" |
#include "content/public/common/url_constants.h" |
@@ -368,6 +373,15 @@ class RenderFrameHostManagerTest |
return manager->navigation_request_for_testing(); |
} |
+ RenderFrameHostImpl* SpeculativeRenderFrameHostForRenderFrameManager( |
+ RenderFrameHostManager* manager) { |
+ return manager->speculative_render_frame_host_.get(); |
+ } |
+ |
+ void EnableBrowserSideNavigation() { |
+ CommandLine::ForCurrentProcess()->AppendSwitch( |
+ switches::kEnableBrowserSideNavigation); |
+ } |
private: |
RenderFrameHostManagerTestWebUIControllerFactory factory_; |
scoped_ptr<FrameLifetimeConsistencyChecker> lifetime_checker_; |
@@ -1856,17 +1870,22 @@ TEST_F(RenderFrameHostManagerTest, BrowserSideNavigationBeginNavigation) { |
const GURL kUrl2("http://www.chromium.org/"); |
const GURL kUrl3("http://www.gmail.com/"); |
+ // TODO(clamy): we should be enabling browser side navigations here |
+ // eventually. |
// Navigate to the first page. |
contents()->NavigateAndCommit(kUrl1); |
TestRenderViewHost* rvh1 = test_rvh(); |
EXPECT_EQ(RenderViewHostImpl::STATE_DEFAULT, rvh1->rvh_state()); |
+ EnableBrowserSideNavigation(); |
// Add a subframe. |
TestRenderFrameHost* subframe_rfh = static_cast<TestRenderFrameHost*>( |
contents()->GetFrameTree()->AddFrame( |
contents()->GetFrameTree()->root(), 14, "Child")); |
// Simulate a BeginNavigation IPC on the subframe. |
+ subframe_rfh->frame_tree_node()->navigator()->GetController()->LoadURL( |
+ kUrl2, Referrer(), PAGE_TRANSITION_LINK, std::string()); |
subframe_rfh->SendBeginNavigationWithURL(kUrl2); |
NavigationRequest* subframe_request = |
NavigationRequestForRenderFrameManager( |
@@ -1880,6 +1899,8 @@ TEST_F(RenderFrameHostManagerTest, BrowserSideNavigationBeginNavigation) { |
EXPECT_TRUE(subframe_request->info_for_testing().parent_is_main_frame); |
// Simulate a BeginNavigation IPC on the main frame. |
+ contents()->GetController().LoadURL( |
+ kUrl3, Referrer(), PAGE_TRANSITION_LINK, std::string()); |
main_test_rfh()->SendBeginNavigationWithURL(kUrl3); |
NavigationRequest* main_request = |
NavigationRequestForRenderFrameManager( |
@@ -1891,4 +1912,170 @@ TEST_F(RenderFrameHostManagerTest, BrowserSideNavigationBeginNavigation) { |
EXPECT_FALSE(main_request->info_for_testing().parent_is_main_frame); |
} |
+// Browser side navigation: Test that RequestNavigation creates a |
+// NavigationRequest and that the RenderFrameHost is initialized to handle the |
+// request when it commits. Also ensures that the RenderFrameHost is not |
+// modified when the navigation commits. |
+TEST_F(RenderFrameHostManagerTest, |
+ BrowserSideNavigationRequestNavigationNoLiveRenderer) { |
+ const GURL kUrl("http://www.google.com/"); |
+ |
+ EnableBrowserSideNavigation(); |
+ EXPECT_FALSE(main_test_rfh()->render_view_host()->IsRenderViewLive()); |
+ contents()->GetController().LoadURL( |
+ kUrl, Referrer(), PAGE_TRANSITION_LINK, std::string()); |
+ NavigationRequest* main_request = |
+ NavigationRequestForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ // A NavigationRequest should have been generated. |
+ EXPECT_TRUE(main_request != NULL); |
+ // The RFH should have been initialized to handle the navigation when it |
+ // commits. |
+ EXPECT_TRUE(main_test_rfh()->render_view_host()->IsRenderViewLive()); |
+ RenderFrameHostImpl* rfh = main_test_rfh(); |
+ |
+ // Now commit the same url. |
+ NavigationCommitInfo commit_info; |
+ commit_info.navigation_url = kUrl; |
+ main_test_rfh()->frame_tree_node()->render_manager()->CommitNavigation( |
+ commit_info); |
+ main_request =NavigationRequestForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ |
+ // The main rfh should not have been changed and we should not have a |
+ // navigation request anymore. |
+ EXPECT_EQ(rfh, main_test_rfh()); |
+ EXPECT_TRUE(main_request == NULL); |
+} |
+ |
+// Browser-side navigation: Test that a speculative renderer is spawned when |
+// navigating to a different site instance than the one of the main render frame |
+// host. Test that it is used if the navigation commits with the same url. |
+TEST_F(RenderFrameHostManagerTest, |
+ BrowserSideNavigationSpeculativeRendererSameURL) { |
+ const GURL kUrl1("http://www.google.com/"); |
+ const GURL kUrl2("http://www.chromium.org/"); |
+ |
+ // TODO(clamy): we should be enabling browser side navigations here |
+ // eventually. |
+ // Navigate to the first page. |
+ contents()->NavigateAndCommit(kUrl1); |
+ TestRenderViewHost* rvh1 = test_rvh(); |
+ EXPECT_EQ(RenderViewHostImpl::STATE_DEFAULT, rvh1->rvh_state()); |
+ |
+ EnableBrowserSideNavigation(); |
+ // Navigate to a different site. |
+ contents()->GetController().LoadURL( |
+ kUrl2, Referrer(), PAGE_TRANSITION_LINK, std::string()); |
+ main_test_rfh()->SendBeginNavigationWithURL(kUrl2); |
+ NavigationRequest* main_request = |
+ NavigationRequestForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ ASSERT_TRUE(main_request); |
+ RenderFrameHostImpl* speculative_rfh = |
+ SpeculativeRenderFrameHostForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ EXPECT_TRUE(speculative_rfh != NULL); |
+ EXPECT_NE(main_test_rfh(), speculative_rfh); |
+ |
+ // Commit the same url. |
+ NavigationCommitInfo commit_info; |
+ commit_info.navigation_url = kUrl2; |
+ main_test_rfh()->frame_tree_node()->render_manager()->CommitNavigation( |
+ commit_info); |
+ main_request = NavigationRequestForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ EXPECT_EQ(main_test_rfh(), speculative_rfh); |
+ EXPECT_TRUE(main_request == NULL); |
+} |
+ |
+// Browser-side navigation: Test that a speculative renderer is spawned when |
+// navigating to a different site instance than the one of the main render frame |
+// host. Test that it is discarded if the navigation commits with a different |
+// url. |
+TEST_F(RenderFrameHostManagerTest, |
+ BrowserSideNavigationSpeculativeRendererDifferentURL) { |
+ const GURL kUrl1("http://www.google.com/"); |
+ const GURL kUrl2("http://www.chromium.org/"); |
+ const GURL kUrl3("http://www.gmail.com/"); |
+ |
+ // TODO(clamy): we should be enabling browser side navigations here |
+ // eventually. |
+ // Navigate to the first page. |
+ contents()->NavigateAndCommit(kUrl1); |
+ TestRenderViewHost* rvh1 = test_rvh(); |
+ EXPECT_EQ(RenderViewHostImpl::STATE_DEFAULT, rvh1->rvh_state()); |
+ |
+ EnableBrowserSideNavigation(); |
+ // Navigate to a different site. |
+ contents()->GetController().LoadURL( |
+ kUrl2, Referrer(), PAGE_TRANSITION_LINK, std::string()); |
+ main_test_rfh()->SendBeginNavigationWithURL(kUrl2); |
+ NavigationRequest* main_request = |
+ NavigationRequestForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ ASSERT_TRUE(main_request); |
+ RenderFrameHostImpl* speculative_rfh = |
+ SpeculativeRenderFrameHostForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ RenderFrameHostImpl* current_rfh = main_test_rfh(); |
+ EXPECT_TRUE(speculative_rfh != NULL); |
+ EXPECT_NE(main_test_rfh(), speculative_rfh); |
+ |
+ // Commit a different url. |
+ NavigationCommitInfo commit_info; |
+ commit_info.navigation_url = kUrl3; |
+ main_test_rfh()->frame_tree_node()->render_manager()->CommitNavigation( |
+ commit_info); |
+ main_request = NavigationRequestForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ EXPECT_NE(main_test_rfh(), speculative_rfh); |
+ EXPECT_NE(main_test_rfh(), current_rfh); |
+ EXPECT_TRUE(main_request == NULL); |
+} |
+ |
+// Browser-side navigation: Test that a speculative renderer is spawned when |
+// navigating to a different site instance than the one of the main render frame |
+// host. Test that it is discarded and the old render frame host is used if the |
+// navigation commits with the url from the previous render frame host. |
+TEST_F(RenderFrameHostManagerTest, |
+ BrowserSideNavigationSpeculativeRendererOldURL) { |
+ const GURL kUrl1("http://www.google.com/"); |
+ const GURL kUrl2("http://www.chromium.org/"); |
+ |
+ // TODO(clamy): we should be enabling browser side navigations here |
+ // eventually. |
+ // Navigate to the first page. |
+ contents()->NavigateAndCommit(kUrl1); |
+ TestRenderViewHost* rvh1 = test_rvh(); |
+ EXPECT_EQ(RenderViewHostImpl::STATE_DEFAULT, rvh1->rvh_state()); |
+ |
+ EnableBrowserSideNavigation(); |
+ // Navigate to a different site. |
+ contents()->GetController().LoadURL( |
+ kUrl2, Referrer(), PAGE_TRANSITION_LINK, std::string()); |
+ main_test_rfh()->SendBeginNavigationWithURL(kUrl2); |
+ NavigationRequest* main_request = |
+ NavigationRequestForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ ASSERT_TRUE(main_request); |
+ RenderFrameHostImpl* speculative_rfh = |
+ SpeculativeRenderFrameHostForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ RenderFrameHostImpl* current_rfh = main_test_rfh(); |
+ EXPECT_TRUE(speculative_rfh != NULL); |
+ EXPECT_NE(main_test_rfh(), speculative_rfh); |
+ |
+ // Commit a different url. |
+ NavigationCommitInfo commit_info; |
+ commit_info.navigation_url = kUrl1; |
+ main_test_rfh()->frame_tree_node()->render_manager()->CommitNavigation( |
+ commit_info); |
+ main_request = NavigationRequestForRenderFrameManager( |
+ main_test_rfh()->frame_tree_node()->render_manager()); |
+ EXPECT_NE(main_test_rfh(), speculative_rfh); |
+ EXPECT_EQ(main_test_rfh(), current_rfh); |
+ EXPECT_TRUE(main_request == NULL); |
+} |
+ |
} // namespace content |