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

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

Issue 648813002: PlzNavigate: Add first version of NavigationURLLoader. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@plz-navigate-prepare
Patch Set: rebase, OVERRIDE -> override, NULL -> nullptr Created 6 years, 2 months 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/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 9b88291bae08c2946be0d9b880fadfd5dd8167ba..451c35f5ce861c3068cfd8c100294d517722b160 100644
--- a/content/browser/frame_host/navigator_impl_unittest.cc
+++ b/content/browser/frame_host/navigator_impl_unittest.cc
@@ -13,6 +13,8 @@
#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/loader/navigation_url_loader.h"
+#include "content/browser/loader/navigation_url_loader_factory.h"
#include "content/browser/site_instance_impl.h"
#include "content/common/navigation_params.h"
#include "content/public/browser/stream_handle.h"
@@ -23,6 +25,7 @@
#include "content/test/test_web_contents.h"
#include "net/base/load_flags.h"
#include "net/http/http_response_headers.h"
+#include "net/url_request/redirect_info.h"
#include "ui/base/page_transition_types.h"
namespace content {
@@ -48,11 +51,88 @@ class TestStreamHandle : public StreamHandle {
DISALLOW_COPY_AND_ASSIGN(TestStreamHandle);
};
+class TestNavigationURLLoader : public NavigationURLLoader {
+ public:
+ TestNavigationURLLoader(const CommonNavigationParams& common_params,
+ scoped_ptr<NavigationRequestInfo> request_info,
+ NavigationURLLoader::Delegate* delegate)
+ : common_params_(common_params),
+ request_info_(request_info.Pass()),
+ delegate_(delegate) {
+ }
+
+ virtual ~TestNavigationURLLoader() {
+ // Record the number of times a loader was canceled before ResponseStarted
+ // or RequestFailed was returned.
+ if (delegate_)
+ cancel_count_++;
+ }
+
+ // NavigationURLLoader implementation.
+ virtual void FollowRedirect() override {
+ redirect_count_++;
+ }
+
+ const CommonNavigationParams& common_params() const { return common_params_; }
+ NavigationRequestInfo* request_info() const { return request_info_.get(); }
+
+ void CallOnRequestRedirected(const net::RedirectInfo& redirect_info,
+ ResourceResponse* response) {
+ delegate_->OnRequestRedirected(redirect_info, response);
+ }
+
+ void CallOnResponseStarted(ResourceResponse* response,
+ scoped_ptr<StreamHandle> body) {
+ delegate_->OnResponseStarted(response, body.Pass());
+ }
+
+ static int redirect_count() { return redirect_count_; }
+ static int cancel_count() { return cancel_count_; }
+
+ private:
+ static int redirect_count_;
+ static int cancel_count_;
+
+ CommonNavigationParams common_params_;
+ scoped_ptr<NavigationRequestInfo> request_info_;
+ NavigationURLLoader::Delegate* delegate_;
+};
+
+int TestNavigationURLLoader::redirect_count_ = 0;
+int TestNavigationURLLoader::cancel_count_ = 0;
+
+class TestNavigationURLLoaderFactory : public NavigationURLLoaderFactory {
+ public:
+ // NavigationURLLoaderFactory implementation.
+ virtual scoped_ptr<NavigationURLLoader> CreateLoader(
+ BrowserContext* browser_context,
+ int64 frame_tree_node_id,
+ const CommonNavigationParams& common_params,
+ scoped_ptr<NavigationRequestInfo> request_info,
+ ResourceRequestBody* request_body,
+ NavigationURLLoader::Delegate* delegate) override {
+ return scoped_ptr<NavigationURLLoader>(new TestNavigationURLLoader(
+ common_params, request_info.Pass(), delegate));
+ }
+};
+
}
class NavigatorTest
: public RenderViewHostImplTestHarness {
public:
+ virtual void SetUp() override {
+ RenderViewHostImplTestHarness::SetUp();
+ loader_factory_.reset(new TestNavigationURLLoaderFactory);
+ NavigationURLLoader::SetFactoryForTesting(loader_factory_.get());
+ }
+
+ virtual void TearDown() override {
+ NavigationURLLoader::SetFactoryForTesting(nullptr);
+ loader_factory_.reset();
+ RenderViewHostImplTestHarness::TearDown();
+ }
+
NavigationRequest* GetNavigationRequestForFrameTreeNode(
FrameTreeNode* frame_tree_node) const {
NavigatorImpl* navigator =
@@ -61,6 +141,11 @@ class NavigatorTest
frame_tree_node->frame_tree_node_id());
}
+ TestNavigationURLLoader* GetLoaderForNavigationRequest(
+ NavigationRequest* request) const {
+ return static_cast<TestNavigationURLLoader*>(request->loader_for_testing());
+ }
+
void EnableBrowserSideNavigation() {
CommandLine::ForCurrentProcess()->AppendSwitch(
switches::kEnableBrowserSideNavigation);
@@ -91,6 +176,9 @@ class NavigatorTest
static_cast<NavigatorImpl*>(node->navigator())->RequestNavigation(
node, *entry, reload_type, base::TimeTicks::Now());
}
+
+ private:
+ scoped_ptr<TestNavigationURLLoaderFactory> loader_factory_;
};
// PlzNavigate: Test that a proper NavigationRequest is created by
@@ -117,12 +205,15 @@ TEST_F(NavigatorTest, BrowserSideNavigationBeginNavigation) {
// handled already.
NavigationRequest* subframe_request =
GetNavigationRequestForFrameTreeNode(subframe_node);
+ TestNavigationURLLoader* subframe_loader =
+ GetLoaderForNavigationRequest(subframe_request);
ASSERT_TRUE(subframe_request);
EXPECT_EQ(kUrl2, subframe_request->common_params().url);
+ EXPECT_EQ(kUrl2, subframe_loader->common_params().url);
// First party for cookies url should be that of the main frame.
- EXPECT_EQ(kUrl1, subframe_request->info_for_test()->first_party_for_cookies);
- EXPECT_FALSE(subframe_request->info_for_test()->is_main_frame);
- EXPECT_TRUE(subframe_request->info_for_test()->parent_is_main_frame);
+ EXPECT_EQ(kUrl1, subframe_loader->request_info()->first_party_for_cookies);
+ EXPECT_FALSE(subframe_loader->request_info()->is_main_frame);
+ EXPECT_TRUE(subframe_loader->request_info()->parent_is_main_frame);
FrameTreeNode* main_frame_node =
contents()->GetMainFrame()->frame_tree_node();
@@ -131,11 +222,14 @@ TEST_F(NavigatorTest, BrowserSideNavigationBeginNavigation) {
contents()->GetMainFrame()->SendBeginNavigationWithURL(kUrl3);
NavigationRequest* main_request =
GetNavigationRequestForFrameTreeNode(main_frame_node);
+ TestNavigationURLLoader* main_loader =
+ GetLoaderForNavigationRequest(main_request);
ASSERT_TRUE(main_request);
EXPECT_EQ(kUrl3, main_request->common_params().url);
- EXPECT_EQ(kUrl3, main_request->info_for_test()->first_party_for_cookies);
- EXPECT_TRUE(main_request->info_for_test()->is_main_frame);
- EXPECT_FALSE(main_request->info_for_test()->parent_is_main_frame);
+ EXPECT_EQ(kUrl3, main_loader->common_params().url);
+ EXPECT_EQ(kUrl3, main_loader->request_info()->first_party_for_cookies);
+ EXPECT_TRUE(main_loader->request_info()->is_main_frame);
+ EXPECT_FALSE(main_loader->request_info()->parent_is_main_frame);
}
// PlzNavigate: Test that RequestNavigation creates a NavigationRequest and that
@@ -152,10 +246,11 @@ TEST_F(NavigatorTest, BrowserSideNavigationRequestNavigationNoLiveRenderer) {
EXPECT_TRUE(main_request != NULL);
RenderFrameHostImpl* rfh = main_test_rfh();
- // Now commit the same url.
+ // Now return the response without any redirects. This will cause the
+ // navigation to commit at the same URL.
scoped_refptr<ResourceResponse> response(new ResourceResponse);
- node->navigator()->CommitNavigation(
- node, response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
+ GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
+ response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
main_request = GetNavigationRequestForFrameTreeNode(node);
// The main RFH should not have been changed, and the renderer should have
@@ -190,8 +285,8 @@ TEST_F(NavigatorTest, BrowserSideNavigationNoContent) {
const char kNoContentHeaders[] = "HTTP/1.1 204 No Content\0\0";
response->head.headers = new net::HttpResponseHeaders(
std::string(kNoContentHeaders, arraysize(kNoContentHeaders)));
- node->navigator()->CommitNavigation(
- node, response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
+ GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
+ response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
// There should be no pending RenderFrameHost; the navigation was aborted.
EXPECT_FALSE(GetNavigationRequestForFrameTreeNode(node));
@@ -210,8 +305,8 @@ TEST_F(NavigatorTest, BrowserSideNavigationNoContent) {
const char kResetContentHeaders[] = "HTTP/1.1 205 Reset Content\0\0";
response->head.headers = new net::HttpResponseHeaders(
std::string(kResetContentHeaders, arraysize(kResetContentHeaders)));
- node->navigator()->CommitNavigation(
- node, response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
+ GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
+ response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
// There should be no pending RenderFrameHost; the navigation was aborted.
EXPECT_FALSE(GetNavigationRequestForFrameTreeNode(node));
@@ -238,8 +333,51 @@ TEST_F(NavigatorTest, BrowserSideNavigationCrossSiteNavigation) {
ASSERT_TRUE(main_request);
scoped_refptr<ResourceResponse> response(new ResourceResponse);
- node->navigator()->CommitNavigation(
- node, response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
+ GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
+ response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
+ RenderFrameHostImpl* pending_rfh =
+ node->render_manager()->pending_frame_host();
+ ASSERT_TRUE(pending_rfh);
+ EXPECT_NE(pending_rfh, rfh);
+ EXPECT_TRUE(pending_rfh->IsRenderFrameLive());
+ EXPECT_TRUE(pending_rfh->render_view_host()->IsRenderViewLive());
+}
+
+// PlzNavigate: Test that redirects are followed.
+TEST_F(NavigatorTest, BrowserSideNavigationRedirectCrossSite) {
+ const GURL kUrl1("http://www.chromium.org/");
+ const GURL kUrl2("http://www.google.com/");
+
+ contents()->NavigateAndCommit(kUrl1);
+ RenderFrameHostImpl* rfh = main_test_rfh();
+ EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh->rfh_state());
+ FrameTreeNode* node = main_test_rfh()->frame_tree_node();
+
+ EnableBrowserSideNavigation();
+
+ // Navigate to a URL on the same site.
+ SendRequestNavigation(node, kUrl1);
+ main_test_rfh()->SendBeginNavigationWithURL(kUrl1);
+ NavigationRequest* main_request = GetNavigationRequestForFrameTreeNode(node);
+ ASSERT_TRUE(main_request);
+
+ // It then redirects to another site.
+ net::RedirectInfo redirect_info;
+ redirect_info.status_code = 302;
+ redirect_info.new_method = "GET";
+ redirect_info.new_url = kUrl2;
+ redirect_info.new_first_party_for_cookies = kUrl2;
+ scoped_refptr<ResourceResponse> response(new ResourceResponse);
+ GetLoaderForNavigationRequest(main_request)->CallOnRequestRedirected(
+ redirect_info, response.get());
+
+ // The redirect should have been followed.
+ EXPECT_EQ(1, TestNavigationURLLoader::redirect_count());
+
+ // Then it commits.
+ response = new ResourceResponse;
+ GetLoaderForNavigationRequest(main_request)->CallOnResponseStarted(
+ response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
RenderFrameHostImpl* pending_rfh =
node->render_manager()->pending_frame_host();
ASSERT_TRUE(pending_rfh);
@@ -280,8 +418,8 @@ TEST_F(NavigatorTest, BrowserSideNavigationReplacePendingNavigation) {
// Confirm that the commit corresonds to the new request.
scoped_refptr<ResourceResponse> response(new ResourceResponse);
- node->navigator()->CommitNavigation(
- node, response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
+ GetLoaderForNavigationRequest(request2)->CallOnResponseStarted(
+ response.get(), scoped_ptr<StreamHandle>(new TestStreamHandle));
RenderFrameHostImpl* pending_rfh =
node->render_manager()->pending_frame_host();
ASSERT_TRUE(pending_rfh);

Powered by Google App Engine
This is Rietveld 408576698