diff options
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/automation/automation_profile_impl.cc | 42 | ||||
-rw-r--r-- | chrome/browser/automation/url_request_automation_job.cc | 29 | ||||
-rw-r--r-- | chrome/browser/net/chrome_cookie_policy.cc | 162 | ||||
-rw-r--r-- | chrome/browser/net/chrome_cookie_policy.h | 74 | ||||
-rw-r--r-- | chrome/browser/net/chrome_url_request_context.cc | 53 | ||||
-rw-r--r-- | chrome/browser/net/chrome_url_request_context.h | 13 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_message_filter.cc | 162 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_message_filter.h | 4 |
8 files changed, 137 insertions, 402 deletions
diff --git a/chrome/browser/automation/automation_profile_impl.cc b/chrome/browser/automation/automation_profile_impl.cc index d09b036..3a1387d 100644 --- a/chrome/browser/automation/automation_profile_impl.cc +++ b/chrome/browser/automation/automation_profile_impl.cc @@ -58,12 +58,8 @@ class AutomationCookieStore : public net::CookieStore { } // CookieStore implementation. - virtual bool SetCookieWithOptions(const GURL& url, - const std::string& cookie_line, - const net::CookieOptions& options) { - bool cookie_set = - original_cookie_store_->SetCookieWithOptions(url, cookie_line, - options); + virtual bool SetCookie(const GURL& url, const std::string& cookie_line) { + bool cookie_set = original_cookie_store_->SetCookie(url, cookie_line); if (cookie_set) { // TODO(eroman): Should NOT be accessing the profile from here, as this // is running on the IO thread. @@ -72,14 +68,48 @@ class AutomationCookieStore : public net::CookieStore { } return cookie_set; } + virtual bool SetCookieWithOptions(const GURL& url, + const std::string& cookie_line, + const net::CookieOptions& options) { + return original_cookie_store_->SetCookieWithOptions(url, cookie_line, + options); + } + virtual bool SetCookieWithCreationTime(const GURL& url, + const std::string& cookie_line, + const base::Time& creation_time) { + return original_cookie_store_->SetCookieWithCreationTime(url, cookie_line, + creation_time); + } + virtual bool SetCookieWithCreationTimeWithOptions( + const GURL& url, + const std::string& cookie_line, + const base::Time& creation_time, + const net::CookieOptions& options) { + return original_cookie_store_->SetCookieWithCreationTimeWithOptions(url, + cookie_line, creation_time, options); + } + virtual void SetCookies(const GURL& url, + const std::vector<std::string>& cookies) { + original_cookie_store_->SetCookies(url, cookies); + } + virtual void SetCookiesWithOptions(const GURL& url, + const std::vector<std::string>& cookies, + const net::CookieOptions& options) { + original_cookie_store_->SetCookiesWithOptions(url, cookies, options); + } + virtual std::string GetCookies(const GURL& url) { + return original_cookie_store_->GetCookies(url); + } virtual std::string GetCookiesWithOptions(const GURL& url, const net::CookieOptions& options) { return original_cookie_store_->GetCookiesWithOptions(url, options); } + virtual void DeleteCookie(const GURL& url, const std::string& cookie_name) { return original_cookie_store_->DeleteCookie(url, cookie_name); } + virtual net::CookieMonster* GetCookieMonster() { return original_cookie_store_->GetCookieMonster(); } diff --git a/chrome/browser/automation/url_request_automation_job.cc b/chrome/browser/automation/url_request_automation_job.cc index 77e927f..319b976 100644 --- a/chrome/browser/automation/url_request_automation_job.cc +++ b/chrome/browser/automation/url_request_automation_job.cc @@ -13,6 +13,7 @@ #include "chrome/browser/renderer_host/resource_dispatcher_host_request_info.h" #include "chrome/test/automation/automation_messages.h" #include "net/base/cookie_monster.h" +#include "net/base/cookie_policy.h" #include "net/base/io_buffer.h" #include "net/base/net_errors.h" #include "net/http/http_util.h" @@ -297,9 +298,6 @@ void URLRequestAutomationJob::OnRequestStarted(int tab, int id, URLRequestContext* ctx = request_->context(); std::vector<std::string> response_cookies; - // NOTE: We ignore Chrome's cookie policy to allow the automation to - // decide what cookies should be set. - if (!response.headers.empty()) { headers_ = new net::HttpResponseHeaders( net::HttpUtil::AssembleRawHeaders(response.headers.data(), @@ -314,23 +312,30 @@ void URLRequestAutomationJob::OnRequestStarted(int tab, int id, response_cookies.push_back(value); } - if (response_cookies.size() && ctx && ctx->cookie_store()) { - net::CookieOptions options; - options.set_include_httponly(); - ctx->cookie_store()->SetCookiesWithOptions(url_for_cookies, - response_cookies, - options); + if (response_cookies.size()) { + if (ctx && ctx->cookie_store() && (!ctx->cookie_policy() || + ctx->cookie_policy()->CanSetCookie( + url_for_cookies, request_->first_party_for_cookies()))) { + net::CookieOptions options; + options.set_include_httponly(); + ctx->cookie_store()->SetCookiesWithOptions(url_for_cookies, + response_cookies, + options); + } } } - if (!response.persistent_cookies.empty() && ctx && ctx->cookie_store()) { + if (!response.persistent_cookies.empty() && ctx && ctx->cookie_store() && + (!ctx->cookie_policy() || ctx->cookie_policy()->CanSetCookie( + url_for_cookies, request_->first_party_for_cookies()))) { StringTokenizer cookie_parser(response.persistent_cookies, ";"); net::CookieMonster::CookieList existing_cookies; net::CookieMonster* monster = ctx->cookie_store()->GetCookieMonster(); DCHECK(monster); - if (monster) - existing_cookies = monster->GetAllCookiesForURL(url_for_cookies); + if (monster) { + existing_cookies = monster->GetRawCookies(url_for_cookies); + } while (cookie_parser.GetNext()) { std::string cookie_string = cookie_parser.token(); diff --git a/chrome/browser/net/chrome_cookie_policy.cc b/chrome/browser/net/chrome_cookie_policy.cc deleted file mode 100644 index 3e924d1..0000000 --- a/chrome/browser/net/chrome_cookie_policy.cc +++ /dev/null @@ -1,162 +0,0 @@ -// Copyright (c) 2010 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. - -#include "chrome/browser/net/chrome_cookie_policy.h" - -#include "base/string_util.h" -#include "chrome/browser/chrome_thread.h" -#include "chrome/browser/host_content_settings_map.h" -#include "googleurl/src/gurl.h" -#include "net/base/net_errors.h" -#include "net/base/static_cookie_policy.h" - -// If we queue up more than this number of completions, then switch from ASK to -// BLOCK. More than this number of requests at once seems like it could be a -// sign of trouble anyways. -static const size_t kMaxCompletionsPerHost = 10000; - -ChromeCookiePolicy::ChromeCookiePolicy(HostContentSettingsMap* map) - : host_content_settings_map_(map) { -} - -ChromeCookiePolicy::~ChromeCookiePolicy() { - DCHECK(host_completions_map_.empty()); -} - -int ChromeCookiePolicy::CanGetCookies(const GURL& url, - const GURL& first_party, - net::CompletionCallback* callback) { - if (host_content_settings_map_->BlockThirdPartyCookies()) { - net::StaticCookiePolicy policy( - net::StaticCookiePolicy::BLOCK_THIRD_PARTY_COOKIES); - int rv = policy.CanGetCookies(url, first_party, NULL); - if (rv != net::OK) - return rv; - } - - const std::string& host = url.host(); - - ContentSetting setting = host_content_settings_map_->GetContentSetting( - host, CONTENT_SETTINGS_TYPE_COOKIES); - if (setting == CONTENT_SETTING_BLOCK) - return net::ERR_ACCESS_DENIED; - if (setting == CONTENT_SETTING_ALLOW) - return net::OK; - - DCHECK(callback); - - // If we are currently prompting the user for a 'set-cookie' matching this - // host, then we need to defer reading cookies. - - HostCompletionsMap::iterator it = host_completions_map_.find(host); - if (it == host_completions_map_.end()) - return net::OK; - - if (it->second.size() >= kMaxCompletionsPerHost) { - LOG(ERROR) << "Would exceed kMaxCompletionsPerHost"; - return net::ERR_ACCESS_DENIED; - } - - it->second.push_back(Completion::ForGetCookies(callback)); - - return net::ERR_IO_PENDING; -} - -int ChromeCookiePolicy::CanSetCookie(const GURL& url, - const GURL& first_party, - const std::string& cookie_line, - net::CompletionCallback* callback) { - if (host_content_settings_map_->BlockThirdPartyCookies()) { - net::StaticCookiePolicy policy( - net::StaticCookiePolicy::BLOCK_THIRD_PARTY_COOKIES); - int rv = policy.CanSetCookie(url, first_party, cookie_line, NULL); - if (rv != net::OK) - return rv; - } - - const std::string& host = url.host(); - - ContentSetting setting = host_content_settings_map_->GetContentSetting( - host, CONTENT_SETTINGS_TYPE_COOKIES); - if (setting == CONTENT_SETTING_BLOCK) - return net::ERR_ACCESS_DENIED; - if (setting == CONTENT_SETTING_ALLOW) - return net::OK; - - DCHECK(callback); - - // Else, ask the user... - - Completions& completions = host_completions_map_[host]; - - if (completions.size() >= kMaxCompletionsPerHost) { - LOG(ERROR) << "Would exceed kMaxCompletionsPerHost"; - return net::ERR_ACCESS_DENIED; - } - - completions.push_back(Completion::ForSetCookie(callback)); - - PromptForSetCookie(host, cookie_line); - return net::ERR_IO_PENDING; -} - -void ChromeCookiePolicy::PromptForSetCookie(const std::string &host, - const std::string& cookie_line) { - if (!ChromeThread::CurrentlyOn(ChromeThread::UI)) { - ChromeThread::PostTask( - ChromeThread::UI, FROM_HERE, - NewRunnableMethod(this, &ChromeCookiePolicy::PromptForSetCookie, host, - cookie_line)); - return; - } - - // TODO(darin): Prompt user! -#if 0 - MessageBox(NULL, - UTF8ToWide(cookie_line).c_str(), - UTF8ToWide(host).c_str(), - MB_OK); -#endif - - DidPromptForSetCookie(host, net::OK); -} - -void ChromeCookiePolicy::DidPromptForSetCookie(const std::string &host, - int result) { - if (!ChromeThread::CurrentlyOn(ChromeThread::IO)) { - ChromeThread::PostTask( - ChromeThread::IO, FROM_HERE, - NewRunnableMethod(this, &ChromeCookiePolicy::DidPromptForSetCookie, - host, result)); - return; - } - - // Notify all callbacks, starting with the first until we hit another that - // is for a 'set-cookie'. - HostCompletionsMap::iterator it = host_completions_map_.find(host); - CHECK(it != host_completions_map_.end()); - - Completions& completions = it->second; - CHECK(!completions.empty() && completions[0].is_set_cookie_request()); - - // Gather the list of callbacks to notify, and remove them from the - // completions list before handing control to the callbacks (in case - // they should call back into us to modify host_completions_map_). - - std::vector<net::CompletionCallback*> callbacks; - callbacks.push_back(completions[0].callback()); - size_t i = 1; - for (; i < completions.size(); ++i) { - if (completions[i].is_set_cookie_request()) - break; - callbacks.push_back(completions[i].callback()); - } - completions.erase(completions.begin(), completions.begin() + i); - - if (completions.empty()) - host_completions_map_.erase(it); - - for (size_t j = 0; j < callbacks.size(); ++j) - callbacks[j]->Run(result); -} diff --git a/chrome/browser/net/chrome_cookie_policy.h b/chrome/browser/net/chrome_cookie_policy.h deleted file mode 100644 index 0d536f8..0000000 --- a/chrome/browser/net/chrome_cookie_policy.h +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) 2010 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. - -#ifndef CHROME_BROWSER_NET_CHROME_COOKIE_POLICY_H_ -#define CHROME_BROWSER_NET_CHROME_COOKIE_POLICY_H_ - -#include <map> -#include <vector> - -#include "base/ref_counted.h" -#include "net/base/cookie_policy.h" - -class HostContentSettingsMap; - -// Implements CookiePolicy that may delay queries to ask the user to decide. -// -// We will only prompt the user before setting a cookie. We do not prompt the -// user before getting a cookie. However, if we are in the process of -// prompting the user, then any requests to get cookies will be deferred. -// This is done so that cookie requests remain FIFO. -// -class ChromeCookiePolicy - : public base::RefCountedThreadSafe<ChromeCookiePolicy>, - public net::CookiePolicy { - public: - explicit ChromeCookiePolicy(HostContentSettingsMap* map); - ~ChromeCookiePolicy(); - - // CookiePolicy methods: - virtual int CanGetCookies(const GURL& url, const GURL& first_party, - net::CompletionCallback* callback); - virtual int CanSetCookie(const GURL& url, const GURL& first_party, - const std::string& cookie_line, - net::CompletionCallback* callback); - - private: - class Completion { - public: - static Completion ForSetCookie(net::CompletionCallback* callback) { - return Completion(true, callback); - } - - static Completion ForGetCookies(net::CompletionCallback* callback) { - return Completion(false, callback); - } - - bool is_set_cookie_request() const { return is_set_cookie_request_; } - net::CompletionCallback* callback() const { return callback_; } - - private: - Completion(bool is_set_cookie_request, net::CompletionCallback* callback) - : is_set_cookie_request_(is_set_cookie_request), - callback_(callback) { - } - - bool is_set_cookie_request_; - net::CompletionCallback* callback_; - }; - - typedef std::vector<Completion> Completions; - typedef std::map<std::string, Completions> HostCompletionsMap; - - void PromptForSetCookie(const std::string& host, - const std::string& cookie_line); - void DidPromptForSetCookie(const std::string& host, int result); - - // A map from hostname to callbacks awaiting a cookie policy response. - HostCompletionsMap host_completions_map_; - - scoped_refptr<HostContentSettingsMap> host_content_settings_map_; -}; - -#endif // CHROME_BROWSER_NET_CHROME_COOKIE_POLICY_H_ diff --git a/chrome/browser/net/chrome_url_request_context.cc b/chrome/browser/net/chrome_url_request_context.cc index 8013800..6b97030 100644 --- a/chrome/browser/net/chrome_url_request_context.cc +++ b/chrome/browser/net/chrome_url_request_context.cc @@ -184,9 +184,6 @@ ChromeURLRequestContext* FactoryForOriginal::Create() { context->set_cookie_store(new net::CookieMonster(cookie_db.get())); } - context->set_cookie_policy( - new ChromeCookiePolicy(host_content_settings_map_)); - // Create a new AppCacheService (issues fetches through the // main URLRequestContext that we just created). context->set_appcache_service( @@ -265,8 +262,6 @@ ChromeURLRequestContext* FactoryForOffTheRecord::Create() { new net::HttpCache(context->host_resolver(), context->proxy_service(), context->ssl_config_service(), 0); context->set_cookie_store(new net::CookieMonster); - context->set_cookie_policy( - new ChromeCookiePolicy(host_content_settings_map_)); context->set_http_transaction_factory(cache); if (CommandLine::ForCurrentProcess()->HasSwitch( @@ -305,7 +300,6 @@ ChromeURLRequestContext* FactoryForOffTheRecordExtensions::Create() { const char* schemes[] = {chrome::kExtensionScheme}; cookie_monster->SetCookieableSchemes(schemes, 1); context->set_cookie_store(cookie_monster); - // No dynamic cookie policy for extensions. return context; } @@ -347,8 +341,6 @@ ChromeURLRequestContext* FactoryForMedia::Create() { context->set_proxy_service(main_context->proxy_service()); // Also share the cookie store of the common profile. context->set_cookie_store(main_context->cookie_store()); - context->set_cookie_policy( - static_cast<ChromeCookiePolicy*>(main_context->cookie_policy())); // Create a media cache with default size. // TODO(hclam): make the maximum size of media cache configurable. @@ -614,6 +606,8 @@ void ChromeURLRequestContextGetter::GetCookieStoreAsyncHelper( ChromeURLRequestContext::ChromeURLRequestContext() { CheckCurrentlyOnIOThread(); + cookie_policy_ = this; // We implement CookiePolicy + url_request_tracker()->SetGraveyardFilter( &ChromeURLRequestContext::ShouldTrackRequest); } @@ -646,9 +640,6 @@ ChromeURLRequestContext::~ChromeURLRequestContext() { delete ftp_transaction_factory_; delete http_transaction_factory_; - // cookie_policy_'s lifetime is auto-managed by chrome_cookie_policy_. We - // null this out here to avoid a dangling reference to chrome_cookie_policy_ - // when ~URLRequestContext runs. cookie_policy_ = NULL; } @@ -765,10 +756,48 @@ bool ChromeURLRequestContext::AreCookiesEnabled() const { return setting != CONTENT_SETTING_BLOCK; } +bool ChromeURLRequestContext::CanGetCookies(const GURL& url, + const GURL& first_party) { + if (host_content_settings_map_->BlockThirdPartyCookies()) { + net::StaticCookiePolicy policy( + net::StaticCookiePolicy::BLOCK_THIRD_PARTY_COOKIES); + if (!policy.CanGetCookies(url, first_party)) + return false; + } + + ContentSetting setting = host_content_settings_map_->GetContentSetting( + url.host(), CONTENT_SETTINGS_TYPE_COOKIES); + if (setting == CONTENT_SETTING_BLOCK) + return false; + + // TODO(darin): Implement CONTENT_SETTING_ASK + return true; +} + +bool ChromeURLRequestContext::CanSetCookie(const GURL& url, + const GURL& first_party) { + if (host_content_settings_map_->BlockThirdPartyCookies()) { + net::StaticCookiePolicy policy( + net::StaticCookiePolicy::BLOCK_THIRD_PARTY_COOKIES); + if (!policy.CanSetCookie(url, first_party)) + return false; + } + + ContentSetting setting = host_content_settings_map_->GetContentSetting( + url.host(), CONTENT_SETTINGS_TYPE_COOKIES); + if (setting == CONTENT_SETTING_BLOCK) + return false; + + // TODO(darin): Implement CONTENT_SETTING_ASK + return true; +} + ChromeURLRequestContext::ChromeURLRequestContext( ChromeURLRequestContext* other) { CheckCurrentlyOnIOThread(); + cookie_policy_ = this; // We implement CookiePolicy + // Set URLRequestContext members host_resolver_ = other->host_resolver_; proxy_service_ = other->proxy_service_; @@ -776,7 +805,6 @@ ChromeURLRequestContext::ChromeURLRequestContext( http_transaction_factory_ = other->http_transaction_factory_; ftp_transaction_factory_ = other->ftp_transaction_factory_; cookie_store_ = other->cookie_store_; - cookie_policy_ = other->cookie_policy_; transport_security_state_ = other->transport_security_state_; accept_language_ = other->accept_language_; accept_charset_ = other->accept_charset_; @@ -786,7 +814,6 @@ ChromeURLRequestContext::ChromeURLRequestContext( extension_info_ = other->extension_info_; user_script_dir_path_ = other->user_script_dir_path_; appcache_service_ = other->appcache_service_; - chrome_cookie_policy_ = other->chrome_cookie_policy_; host_content_settings_map_ = other->host_content_settings_map_; host_zoom_map_ = other->host_zoom_map_; privacy_blacklist_ = other->privacy_blacklist_; diff --git a/chrome/browser/net/chrome_url_request_context.h b/chrome/browser/net/chrome_url_request_context.h index f52029e..8d4186d 100644 --- a/chrome/browser/net/chrome_url_request_context.h +++ b/chrome/browser/net/chrome_url_request_context.h @@ -11,7 +11,6 @@ #include "chrome/browser/host_content_settings_map.h" #include "chrome/browser/host_zoom_map.h" #include "chrome/browser/privacy_blacklist/blacklist.h" -#include "chrome/browser/net/chrome_cookie_policy.h" #include "chrome/browser/net/url_request_context_getter.h" #include "chrome/common/appcache/chrome_appcache_service.h" #include "chrome/common/extensions/extension.h" @@ -35,7 +34,8 @@ class IOThread; // // All methods of this class must be called from the IO thread, // including the constructor and destructor. -class ChromeURLRequestContext : public URLRequestContext { +class ChromeURLRequestContext : public URLRequestContext, + public net::CookiePolicy { public: // Maintains some extension-related state we need on the IO thread. // TODO(aa): It would be cool if the Extension objects in ExtensionsService @@ -121,6 +121,10 @@ class ChromeURLRequestContext : public URLRequestContext { // False only if cookies are globally blocked without exception. bool AreCookiesEnabled() const; + // CookiePolicy methods: + virtual bool CanGetCookies(const GURL& url, const GURL& first_party); + virtual bool CanSetCookie(const GURL& url, const GURL& first_party); + protected: // Copies the dependencies from |other| into |this|. If you use this // constructor, then you should hold a reference to |other|, as we @@ -163,10 +167,6 @@ class ChromeURLRequestContext : public URLRequestContext { void set_cookie_store(net::CookieStore* cookie_store) { cookie_store_ = cookie_store; } - void set_cookie_policy(ChromeCookiePolicy* cookie_policy) { - chrome_cookie_policy_ = cookie_policy; // Take a strong reference. - cookie_policy_ = cookie_policy; - } void set_proxy_service(net::ProxyService* service) { proxy_service_ = service; } @@ -206,7 +206,6 @@ class ChromeURLRequestContext : public URLRequestContext { FilePath user_script_dir_path_; scoped_refptr<ChromeAppCacheService> appcache_service_; - scoped_refptr<ChromeCookiePolicy> chrome_cookie_policy_; scoped_refptr<HostContentSettingsMap> host_content_settings_map_; scoped_refptr<HostZoomMap> host_zoom_map_; scoped_refptr<Blacklist> privacy_blacklist_; diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc index 2861718..1bcb7a7 100644 --- a/chrome/browser/renderer_host/resource_message_filter.cc +++ b/chrome/browser/renderer_host/resource_message_filter.cc @@ -152,99 +152,6 @@ Blacklist::Match* GetPrivacyBlacklistMatchForURL( return blacklist->FindMatch(url); } -class SetCookieCompletion : public net::CompletionCallback { - public: - SetCookieCompletion(const GURL& url, const std::string& cookie_line, - URLRequestContext* context) - : url_(url), - cookie_line_(cookie_line), - context_(context) { - } - - virtual void RunWithParams(const Tuple1<int>& params) { - int result = params.a; - if (result == net::OK) - context_->cookie_store()->SetCookie(url_, cookie_line_); - delete this; - } - - private: - GURL url_; - std::string cookie_line_; - scoped_refptr<URLRequestContext> context_; -}; - -class GetCookiesCompletion : public net::CompletionCallback { - public: - GetCookiesCompletion(const GURL& url, IPC::Message* reply_msg, - ResourceMessageFilter* filter, - URLRequestContext* context) - : url_(url), - reply_msg_(reply_msg), - filter_(filter), - context_(context) { - } - - virtual void RunWithParams(const Tuple1<int>& params) { - int result = params.a; - std::string cookies; - if (result == net::OK) - cookies = context_->cookie_store()->GetCookies(url_); - ViewHostMsg_GetCookies::WriteReplyParams(reply_msg_, cookies); - filter_->Send(reply_msg_); - delete this; - } - - private: - GURL url_; - IPC::Message* reply_msg_; - scoped_refptr<ResourceMessageFilter> filter_; - scoped_refptr<URLRequestContext> context_; -}; - -class GetRawCookiesCompletion : public net::CompletionCallback { - public: - GetRawCookiesCompletion(const GURL& url, IPC::Message* reply_msg, - ResourceMessageFilter* filter, - URLRequestContext* context) - : url_(url), - reply_msg_(reply_msg), - filter_(filter), - context_(context) { - } - - virtual void RunWithParams(const Tuple1<int>& params) { - // Ignore the policy result. We only waited on the policy result so that - // any pending 'set-cookie' requests could be flushed. The intent of - // querying the raw cookies is to reveal the contents of the cookie DB, so - // it important that we don't read the cookie db ahead of pending writes. - - net::CookieMonster* cookie_monster = - context_->cookie_store()->GetCookieMonster(); - net::CookieMonster::CookieList cookie_list = - cookie_monster->GetAllCookiesForURL(url_); - - std::vector<webkit_glue::WebCookie> cookies; - for (size_t i = 0; i < cookie_list.size(); ++i) { - // TODO(darin): url.host() is not necessarily the domain of the cookie. - // We need a different API on CookieMonster to provide the domain info. - // See http://crbug.com/34315. - cookies.push_back( - webkit_glue::WebCookie(cookie_list[i].first, cookie_list[i].second)); - } - - ViewHostMsg_GetRawCookies::WriteReplyParams(reply_msg_, cookies); - filter_->Send(reply_msg_); - delete this; - } - - private: - GURL url_; - IPC::Message* reply_msg_; - scoped_refptr<ResourceMessageFilter> filter_; - scoped_refptr<URLRequestContext> context_; -}; - } // namespace ResourceMessageFilter::ResourceMessageFilter( @@ -395,8 +302,8 @@ bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& msg) { IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWindow, OnMsgCreateWindow) IPC_MESSAGE_HANDLER(ViewHostMsg_CreateWidget, OnMsgCreateWidget) IPC_MESSAGE_HANDLER(ViewHostMsg_SetCookie, OnSetCookie) - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetCookies, OnGetCookies) - IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_GetRawCookies, OnGetRawCookies) + IPC_MESSAGE_HANDLER(ViewHostMsg_GetCookies, OnGetCookies) + IPC_MESSAGE_HANDLER(ViewHostMsg_GetRawCookies, OnGetRawCookies) IPC_MESSAGE_HANDLER(ViewHostMsg_DeleteCookie, OnDeleteCookie) IPC_MESSAGE_HANDLER(ViewHostMsg_GetCookiesEnabled, OnGetCookiesEnabled) #if defined(OS_WIN) // This hack is Windows-specific. @@ -576,55 +483,58 @@ void ResourceMessageFilter::OnSetCookie(const GURL& url, const std::string& cookie) { ChromeURLRequestContext* context = GetRequestContextForURL(url); + DCHECK(context->cookie_policy()); + if (!context->cookie_policy()->CanSetCookie(url, first_party_for_cookies)) + return; scoped_ptr<Blacklist::Match> match( GetPrivacyBlacklistMatchForURL(url, context)); if (match.get() && (match->attributes() & Blacklist::kBlockCookies)) return; - - SetCookieCompletion* callback = new SetCookieCompletion(url, cookie, context); - - DCHECK(context->cookie_policy()); - int policy = context->cookie_policy()->CanSetCookie( - url, first_party_for_cookies, cookie, callback); - if (policy == net::ERR_IO_PENDING) - return; - callback->Run(policy); + context->cookie_store()->SetCookie(url, cookie); } void ResourceMessageFilter::OnGetCookies(const GURL& url, const GURL& first_party_for_cookies, - IPC::Message* reply_msg) { + std::string* cookies) { URLRequestContext* context = GetRequestContextForURL(url); - - GetCookiesCompletion* callback = - new GetCookiesCompletion(url, reply_msg, this, context); - DCHECK(context->cookie_policy()); - int policy = context->cookie_policy()->CanGetCookies( - url, first_party_for_cookies, callback); - if (policy == net::ERR_IO_PENDING) - return; - callback->Run(policy); + if (context->cookie_policy()->CanGetCookies(url, first_party_for_cookies)) + *cookies = context->cookie_store()->GetCookies(url); } void ResourceMessageFilter::OnGetRawCookies( const GURL& url, const GURL& first_party_for_cookies, - IPC::Message* reply_msg) { - URLRequestContext* context = GetRequestContextForURL(url); + std::vector<webkit_glue::WebCookie>* raw_cookies) { + raw_cookies->clear(); - GetRawCookiesCompletion* callback = - new GetRawCookiesCompletion(url, reply_msg, this, context); + URLRequestContext* context = GetRequestContextForURL(url); + net::CookieMonster* cookie_monster = context->cookie_store()-> + GetCookieMonster(); + if (!cookie_monster) { + NOTREACHED(); + return; + } - // We check policy here to avoid sending back cookies that would not normally - // be applied to outbound requests for the given URL. Since this cookie info - // is visible in the developer tools, it is helpful to make it match reality. - DCHECK(context->cookie_policy()); - int policy = context->cookie_policy()->CanGetCookies( - url, first_party_for_cookies, callback); - if (policy == net::ERR_IO_PENDING) + if (!context->cookie_policy()->CanGetCookies(url, first_party_for_cookies)) return; - callback->Run(policy); + + typedef net::CookieMonster::CookieList CookieList; + CookieList cookieList = cookie_monster->GetRawCookies(url); + for (CookieList::iterator it = cookieList.begin(); + it != cookieList.end(); ++it) { + net::CookieMonster::CanonicalCookie& cookie = it->second; + raw_cookies->push_back( + webkit_glue::WebCookie( + cookie.Name(), + cookie.Value(), + it->first, + cookie.Path(), + cookie.ExpiryDate().ToDoubleT() * 1000, + cookie.IsHttpOnly(), + cookie.IsSecure(), + !cookie.IsPersistent())); + } } void ResourceMessageFilter::OnDeleteCookie(const GURL& url, diff --git a/chrome/browser/renderer_host/resource_message_filter.h b/chrome/browser/renderer_host/resource_message_filter.h index e813ae1..3931c83 100644 --- a/chrome/browser/renderer_host/resource_message_filter.h +++ b/chrome/browser/renderer_host/resource_message_filter.h @@ -133,10 +133,10 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, const std::string& cookie); void OnGetCookies(const GURL& url, const GURL& first_party_for_cookies, - IPC::Message* reply_msg); + std::string* cookies); void OnGetRawCookies(const GURL& url, const GURL& first_party_for_cookies, - IPC::Message* reply_msg); + std::vector<webkit_glue::WebCookie>* raw_cookies); void OnDeleteCookie(const GURL& url, const std::string& cookieName); void OnGetCookiesEnabled(const GURL& url, |