| 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
|
|
|