diff options
author | japhet@chromium.org <japhet@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-29 20:05:31 +0000 |
---|---|---|
committer | japhet@chromium.org <japhet@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-29 20:05:31 +0000 |
commit | 0d8f04be5a641dd6d3fe775163a6d0fc6dc2dcae (patch) | |
tree | bed87bd5d3515dabcec5af6ecd2587fb86e6dff5 /content | |
parent | 4af101c6023e5df0dc664cd12e7feef10cf04ec6 (diff) | |
download | chromium_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.h | 6 | ||||
-rw-r--r-- | content/public/renderer/navigation_state.h | 3 | ||||
-rw-r--r-- | content/renderer/render_view_browsertest.cc | 33 | ||||
-rw-r--r-- | content/renderer/render_view_impl.cc | 12 | ||||
-rw-r--r-- | content/renderer/render_view_impl.h | 9 |
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); |