Fix URL comparison errors in CefRequest (issue #1967)

This commit is contained in:
Marshall Greenblatt 2016-10-28 14:15:26 -04:00
parent e39accd266
commit 2149a34d0a
2 changed files with 59 additions and 54 deletions

View File

@ -126,14 +126,14 @@ net::URLRequest::ReferrerPolicy GetURLRequestReferrerPolicy(
return net_referrer_policy; return net_referrer_policy;
} }
std::string GetURLRequestReferrer(const CefString& referrer_url) { std::string GetURLRequestReferrer(const GURL& referrer_url) {
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
if (!GURL(referrer_url.ToString()).is_valid() || if (!referrer_url.is_valid() ||
command_line->HasSwitch(switches::kNoReferrers)) { command_line->HasSwitch(switches::kNoReferrers)) {
return std::string(); return std::string();
} }
return referrer_url; return referrer_url.spec();
} }
blink::WebString FilePathStringToWebString( blink::WebString FilePathStringToWebString(
@ -167,12 +167,12 @@ void GetHeaderMap(const net::HttpRequestHeaders& headers,
// |referrer|. // |referrer|.
void GetHeaderMap(const blink::WebURLRequest& request, void GetHeaderMap(const blink::WebURLRequest& request,
CefRequest::HeaderMap& map, CefRequest::HeaderMap& map,
CefString& referrer) { GURL& referrer) {
map.clear(); map.clear();
class HeaderVisitor : public blink::WebHTTPHeaderVisitor { class HeaderVisitor : public blink::WebHTTPHeaderVisitor {
public: public:
HeaderVisitor(CefRequest::HeaderMap* map, CefString* referrer) HeaderVisitor(CefRequest::HeaderMap* map, GURL* referrer)
: map_(map), : map_(map),
referrer_(referrer) { referrer_(referrer) {
} }
@ -182,14 +182,14 @@ void GetHeaderMap(const blink::WebURLRequest& request,
const base::string16& nameStr = name; const base::string16& nameStr = name;
const base::string16& valueStr = value; const base::string16& valueStr = value;
if (base::LowerCaseEqualsASCII(nameStr, kReferrerLowerCase)) if (base::LowerCaseEqualsASCII(nameStr, kReferrerLowerCase))
*referrer_ = valueStr; *referrer_ = GURL(valueStr);
else else
map_->insert(std::make_pair(nameStr, valueStr)); map_->insert(std::make_pair(nameStr, valueStr));
} }
private: private:
CefRequest::HeaderMap* map_; CefRequest::HeaderMap* map_;
CefString* referrer_; GURL* referrer_;
}; };
HeaderVisitor visitor(&map, &referrer); HeaderVisitor visitor(&map, &referrer);
@ -268,14 +268,15 @@ bool CefRequestImpl::IsReadOnly() {
CefString CefRequestImpl::GetURL() { CefString CefRequestImpl::GetURL() {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
return url_; return url_.spec();
} }
void CefRequestImpl::SetURL(const CefString& url) { void CefRequestImpl::SetURL(const CefString& url) {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
CHECK_READONLY_RETURN_VOID(); CHECK_READONLY_RETURN_VOID();
if (url_ != url) { const GURL& new_url = GURL(url.ToString());
url_ = url; if (url_ != new_url) {
url_ = new_url;
Changed(kChangedUrl); Changed(kChangedUrl);
} }
} }
@ -288,8 +289,9 @@ CefString CefRequestImpl::GetMethod() {
void CefRequestImpl::SetMethod(const CefString& method) { void CefRequestImpl::SetMethod(const CefString& method) {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
CHECK_READONLY_RETURN_VOID(); CHECK_READONLY_RETURN_VOID();
if (method_ != method) { const std::string& new_method = method;
method_ = method; if (method_ != new_method) {
method_ = new_method;
Changed(kChangedMethod); Changed(kChangedMethod);
} }
} }
@ -301,9 +303,9 @@ void CefRequestImpl::SetReferrer(const CefString& referrer_url,
// Call GetAsReferrer here for consistency since the same logic will later be // Call GetAsReferrer here for consistency since the same logic will later be
// applied by URLRequest::SetReferrer(). // applied by URLRequest::SetReferrer().
const GURL& gurl = GURL(referrer_url.ToString()).GetAsReferrer(); const GURL& new_referrer_url = GURL(referrer_url.ToString()).GetAsReferrer();
if (referrer_url_ != gurl.spec() || referrer_policy_ != policy) { if (referrer_url_ != new_referrer_url || referrer_policy_ != policy) {
referrer_url_ = gurl.spec(); referrer_url_ = new_referrer_url;
referrer_policy_ = policy; referrer_policy_ = policy;
Changed(kChangedReferrer); Changed(kChangedReferrer);
} }
@ -311,7 +313,7 @@ void CefRequestImpl::SetReferrer(const CefString& referrer_url,
CefString CefRequestImpl::GetReferrerURL() { CefString CefRequestImpl::GetReferrerURL() {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
return referrer_url_; return referrer_url_.spec();
} }
CefRequestImpl::ReferrerPolicy CefRequestImpl::GetReferrerPolicy() { CefRequestImpl::ReferrerPolicy CefRequestImpl::GetReferrerPolicy() {
@ -349,12 +351,14 @@ void CefRequestImpl::Set(const CefString& url,
const HeaderMap& headerMap) { const HeaderMap& headerMap) {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
CHECK_READONLY_RETURN_VOID(); CHECK_READONLY_RETURN_VOID();
if (url_ != url) { const GURL& new_url = GURL(url.ToString());
url_ = url; if (url_ != new_url) {
url_ = new_url;
Changed(kChangedUrl); Changed(kChangedUrl);
} }
if (method_ != method) { const std::string& new_method = method;
method_ = method; if (method_ != new_method) {
method_ = new_method;
Changed(kChangedMethod); Changed(kChangedMethod);
} }
postdata_ = postData; postdata_ = postData;
@ -378,14 +382,15 @@ void CefRequestImpl::SetFlags(int flags) {
CefString CefRequestImpl::GetFirstPartyForCookies() { CefString CefRequestImpl::GetFirstPartyForCookies() {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
return first_party_for_cookies_; return first_party_for_cookies_.spec();
} }
void CefRequestImpl::SetFirstPartyForCookies(const CefString& url) { void CefRequestImpl::SetFirstPartyForCookies(const CefString& url) {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
CHECK_READONLY_RETURN_VOID(); CHECK_READONLY_RETURN_VOID();
if (first_party_for_cookies_ != url) { const GURL& new_url = GURL(url.ToString());
first_party_for_cookies_ = url; if (first_party_for_cookies_ != new_url) {
first_party_for_cookies_ = new_url;
Changed(kChangedFirstPartyForCookies); Changed(kChangedFirstPartyForCookies);
} }
} }
@ -411,7 +416,7 @@ void CefRequestImpl::Set(net::URLRequest* request) {
Reset(); Reset();
url_ = request->url().spec(); url_ = request->url();
method_ = request->method(); method_ = request->method();
identifier_ = request->identifier(); identifier_ = request->identifier();
@ -422,7 +427,7 @@ void CefRequestImpl::Set(net::URLRequest* request) {
// Our consumer should have made sure that this is a safe referrer. See for // Our consumer should have made sure that this is a safe referrer. See for
// instance WebCore::FrameLoader::HideReferrer. // instance WebCore::FrameLoader::HideReferrer.
if (referrer.is_valid()) { if (referrer.is_valid()) {
referrer_url_ = referrer.spec(); referrer_url_ = referrer;
switch (request->referrer_policy()) { switch (request->referrer_policy()) {
case net::URLRequest:: case net::URLRequest::
CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE: CLEAR_REFERRER_ON_TRANSITION_FROM_SECURE_TO_INSECURE:
@ -459,7 +464,7 @@ void CefRequestImpl::Set(net::URLRequest* request) {
static_cast<CefPostDataImpl*>(postdata_.get())->Set(*data); static_cast<CefPostDataImpl*>(postdata_.get())->Set(*data);
} }
first_party_for_cookies_ = request->first_party_for_cookies().spec(); first_party_for_cookies_ = request->first_party_for_cookies();
const content::ResourceRequestInfo* info = const content::ResourceRequestInfo* info =
content::ResourceRequestInfo::ForRequest(request); content::ResourceRequestInfo::ForRequest(request);
@ -497,10 +502,9 @@ void CefRequestImpl::Get(net::URLRequest* request, bool changed_only) const {
} }
} }
if (!first_party_for_cookies_.empty() && if (!first_party_for_cookies_.is_empty() &&
ShouldSet(kChangedFirstPartyForCookies, changed_only)) { ShouldSet(kChangedFirstPartyForCookies, changed_only)) {
request->set_first_party_for_cookies( request->set_first_party_for_cookies(first_party_for_cookies_);
GURL(std::string(first_party_for_cookies_)));
} }
} }
@ -512,12 +516,12 @@ void CefRequestImpl::Set(
Reset(); Reset();
url_ = params.url().spec(); url_ = params.url();
method_ = params.is_post() ? "POST" : "GET"; method_ = params.is_post() ? "POST" : "GET";
const content::Referrer& sanitized_referrer = const content::Referrer& sanitized_referrer =
content::Referrer::SanitizeForRequest(params.url(), params.referrer()); content::Referrer::SanitizeForRequest(params.url(), params.referrer());
referrer_url_ = sanitized_referrer.url.spec(); referrer_url_ = sanitized_referrer.url;
referrer_policy_ = referrer_policy_ =
static_cast<cef_referrer_policy_t>(sanitized_referrer.policy); static_cast<cef_referrer_policy_t>(sanitized_referrer.policy);
@ -534,8 +538,8 @@ void CefRequestImpl::Set(const blink::WebURLRequest& request) {
Reset(); Reset();
url_ = request.url().string(); url_ = request.url();
method_ = request.httpMethod(); method_ = request.httpMethod().utf8();
::GetHeaderMap(request, headermap_, referrer_url_); ::GetHeaderMap(request, headermap_, referrer_url_);
referrer_policy_ = referrer_policy_ =
@ -547,7 +551,7 @@ void CefRequestImpl::Set(const blink::WebURLRequest& request) {
static_cast<CefPostDataImpl*>(postdata_.get())->Set(body); static_cast<CefPostDataImpl*>(postdata_.get())->Set(body);
} }
first_party_for_cookies_ = request.firstPartyForCookies().string(); first_party_for_cookies_ = request.firstPartyForCookies();
if (request.getCachePolicy() == blink::WebCachePolicy::BypassingCache) if (request.getCachePolicy() == blink::WebCachePolicy::BypassingCache)
flags_ |= UR_FLAG_SKIP_CACHE; flags_ |= UR_FLAG_SKIP_CACHE;
@ -561,15 +565,15 @@ void CefRequestImpl::Get(blink::WebURLRequest& request,
int64& upload_data_size) const { int64& upload_data_size) const {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
request.setURL(GURL(url_.ToString())); request.setURL(url_);
request.setHTTPMethod(blink::WebString::fromUTF8(method_.ToString())); request.setHTTPMethod(blink::WebString::fromUTF8(method_));
if (!referrer_url_.empty()) { if (!referrer_url_.is_empty()) {
const blink::WebString& referrer = const blink::WebString& referrer =
blink::WebSecurityPolicy::generateReferrerHeader( blink::WebSecurityPolicy::generateReferrerHeader(
static_cast<blink::WebReferrerPolicy>(referrer_policy_), static_cast<blink::WebReferrerPolicy>(referrer_policy_),
GURL(url_.ToString()), url_,
blink::WebString::fromUTF8(referrer_url_)); blink::WebString::fromUTF8(referrer_url_.spec()));
if (!referrer.isEmpty()) { if (!referrer.isEmpty()) {
request.setHTTPReferrer( request.setHTTPReferrer(
referrer, referrer,
@ -597,8 +601,8 @@ void CefRequestImpl::Get(blink::WebURLRequest& request,
::SetHeaderMap(headermap_, request); ::SetHeaderMap(headermap_, request);
if (!first_party_for_cookies_.empty()) if (!first_party_for_cookies_.is_empty())
request.setFirstPartyForCookies(GURL(first_party_for_cookies_.ToString())); request.setFirstPartyForCookies(first_party_for_cookies_);
request.setCachePolicy((flags_ & UR_FLAG_SKIP_CACHE) ? request.setCachePolicy((flags_ & UR_FLAG_SKIP_CACHE) ?
blink::WebCachePolicy::BypassingCache : blink::WebCachePolicy::BypassingCache :
@ -693,11 +697,11 @@ void CefRequestImpl::Get(const CefMsg_LoadRequest_Params& params,
void CefRequestImpl::Get(CefNavigateParams& params) const { void CefRequestImpl::Get(CefNavigateParams& params) const {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
params.url = GURL(url_.ToString()); params.url = url_;
params.method = method_; params.method = method_;
// Referrer policy will be applied later in the request pipeline. // Referrer policy will be applied later in the request pipeline.
params.referrer.url = GURL(referrer_url_.ToString()); params.referrer.url = referrer_url_;
params.referrer.policy = params.referrer.policy =
static_cast<blink::WebReferrerPolicy>(referrer_policy_); static_cast<blink::WebReferrerPolicy>(referrer_policy_);
@ -710,7 +714,7 @@ void CefRequestImpl::Get(CefNavigateParams& params) const {
impl->Get(*params.upload_data.get()); impl->Get(*params.upload_data.get());
} }
params.first_party_for_cookies = GURL(first_party_for_cookies_.ToString()); params.first_party_for_cookies = first_party_for_cookies_;
params.load_flags = flags_; params.load_flags = flags_;
} }
@ -718,7 +722,7 @@ void CefRequestImpl::Get(net::URLFetcher& fetcher,
int64& upload_data_size) const { int64& upload_data_size) const {
base::AutoLock lock_scope(lock_); base::AutoLock lock_scope(lock_);
if (!referrer_url_.empty()) { if (!referrer_url_.is_empty()) {
fetcher.SetReferrer(GetURLRequestReferrer(referrer_url_)); fetcher.SetReferrer(GetURLRequestReferrer(referrer_url_));
fetcher.SetReferrerPolicy(GetURLRequestReferrerPolicy(referrer_policy_)); fetcher.SetReferrerPolicy(GetURLRequestReferrerPolicy(referrer_policy_));
} }
@ -781,8 +785,8 @@ void CefRequestImpl::Get(net::URLFetcher& fetcher,
} }
} }
if (!first_party_for_cookies_.empty()) if (!first_party_for_cookies_.is_empty())
fetcher.SetInitiatorURL(GURL(first_party_for_cookies_.ToString())); fetcher.SetInitiatorURL(first_party_for_cookies_);
if (flags_ & UR_FLAG_NO_RETRY_ON_5XX) if (flags_ & UR_FLAG_NO_RETRY_ON_5XX)
fetcher.SetAutomaticallyRetryOn5xx(false); fetcher.SetAutomaticallyRetryOn5xx(false);
@ -873,9 +877,9 @@ void CefRequestImpl::Reset() {
lock_.AssertAcquired(); lock_.AssertAcquired();
DCHECK(!read_only_); DCHECK(!read_only_);
url_.clear(); url_ = GURL();
method_ = "GET"; method_ = "GET";
referrer_url_.clear(); referrer_url_ = GURL();
referrer_policy_ = REFERRER_POLICY_DEFAULT; referrer_policy_ = REFERRER_POLICY_DEFAULT;
postdata_ = NULL; postdata_ = NULL;
headermap_.clear(); headermap_.clear();
@ -883,7 +887,7 @@ void CefRequestImpl::Reset() {
transition_type_ = TT_EXPLICIT; transition_type_ = TT_EXPLICIT;
identifier_ = 0U; identifier_ = 0U;
flags_ = UR_FLAG_NONE; flags_ = UR_FLAG_NONE;
first_party_for_cookies_.clear(); first_party_for_cookies_ = GURL();
changes_ = kChangedNone; changes_ = kChangedNone;
} }

View File

@ -12,6 +12,7 @@
#include "base/synchronization/lock.h" #include "base/synchronization/lock.h"
#include "third_party/WebKit/public/platform/WebHTTPBody.h" #include "third_party/WebKit/public/platform/WebHTTPBody.h"
#include "url/gurl.h"
namespace navigation_interception { namespace navigation_interception {
class NavigationParams; class NavigationParams;
@ -121,9 +122,9 @@ class CefRequestImpl : public CefRequest {
void Reset(); void Reset();
CefString url_; GURL url_;
CefString method_; std::string method_;
CefString referrer_url_; GURL referrer_url_;
ReferrerPolicy referrer_policy_; ReferrerPolicy referrer_policy_;
CefRefPtr<CefPostData> postdata_; CefRefPtr<CefPostData> postdata_;
HeaderMap headermap_; HeaderMap headermap_;
@ -133,7 +134,7 @@ class CefRequestImpl : public CefRequest {
// The below members are used by CefURLRequest. // The below members are used by CefURLRequest.
int flags_; int flags_;
CefString first_party_for_cookies_; GURL first_party_for_cookies_;
// True if this object is read-only. // True if this object is read-only.
bool read_only_; bool read_only_;