diff options
author | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-11 17:53:59 +0000 |
---|---|---|
committer | jochen@chromium.org <jochen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-05-11 17:53:59 +0000 |
commit | ca662821423d066e27f129d2abf206713b60259a (patch) | |
tree | baa96209c9cc6ab9c02f7f86ef5ca6bd9b1a12a7 | |
parent | 6f2679a2a9bb0693be012a67882aa49016aa50cf (diff) | |
download | chromium_src-ca662821423d066e27f129d2abf206713b60259a.zip chromium_src-ca662821423d066e27f129d2abf206713b60259a.tar.gz chromium_src-ca662821423d066e27f129d2abf206713b60259a.tar.bz2 |
If a navigation was initiated by the browser, store the referrer policy to use in the document state
We can't put it into the document, because if the navigation was cancelled, we had to restore the original referrer policy.
Also, when trying to get the referrer policy for a given request, fall back to the document's referrer policy if the request wasn't yet tagged by willSendRequest. e.g. in loadURLExternally() the request didn't pass through willSendRequest
BUG=124750
TEST=Enabled the previously failing tests in ReferrerPolicyTest.*
Review URL: https://chromiumcodereview.appspot.com/10392041
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@136606 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/referrer_policy_browsertest.cc | 7 | ||||
-rw-r--r-- | content/public/renderer/document_state.cc | 6 | ||||
-rw-r--r-- | content/public/renderer/document_state.h | 20 | ||||
-rw-r--r-- | content/renderer/render_view_impl.cc | 24 |
4 files changed, 45 insertions, 12 deletions
diff --git a/chrome/browser/referrer_policy_browsertest.cc b/chrome/browser/referrer_policy_browsertest.cc index 70ac227..fd55143 100644 --- a/chrome/browser/referrer_policy_browsertest.cc +++ b/chrome/browser/referrer_policy_browsertest.cc @@ -29,8 +29,7 @@ #define MAYBE_ContextMenuOrigin ContextMenuOrigin #define MAYBE_HttpsContextMenuOrigin HttpsContextMenuOrigin #define MAYBE_ContextMenuRedirect ContextMenuRedirect -// http://crbug.com/124750 -#define MAYBE_HttpsContextMenuRedirect FAILS_HttpsContextMenuRedirect +#define MAYBE_HttpsContextMenuRedirect HttpsContextMenuRedirect #endif namespace { @@ -195,7 +194,7 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickOrigin) { } // User initiated navigation, middle click, from HTTPS to HTTP. -IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, FAILS_HttpsMiddleClickOrigin) { +IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickOrigin) { RunReferrerTest("origin", true, false, false, true, WebKit::WebMouseEvent::ButtonMiddle, EXPECT_ORIGIN_AS_REFERRER); @@ -287,7 +286,7 @@ IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, MiddleClickRedirect) { // User initiated navigation, middle click, from HTTPS to HTTP via server // redirect. -IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, FAILS_HttpsMiddleClickRedirect) { +IN_PROC_BROWSER_TEST_F(ReferrerPolicyTest, HttpsMiddleClickRedirect) { RunReferrerTest("origin", true, false, true, true, WebKit::WebMouseEvent::ButtonMiddle, EXPECT_ORIGIN_AS_REFERRER); diff --git a/content/public/renderer/document_state.cc b/content/public/renderer/document_state.cc index e564b77..1fcb604 100644 --- a/content/public/renderer/document_state.cc +++ b/content/public/renderer/document_state.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -23,7 +23,9 @@ DocumentState::DocumentState() was_referred_by_prefetcher_(false), load_type_(UNDEFINED_LOAD), cache_policy_override_set_(false), - cache_policy_override_(WebKit::WebURLRequest::UseProtocolCachePolicy) { + cache_policy_override_(WebKit::WebURLRequest::UseProtocolCachePolicy), + referrer_policy_set_(false), + referrer_policy_(WebKit::WebReferrerPolicyDefault) { } DocumentState::~DocumentState() {} diff --git a/content/public/renderer/document_state.h b/content/public/renderer/document_state.h index e778707..d39a893 100644 --- a/content/public/renderer/document_state.h +++ b/content/public/renderer/document_state.h @@ -11,6 +11,7 @@ #include "base/logging.h" #include "base/memory/scoped_ptr.h" #include "base/time.h" +#include "third_party/WebKit/Source/Platform/chromium/public/WebReferrerPolicy.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebURLRequest.h" @@ -224,6 +225,22 @@ class DocumentState : public WebKit::WebDataSource::ExtraData { return cache_policy_override_set_; } + // Sets the referrer policy to use. This is only used for browser initiated + // navigations, otherwise, the referrer policy is defined by the frame's + // document. + WebKit::WebReferrerPolicy referrer_policy() const { + return referrer_policy_; + } + void set_referrer_policy(WebKit::WebReferrerPolicy referrer_policy) { + referrer_policy_ = referrer_policy; + referrer_policy_set_ = true; + } + void clear_referrer_policy() { + referrer_policy_ = WebKit::WebReferrerPolicyDefault; + referrer_policy_set_ = false; + } + bool is_referrer_policy_set() const { return referrer_policy_set_; } + webkit_glue::AltErrorPageResourceFetcher* alt_error_page_fetcher() const { return alt_error_page_fetcher_.get(); } @@ -265,6 +282,9 @@ class DocumentState : public WebKit::WebDataSource::ExtraData { bool cache_policy_override_set_; WebKit::WebURLRequest::CachePolicy cache_policy_override_; + bool referrer_policy_set_; + WebKit::WebReferrerPolicy referrer_policy_; + scoped_ptr<webkit_glue::AltErrorPageResourceFetcher> alt_error_page_fetcher_; scoped_ptr<NavigationState> navigation_state_; diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 70b4e94..821fe0b 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -339,10 +339,11 @@ static bool IsReload(const ViewMsg_Navigate_Params& params) { } static WebReferrerPolicy GetReferrerPolicyFromRequest( + WebFrame* frame, const WebURLRequest& request) { return request.extraData() ? static_cast<RequestExtraData*>(request.extraData())->referrer_policy() : - WebKit::WebReferrerPolicyDefault; + frame->document().referrerPolicy(); } static WebURLResponseExtraDataImpl* GetExtraDataFromResponse( @@ -1327,7 +1328,7 @@ void RenderViewImpl::UpdateURL(WebFrame* frame) { // would be nice if we could get the real referrer from somewhere. params.referrer = Referrer(GURL( original_request.httpHeaderField(WebString::fromUTF8("Referer"))), - GetReferrerPolicyFromRequest(original_request)); + GetReferrerPolicyFromRequest(frame, original_request)); } string16 method = request.httpMethod(); @@ -2298,7 +2299,8 @@ void RenderViewImpl::loadURLExternally( suggested_name)); } else { OpenURL(frame, request.url(), - Referrer(referrer, GetReferrerPolicyFromRequest(request)), policy); + Referrer(referrer, GetReferrerPolicyFromRequest(frame, request)), + policy); } } @@ -2307,7 +2309,7 @@ WebNavigationPolicy RenderViewImpl::decidePolicyForNavigation( const WebNode&, WebNavigationPolicy default_policy, bool is_redirect) { Referrer referrer( GURL(request.httpHeaderField(WebString::fromUTF8("Referer"))), - GetReferrerPolicyFromRequest(request)); + GetReferrerPolicyFromRequest(frame, request)); if (is_swapped_out_) { if (request.url() != GURL(content::kSwappedOutURL)) { @@ -2570,7 +2572,7 @@ void RenderViewImpl::didCompleteClientRedirect( // If there's no provisional data source, it's a reference fragment // navigation. completed_client_redirect_src_ = Referrer( - from, ds ? GetReferrerPolicyFromRequest(ds->request()) : + from, ds ? GetReferrerPolicyFromRequest(frame, ds->request()) : frame->document().referrerPolicy()); } FOR_EACH_OBSERVER( @@ -2669,6 +2671,8 @@ void RenderViewImpl::PopulateDocumentStateFromPending( document_state->set_load_type(DocumentState::HISTORY_LOAD); else document_state->set_load_type(DocumentState::NORMAL_LOAD); + + document_state->set_referrer_policy(params.referrer.policy); } NavigationState* RenderViewImpl::CreateNavigationStateFromPending() { @@ -3110,8 +3114,16 @@ void RenderViewImpl::willSendRequest(WebFrame* frame, transition_type = navigation_state->transition_type(); } + WebKit::WebReferrerPolicy referrer_policy; + if (document_state && document_state->is_referrer_policy_set()) { + referrer_policy = document_state->referrer_policy(); + document_state->clear_referrer_policy(); + } else { + referrer_policy = frame->document().referrerPolicy(); + } + request.setExtraData( - new RequestExtraData(frame->document().referrerPolicy(), + new RequestExtraData(referrer_policy, (frame == top_frame), frame->identifier(), frame->parent() == top_frame, |