| Index: content/browser/frame_host/navigator_impl_unittest.cc
|
| diff --git a/content/browser/frame_host/navigator_impl_unittest.cc b/content/browser/frame_host/navigator_impl_unittest.cc
|
| index 2da67a0c839aa0b5d1a518849f86e223ddb44b6b..e8a544209244019af771a68916bcc817dcfca16f 100644
|
| --- a/content/browser/frame_host/navigator_impl_unittest.cc
|
| +++ b/content/browser/frame_host/navigator_impl_unittest.cc
|
| @@ -12,20 +12,21 @@
|
| #include "content/browser/frame_host/navigation_request.h"
|
| #include "content/browser/frame_host/navigation_request_info.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/streams/stream.h"
|
| #include "content/common/frame_messages.h"
|
| #include "content/common/navigation_params.h"
|
| #include "content/common/site_isolation_policy.h"
|
| +#include "content/public/browser/navigation_data.h"
|
| #include "content/public/browser/stream_handle.h"
|
| #include "content/public/common/url_constants.h"
|
| #include "content/public/common/url_utils.h"
|
| #include "content/public/test/mock_render_process_host.h"
|
| #include "content/public/test/test_utils.h"
|
| #include "content/test/browser_side_navigation_test_utils.h"
|
| #include "content/test/test_navigation_url_loader.h"
|
| #include "content/test/test_render_frame_host.h"
|
| #include "content/test/test_web_contents.h"
|
| #include "net/base/load_flags.h"
|
| @@ -136,22 +137,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
|
|
| // As there's no live renderer the navigation should not wait for a
|
| // beforeUnload ACK from the renderer and start right away.
|
| EXPECT_EQ(NavigationRequest::STARTED, request->state());
|
| ASSERT_TRUE(GetLoaderForNavigationRequest(request));
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
| EXPECT_FALSE(node->render_manager()->pending_frame_host());
|
|
|
| // Have the current RenderFrameHost commit the navigation.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| - GetLoaderForNavigationRequest(request)
|
| - ->CallOnResponseStarted(response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(request)->CallOnResponseStarted(
|
| + response, MakeEmptyStream(), nullptr);
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
| EXPECT_TRUE(main_test_rfh()->is_loading());
|
| EXPECT_FALSE(node->navigation_request());
|
|
|
| // Commit the navigation.
|
| main_test_rfh()->SendNavigate(0, entry_id, true, kUrl);
|
| EXPECT_TRUE(main_test_rfh()->is_active());
|
| EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl),
|
| main_test_rfh()->GetSiteInstance()->GetSiteURL());
|
| EXPECT_EQ(kUrl, contents()->GetLastCommittedURL());
|
| @@ -189,22 +190,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
| // The navigation is immediately started as there's no need to wait for
|
| // beforeUnload to be executed.
|
| EXPECT_EQ(NavigationRequest::STARTED, request->state());
|
| EXPECT_FALSE(request->begin_params().has_user_gesture);
|
| EXPECT_EQ(kUrl2, request->common_params().url);
|
| EXPECT_FALSE(request->browser_initiated());
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
|
|
| // Have the current RenderFrameHost commit the navigation.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| - GetLoaderForNavigationRequest(request)
|
| - ->CallOnResponseStarted(response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(request)->CallOnResponseStarted(
|
| + response, MakeEmptyStream(), nullptr);
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
| EXPECT_TRUE(main_test_rfh()->is_loading());
|
| EXPECT_FALSE(node->navigation_request());
|
|
|
| // Commit the navigation.
|
| main_test_rfh()->SendNavigate(1, 0, true, kUrl2);
|
| EXPECT_TRUE(main_test_rfh()->is_active());
|
| EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl2),
|
| main_test_rfh()->GetSiteInstance()->GetSiteURL());
|
| EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL());
|
| @@ -238,22 +239,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
| EXPECT_EQ(kUrl2, request->common_params().url);
|
| EXPECT_FALSE(request->browser_initiated());
|
| if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) {
|
| EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
|
| } else {
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
| }
|
|
|
| // Have the current RenderFrameHost commit the navigation.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| - GetLoaderForNavigationRequest(request)
|
| - ->CallOnResponseStarted(response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(request)->CallOnResponseStarted(
|
| + response, MakeEmptyStream(), nullptr);
|
| if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) {
|
| EXPECT_TRUE(
|
| DidRenderFrameHostRequestCommit(GetSpeculativeRenderFrameHost(node)));
|
| } else {
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
| }
|
| EXPECT_TRUE(main_test_rfh()->is_loading());
|
| EXPECT_FALSE(node->navigation_request());
|
|
|
| // Commit the navigation.
|
| @@ -391,22 +392,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation, NoContent) {
|
| ASSERT_TRUE(main_request);
|
|
|
| // Navigations to a different site do create a speculative RenderFrameHost.
|
| EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
|
|
|
| // Commit an HTTP 204 response.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| const char kNoContentHeaders[] = "HTTP/1.1 204 No Content\0\0";
|
| response->head.headers = new net::HttpResponseHeaders(
|
| std::string(kNoContentHeaders, arraysize(kNoContentHeaders)));
|
| - GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
|
| - response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(main_request)
|
| + ->CallOnResponseStarted(response, MakeEmptyStream(), nullptr);
|
|
|
| // There should be no pending nor speculative RenderFrameHost; the navigation
|
| // was aborted.
|
| EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
| EXPECT_FALSE(node->navigation_request());
|
| EXPECT_FALSE(node->render_manager()->pending_frame_host());
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
|
|
| // Now, repeat the test with 205 Reset Content.
|
|
|
| @@ -417,22 +418,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation, NoContent) {
|
|
|
| main_request = node->navigation_request();
|
| ASSERT_TRUE(main_request);
|
| EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
|
|
|
| // Commit an HTTP 205 response.
|
| response = new ResourceResponse;
|
| const char kResetContentHeaders[] = "HTTP/1.1 205 Reset Content\0\0";
|
| response->head.headers = new net::HttpResponseHeaders(
|
| std::string(kResetContentHeaders, arraysize(kResetContentHeaders)));
|
| - GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
|
| - response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(main_request)
|
| + ->CallOnResponseStarted(response, MakeEmptyStream(), nullptr);
|
|
|
| // There should be no pending nor speculative RenderFrameHost; the navigation
|
| // was aborted.
|
| EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
| EXPECT_FALSE(node->navigation_request());
|
| EXPECT_FALSE(node->render_manager()->pending_frame_host());
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
| }
|
|
|
| // PlzNavigate: Test that a new RenderFrameHost is created when doing a cross
|
| @@ -451,22 +452,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation, CrossSiteNavigation) {
|
| NavigationRequest* main_request = node->navigation_request();
|
| ASSERT_TRUE(main_request);
|
| TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
|
| ASSERT_TRUE(speculative_rfh);
|
|
|
| // Receive the beforeUnload ACK.
|
| main_test_rfh()->SendBeforeUnloadACK(true);
|
| EXPECT_EQ(speculative_rfh, GetSpeculativeRenderFrameHost(node));
|
|
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| - GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
|
| - response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(main_request)
|
| + ->CallOnResponseStarted(response, MakeEmptyStream(), nullptr);
|
| EXPECT_EQ(speculative_rfh, GetSpeculativeRenderFrameHost(node));
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
|
| EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
|
|
| speculative_rfh->SendNavigate(0, entry_id, true, kUrl2);
|
|
|
| RenderFrameHostImpl* final_rfh = main_test_rfh();
|
| EXPECT_EQ(speculative_rfh, final_rfh);
|
| EXPECT_NE(initial_rfh, final_rfh);
|
| EXPECT_TRUE(final_rfh->IsRenderFrameLive());
|
| @@ -494,22 +495,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation, RedirectCrossSite) {
|
|
|
| // It then redirects to another site.
|
| GetLoaderForNavigationRequest(main_request)->SimulateServerRedirect(kUrl2);
|
|
|
| // The redirect should have been followed.
|
| EXPECT_EQ(1, GetLoaderForNavigationRequest(main_request)->redirect_count());
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
|
|
| // Have the RenderFrameHost commit the navigation.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| - GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
|
| - response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(main_request)
|
| + ->CallOnResponseStarted(response, MakeEmptyStream(), nullptr);
|
| TestRenderFrameHost* final_speculative_rfh =
|
| GetSpeculativeRenderFrameHost(node);
|
| EXPECT_TRUE(final_speculative_rfh);
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(final_speculative_rfh));
|
|
|
| // Commit the navigation.
|
| final_speculative_rfh->SendNavigate(0, entry_id, true, kUrl2);
|
| RenderFrameHostImpl* final_rfh = main_test_rfh();
|
| ASSERT_TRUE(final_rfh);
|
| EXPECT_NE(rfh, final_rfh);
|
| @@ -566,21 +567,21 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
|
|
| // Confirm that a new speculative RenderFrameHost was created.
|
| speculative_rfh = GetSpeculativeRenderFrameHost(node);
|
| ASSERT_TRUE(speculative_rfh);
|
| int32_t site_instance_id_2 = speculative_rfh->GetSiteInstance()->GetId();
|
| EXPECT_NE(site_instance_id_1, site_instance_id_2);
|
|
|
| // Have the RenderFrameHost commit the navigation.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| GetLoaderForNavigationRequest(request2)->CallOnResponseStarted(
|
| - response, MakeEmptyStream());
|
| + response, MakeEmptyStream(), nullptr);
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
|
| EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
|
|
| // Commit the navigation.
|
| speculative_rfh->SendNavigate(0, entry_id, true, kUrl2);
|
|
|
| // Confirm that the commit corresponds to the new request.
|
| ASSERT_TRUE(main_test_rfh());
|
| EXPECT_EQ(kUrl2_site, main_test_rfh()->GetSiteInstance()->GetSiteURL());
|
| EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL());
|
| @@ -632,22 +633,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
| // Confirm that the speculative RenderFrameHost was destroyed in the non
|
| // SitePerProcess case.
|
| if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) {
|
| EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
|
| } else {
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
| }
|
|
|
| // Have the RenderFrameHost commit the navigation.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| - GetLoaderForNavigationRequest(request2)
|
| - ->CallOnResponseStarted(response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(request2)->CallOnResponseStarted(
|
| + response, MakeEmptyStream(), nullptr);
|
| if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) {
|
| EXPECT_TRUE(
|
| DidRenderFrameHostRequestCommit(GetSpeculativeRenderFrameHost(node)));
|
| } else {
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
| }
|
|
|
| // Commit the navigation.
|
| main_test_rfh()->SendNavigate(1, 0, true, kUrl2);
|
|
|
| @@ -693,22 +694,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
| EXPECT_FALSE(request2->browser_initiated());
|
| EXPECT_TRUE(request2->begin_params().has_user_gesture);
|
| if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) {
|
| EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
|
| } else {
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
| }
|
|
|
| // Have the RenderFrameHost commit the navigation.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| - GetLoaderForNavigationRequest(request2)
|
| - ->CallOnResponseStarted(response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(request2)->CallOnResponseStarted(
|
| + response, MakeEmptyStream(), nullptr);
|
| if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) {
|
| EXPECT_TRUE(
|
| DidRenderFrameHostRequestCommit(GetSpeculativeRenderFrameHost(node)));
|
| } else {
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
| }
|
|
|
| // Commit the navigation.
|
| main_test_rfh()->SendNavigate(1, 0, true, kUrl1);
|
| EXPECT_EQ(kUrl1, contents()->GetLastCommittedURL());
|
| @@ -745,22 +746,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
| EXPECT_TRUE(request2->browser_initiated());
|
| EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
|
|
|
| // Now receive the beforeUnload ACK from the still ongoing navigation.
|
| main_test_rfh()->SendBeforeUnloadACK(true);
|
| TestRenderFrameHost* speculative_rfh = GetSpeculativeRenderFrameHost(node);
|
| ASSERT_TRUE(speculative_rfh);
|
|
|
| // Have the RenderFrameHost commit the navigation.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| - GetLoaderForNavigationRequest(request2)
|
| - ->CallOnResponseStarted(response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(request2)->CallOnResponseStarted(
|
| + response, MakeEmptyStream(), nullptr);
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
|
| EXPECT_FALSE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
|
|
| // Commit the navigation.
|
| speculative_rfh->SendNavigate(0, entry_id, true, kUrl1);
|
| EXPECT_EQ(kUrl1, contents()->GetLastCommittedURL());
|
| }
|
|
|
| // PlzNavigate: Test that a renderer-initiated non-user-initiated navigation is
|
| // canceled if a another similar request is issued in the meantime.
|
| @@ -802,22 +803,22 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
| EXPECT_TRUE(GetSpeculativeRenderFrameHost(node));
|
| } else {
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
| }
|
|
|
| // Confirm that the first loader got destroyed.
|
| EXPECT_FALSE(loader1);
|
|
|
| // Have the RenderFrameHost commit the navigation.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| - GetLoaderForNavigationRequest(request2)
|
| - ->CallOnResponseStarted(response, MakeEmptyStream());
|
| + GetLoaderForNavigationRequest(request2)->CallOnResponseStarted(
|
| + response, MakeEmptyStream(), nullptr);
|
| if (SiteIsolationPolicy::AreCrossProcessFramesPossible()) {
|
| EXPECT_TRUE(
|
| DidRenderFrameHostRequestCommit(GetSpeculativeRenderFrameHost(node)));
|
| } else {
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(main_test_rfh()));
|
| }
|
|
|
| // Commit the navigation.
|
| main_test_rfh()->SendNavigate(1, 0, true, kUrl2);
|
| EXPECT_EQ(kUrl2, contents()->GetLastCommittedURL());
|
| @@ -880,21 +881,21 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
| EXPECT_EQ(speculative_rfh, GetSpeculativeRenderFrameHost(node));
|
| EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrl),
|
| speculative_rfh->GetSiteInstance()->GetSiteURL());
|
| EXPECT_FALSE(node->render_manager()->pending_frame_host());
|
| int32_t site_instance_id = speculative_rfh->GetSiteInstance()->GetId();
|
|
|
| // Ask Navigator to commit the navigation by simulating a call to
|
| // OnResponseStarted.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| GetLoaderForNavigationRequest(node->navigation_request())
|
| - ->CallOnResponseStarted(response, MakeEmptyStream());
|
| + ->CallOnResponseStarted(response, MakeEmptyStream(), nullptr);
|
| EXPECT_EQ(speculative_rfh, GetSpeculativeRenderFrameHost(node));
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
|
| EXPECT_EQ(site_instance_id, speculative_rfh->GetSiteInstance()->GetId());
|
| EXPECT_FALSE(node->render_manager()->pending_frame_host());
|
|
|
| // Invoke OnDidCommitProvisionalLoad.
|
| speculative_rfh->SendNavigate(0, entry_id, true, kUrl);
|
| EXPECT_EQ(site_instance_id, main_test_rfh()->GetSiteInstance()->GetId());
|
| EXPECT_FALSE(GetSpeculativeRenderFrameHost(node));
|
| EXPECT_FALSE(node->render_manager()->pending_frame_host());
|
| @@ -941,21 +942,21 @@ TEST_F(NavigatorTestWithBrowserSideNavigation,
|
| // TODO(carlosk): once the speculative RenderFrameHost updates with redirects
|
| // this next check will be changed to verify that it actually happens.
|
| EXPECT_EQ(speculative_rfh, GetSpeculativeRenderFrameHost(node));
|
| EXPECT_EQ(site_instance_id, speculative_rfh->GetSiteInstance()->GetId());
|
| EXPECT_FALSE(rfh_deleted_observer.deleted());
|
|
|
| // Commit the navigation with Navigator by simulating the call to
|
| // OnResponseStarted.
|
| scoped_refptr<ResourceResponse> response(new ResourceResponse);
|
| GetLoaderForNavigationRequest(main_request)
|
| - ->CallOnResponseStarted(response, MakeEmptyStream());
|
| + ->CallOnResponseStarted(response, MakeEmptyStream(), nullptr);
|
| speculative_rfh = GetSpeculativeRenderFrameHost(node);
|
| ASSERT_TRUE(speculative_rfh);
|
| EXPECT_TRUE(DidRenderFrameHostRequestCommit(speculative_rfh));
|
| EXPECT_EQ(init_site_instance_id, main_test_rfh()->GetSiteInstance()->GetId());
|
| EXPECT_TRUE(rfh_deleted_observer.deleted());
|
|
|
| // Once commit happens the speculative RenderFrameHost is updated to match the
|
| // known final SiteInstance.
|
| EXPECT_EQ(SiteInstanceImpl::GetSiteForURL(browser_context(), kUrlRedirect),
|
| speculative_rfh->GetSiteInstance()->GetSiteURL());
|
|
|