Index: trunk/src/chrome/browser/profiles/profile_io_data.cc |
=================================================================== |
--- trunk/src/chrome/browser/profiles/profile_io_data.cc (revision 219785) |
+++ trunk/src/chrome/browser/profiles/profile_io_data.cc (working copy) |
@@ -36,6 +36,7 @@ |
#include "chrome/browser/extensions/extension_system.h" |
#include "chrome/browser/io_thread.h" |
#include "chrome/browser/net/about_protocol_handler.h" |
+#include "chrome/browser/net/chrome_cookie_notification_details.h" |
#include "chrome/browser/net/chrome_fraudulent_certificate_reporter.h" |
#include "chrome/browser/net/chrome_http_user_agent_settings.h" |
#include "chrome/browser/net/chrome_net_log.h" |
@@ -64,6 +65,7 @@ |
#include "extensions/common/constants.h" |
#include "net/cert/cert_verifier.h" |
#include "net/cookies/canonical_cookie.h" |
+#include "net/cookies/cookie_monster.h" |
#include "net/http/http_transaction_factory.h" |
#include "net/http/http_util.h" |
#include "net/proxy/proxy_config_service_fixed.h" |
@@ -99,6 +101,56 @@ |
namespace { |
+// ---------------------------------------------------------------------------- |
+// CookieMonster::Delegate implementation |
+// ---------------------------------------------------------------------------- |
+class ChromeCookieMonsterDelegate : public net::CookieMonster::Delegate { |
+ public: |
+ explicit ChromeCookieMonsterDelegate( |
+ const base::Callback<Profile*(void)>& profile_getter) |
+ : profile_getter_(profile_getter) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ } |
+ |
+ // net::CookieMonster::Delegate implementation. |
+ virtual void OnCookieChanged( |
+ const net::CanonicalCookie& cookie, |
+ bool removed, |
+ net::CookieMonster::Delegate::ChangeCause cause) OVERRIDE { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&ChromeCookieMonsterDelegate::OnCookieChangedAsyncHelper, |
+ this, cookie, removed, cause)); |
+ } |
+ |
+ private: |
+ virtual ~ChromeCookieMonsterDelegate() {} |
+ |
+ void OnCookieChangedAsyncHelper( |
+ const net::CanonicalCookie& cookie, |
+ bool removed, |
+ net::CookieMonster::Delegate::ChangeCause cause) { |
+ Profile* profile = profile_getter_.Run(); |
+ if (profile) { |
+ ChromeCookieDetails cookie_details(&cookie, removed, cause); |
+ content::NotificationService::current()->Notify( |
+ chrome::NOTIFICATION_COOKIE_CHANGED, |
+ content::Source<Profile>(profile), |
+ content::Details<ChromeCookieDetails>(&cookie_details)); |
+ } |
+ } |
+ |
+ const base::Callback<Profile*(void)> profile_getter_; |
+}; |
+ |
+Profile* GetProfileOnUI(ProfileManager* profile_manager, Profile* profile) { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ DCHECK(profile); |
+ if (profile_manager->IsValidProfile(profile)) |
+ return profile; |
+ return NULL; |
+} |
+ |
#if defined(DEBUG_DEVTOOLS) |
bool IsSupportedDevToolsURL(const GURL& url, base::FilePath* path) { |
std::string bundled_path_prefix(chrome::kChromeUIDevToolsBundledPath); |
@@ -202,6 +254,12 @@ |
params->cookie_settings = CookieSettings::Factory::GetForProfile(profile); |
params->host_content_settings_map = profile->GetHostContentSettingsMap(); |
params->ssl_config_service = profile->GetSSLConfigService(); |
+ base::Callback<Profile*(void)> profile_getter = |
+ base::Bind(&GetProfileOnUI, g_browser_process->profile_manager(), |
+ profile); |
+ params->cookie_monster_delegate = |
+ new chrome_browser_net::EvictedDomainCookieCounter( |
+ new ChromeCookieMonsterDelegate(profile_getter)); |
params->extension_info_map = |
extensions::ExtensionSystem::Get(profile)->info_map(); |
@@ -323,6 +381,12 @@ |
load_time_stats) { |
} |
+void ProfileIOData::AppRequestContext::SetCookieStore( |
+ net::CookieStore* cookie_store) { |
+ cookie_store_ = cookie_store; |
+ set_cookie_store(cookie_store); |
+} |
+ |
void ProfileIOData::AppRequestContext::SetHttpTransactionFactory( |
scoped_ptr<net::HttpTransactionFactory> http_factory) { |
http_factory_ = http_factory.Pass(); |
@@ -409,6 +473,8 @@ |
// are already done in the URLRequestContext destructor. |
if (main_request_context_) |
main_request_context_->AssertNoURLRequests(); |
+ if (extensions_request_context_) |
+ extensions_request_context_->AssertNoURLRequests(); |
current_context = 0; |
for (URLRequestContextMap::iterator it = app_request_context_map_.begin(); |
@@ -513,6 +579,11 @@ |
return context; |
} |
+ChromeURLRequestContext* ProfileIOData::GetExtensionsRequestContext() const { |
+ DCHECK(initialized_); |
+ return extensions_request_context_.get(); |
+} |
+ |
ChromeURLRequestContext* ProfileIOData::GetIsolatedAppRequestContext( |
ChromeURLRequestContext* main_context, |
const StoragePartitionDescriptor& partition_descriptor, |
@@ -692,6 +763,10 @@ |
main_request_context_.reset( |
new ChromeURLRequestContext(ChromeURLRequestContext::CONTEXT_TYPE_MAIN, |
load_time_stats_)); |
+ extensions_request_context_.reset( |
+ new ChromeURLRequestContext( |
+ ChromeURLRequestContext::CONTEXT_TYPE_EXTENSIONS, |
+ load_time_stats_)); |
ChromeNetworkDelegate* network_delegate = |
new ChromeNetworkDelegate( |