summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authorjaphet@chromium.org <japhet@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-29 20:05:31 +0000
committerjaphet@chromium.org <japhet@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-29 20:05:31 +0000
commit0d8f04be5a641dd6d3fe775163a6d0fc6dc2dcae (patch)
treebed87bd5d3515dabcec5af6ecd2587fb86e6dff5 /content
parent4af101c6023e5df0dc664cd12e7feef10cf04ec6 (diff)
downloadchromium_src-0d8f04be5a641dd6d3fe775163a6d0fc6dc2dcae.zip
chromium_src-0d8f04be5a641dd6d3fe775163a6d0fc6dc2dcae.tar.gz
chromium_src-0d8f04be5a641dd6d3fe775163a6d0fc6dc2dcae.tar.bz2
Change decidePolicyForNavigation() to takea WebDataSource::ExtraData
instead of a WebDataSource. It doesn't need the full WebDataSource, and WebDataSources are difficult to mock. This is a prerequisite for codereview.chromium.org/14212005 BUG=none TEST=none Review URL: https://chromiumcodereview.appspot.com/14188060 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@197118 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/public/renderer/document_state.h6
-rw-r--r--content/public/renderer/navigation_state.h3
-rw-r--r--content/renderer/render_view_browsertest.cc33
-rw-r--r--content/renderer/render_view_impl.cc12
-rw-r--r--content/renderer/render_view_impl.h9
5 files changed, 53 insertions, 10 deletions
diff --git a/content/public/renderer/document_state.h b/content/public/renderer/document_state.h
index f83cd2d..144eae4 100644
--- a/content/public/renderer/document_state.h
+++ b/content/public/renderer/document_state.h
@@ -11,6 +11,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/supports_user_data.h"
#include "base/time.h"
+#include "content/common/content_export.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h"
namespace content {
@@ -20,8 +21,9 @@ struct PasswordForm;
// The RenderView stores an instance of this class in the "extra data" of each
// WebDataSource (see RenderView::DidCreateDataSource).
-class DocumentState : public WebKit::WebDataSource::ExtraData,
- public base::SupportsUserData {
+class CONTENT_EXPORT DocumentState
+ : NON_EXPORTED_BASE(public WebKit::WebDataSource::ExtraData),
+ public base::SupportsUserData {
public:
// The exact values of this enum are used in histograms, so new values must be
// added to the end.
diff --git a/content/public/renderer/navigation_state.h b/content/public/renderer/navigation_state.h
index 746b206..ba9f438 100644
--- a/content/public/renderer/navigation_state.h
+++ b/content/public/renderer/navigation_state.h
@@ -7,6 +7,7 @@
#include <string>
+#include "content/common/content_export.h"
#include "content/public/common/page_transition_types.h"
namespace content {
@@ -14,7 +15,7 @@ namespace content {
// NavigationState is the portion of DocumentState that is affected by
// in-document navigation.
// TODO(simonjam): Move this to HistoryItem's ExtraData.
-class NavigationState {
+class CONTENT_EXPORT NavigationState {
public:
virtual ~NavigationState();
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index 3b2e637..35b784b 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -12,6 +12,8 @@
#include "content/public/browser/web_ui_controller_factory.h"
#include "content/public/common/bindings_policy.h"
#include "content/public/common/url_constants.h"
+#include "content/public/renderer/document_state.h"
+#include "content/public/renderer/navigation_state.h"
#include "content/public/test/render_view_test.h"
#include "content/renderer/render_view_impl.h"
#include "content/shell/shell_content_browser_client.h"
@@ -315,10 +317,14 @@ TEST_F(RenderViewImplTest, DecideNavigationPolicy) {
WebUITestWebUIControllerFactory factory;
WebUIControllerFactory::RegisterFactory(&factory);
+ DocumentState state;
+ state.set_navigation_state(NavigationState::CreateContentInitiated());
+
// Navigations to normal HTTP URLs can be handled locally.
WebKit::WebURLRequest request(GURL("http://foo.com"));
WebKit::WebNavigationPolicy policy = view()->decidePolicyForNavigation(
GetMainFrame(),
+ &state,
request,
WebKit::WebNavigationTypeLinkClicked,
WebKit::WebNavigationPolicyCurrentTab,
@@ -330,6 +336,7 @@ TEST_F(RenderViewImplTest, DecideNavigationPolicy) {
form_request.setHTTPMethod("POST");
policy = view()->decidePolicyForNavigation(
GetMainFrame(),
+ &state,
form_request,
WebKit::WebNavigationTypeFormSubmitted,
WebKit::WebNavigationPolicyCurrentTab,
@@ -340,6 +347,7 @@ TEST_F(RenderViewImplTest, DecideNavigationPolicy) {
WebKit::WebURLRequest popup_request(GURL("chrome://foo"));
policy = view()->decidePolicyForNavigation(
GetMainFrame(),
+ &state,
popup_request,
WebKit::WebNavigationTypeLinkClicked,
WebKit::WebNavigationPolicyNewForegroundTab,
@@ -351,10 +359,14 @@ TEST_F(RenderViewImplTest, DecideNavigationPolicyForWebUI) {
// Enable bindings to simulate a WebUI view.
view()->OnAllowBindings(BINDINGS_POLICY_WEB_UI);
+ DocumentState state;
+ state.set_navigation_state(NavigationState::CreateContentInitiated());
+
// Navigations to normal HTTP URLs will be sent to browser process.
WebKit::WebURLRequest request(GURL("http://foo.com"));
WebKit::WebNavigationPolicy policy = view()->decidePolicyForNavigation(
GetMainFrame(),
+ &state,
request,
WebKit::WebNavigationTypeLinkClicked,
WebKit::WebNavigationPolicyCurrentTab,
@@ -365,6 +377,7 @@ TEST_F(RenderViewImplTest, DecideNavigationPolicyForWebUI) {
WebKit::WebURLRequest webui_request(GURL("chrome://foo"));
policy = view()->decidePolicyForNavigation(
GetMainFrame(),
+ &state,
webui_request,
WebKit::WebNavigationTypeLinkClicked,
WebKit::WebNavigationPolicyCurrentTab,
@@ -376,6 +389,7 @@ TEST_F(RenderViewImplTest, DecideNavigationPolicyForWebUI) {
data_request.setHTTPMethod("POST");
policy = view()->decidePolicyForNavigation(
GetMainFrame(),
+ &state,
data_request,
WebKit::WebNavigationTypeFormSubmitted,
WebKit::WebNavigationPolicyCurrentTab,
@@ -392,6 +406,7 @@ TEST_F(RenderViewImplTest, DecideNavigationPolicyForWebUI) {
RenderViewImpl* new_view = RenderViewImpl::FromWebView(new_web_view);
policy = new_view->decidePolicyForNavigation(
new_web_view->mainFrame(),
+ &state,
popup_request,
WebKit::WebNavigationTypeLinkClicked,
WebKit::WebNavigationPolicyNewForegroundTab,
@@ -1388,6 +1403,15 @@ TEST_F(RenderViewImplTest, DISABLED_DidFailProvisionalLoadWithErrorForError) {
error.reason = net::ERR_FILE_NOT_FOUND;
error.unreachableURL = GURL("http://foo");
WebFrame* web_frame = GetMainFrame();
+
+ // Start a load that will reach provisional state synchronously,
+ // but won't complete synchronously.
+ ViewMsg_Navigate_Params params;
+ params.page_id = -1;
+ params.navigation_type = ViewMsg_Navigate_Type::NORMAL;
+ params.url = GURL("data:text/html,test data");
+ view()->OnNavigate(params);
+
// An error occurred.
view()->didFailProvisionalLoad(web_frame, error);
// Frame should exit view-source mode.
@@ -1401,6 +1425,15 @@ TEST_F(RenderViewImplTest, DidFailProvisionalLoadWithErrorForCancellation) {
error.reason = net::ERR_ABORTED;
error.unreachableURL = GURL("http://foo");
WebFrame* web_frame = GetMainFrame();
+
+ // Start a load that will reach provisional state synchronously,
+ // but won't complete synchronously.
+ ViewMsg_Navigate_Params params;
+ params.page_id = -1;
+ params.navigation_type = ViewMsg_Navigate_Type::NORMAL;
+ params.url = GURL("data:text/html,test data");
+ view()->OnNavigate(params);
+
// A cancellation occurred.
view()->didFailProvisionalLoad(web_frame, error);
// Frame should stay in view-source mode.
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 17a2150..ba3a443 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -2848,9 +2848,9 @@ void RenderViewImpl::loadURLExternally(
}
WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation(
- WebFrame* frame, WebDataSource* dataSource, const WebURLRequest& request,
- WebNavigationType type, WebNavigationPolicy default_policy,
- bool is_redirect) {
+ WebFrame* frame, WebDataSource::ExtraData* extraData,
+ const WebURLRequest& request, WebNavigationType type,
+ WebNavigationPolicy default_policy, bool is_redirect) {
if (request.url() != GURL(kSwappedOutURL) &&
GetContentClient()->renderer()->HandleNavigation(frame, request, type,
default_policy,
@@ -2892,8 +2892,7 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation(
// A content initiated navigation may have originated from a link-click,
// script, drag-n-drop operation, etc.
- bool is_content_initiated =
- DocumentState::FromDataSource(dataSource)->
+ bool is_content_initiated = static_cast<DocumentState*>(extraData)->
navigation_state()->is_content_initiated();
// Experimental:
@@ -3048,7 +3047,8 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation(
WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation(
WebFrame* frame, const WebURLRequest& request, WebNavigationType type,
WebNavigationPolicy default_policy, bool is_redirect) {
- return decidePolicyForNavigation(frame, frame->provisionalDataSource(),
+ return decidePolicyForNavigation(frame,
+ frame->provisionalDataSource()->extraData(),
request, type, default_policy, is_redirect);
}
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index f4ea069..4d52db7 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -40,6 +40,7 @@
#include "third_party/WebKit/Source/Platform/chromium/public/WebFileSystem.h"
#include "third_party/WebKit/Source/Platform/chromium/public/WebGraphicsContext3D.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebConsoleMessage.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrameClient.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebHistoryItem.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebIconURL.h"
@@ -533,9 +534,11 @@ class CONTENT_EXPORT RenderViewImpl
const WebKit::WebURLRequest& request,
WebKit::WebNavigationPolicy policy,
const WebKit::WebString& suggested_name);
+
+ // The WebDataSource::ExtraData* is assumed to be a DocumentState* subclass.
virtual WebKit::WebNavigationPolicy decidePolicyForNavigation(
WebKit::WebFrame* frame,
- WebKit::WebDataSource* dataSource,
+ WebKit::WebDataSource::ExtraData* extraData,
const WebKit::WebURLRequest& request,
WebKit::WebNavigationType type,
WebKit::WebNavigationPolicy default_policy,
@@ -827,6 +830,10 @@ class CONTENT_EXPORT RenderViewImpl
FRIEND_TEST_ALL_PREFIXES(ExternalPopupMenuTest, ShowPopupThenNavigate);
FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, DecideNavigationPolicyForWebUI);
FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest,
+ DidFailProvisionalLoadWithErrorForError);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest,
+ DidFailProvisionalLoadWithErrorForCancellation);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest,
DontIgnoreBackAfterNavEntryLimit);
FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, ImeComposition);
FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, InsertCharacters);