172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/net/chrome_url_request_context.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop_proxy.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/browser_process.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/io_thread.h" 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/profiles/profile_io_data.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/chrome_url_data_manager_backend.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/pref_names.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_service.h" 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/base/cookie_store.h" 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/ftp/ftp_transaction_factory.h" 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "net/http/http_transaction_factory.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/http/http_util.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "webkit/glue/webkit_glue.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(USE_NSS) 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "net/ocsp/nss_ocsp.h" 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass ChromeURLRequestContextFactory { 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ChromeURLRequestContextFactory() {} 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual ~ChromeURLRequestContextFactory() {} 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Called to create a new instance (will only be called once). 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual scoped_refptr<ChromeURLRequestContext> Create() = 0; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen protected: 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContextFactory); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsennamespace { 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ---------------------------------------------------------------------------- 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Helper factories 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ---------------------------------------------------------------------------- 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Factory that creates the main ChromeURLRequestContext. 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass FactoryForMain : public ChromeURLRequestContextFactory { 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen explicit FactoryForMain(const ProfileIOData* profile_io_data) 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : profile_io_data_(profile_io_data) {} 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual scoped_refptr<ChromeURLRequestContext> Create() { 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return profile_io_data_->GetMainRequestContext(); 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_refptr<const ProfileIOData> profile_io_data_; 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Factory that creates the ChromeURLRequestContext for extensions. 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FactoryForExtensions : public ChromeURLRequestContextFactory { 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen explicit FactoryForExtensions(const ProfileIOData* profile_io_data) 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : profile_io_data_(profile_io_data) {} 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual scoped_refptr<ChromeURLRequestContext> Create() { 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return profile_io_data_->GetExtensionsRequestContext(); 673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const scoped_refptr<const ProfileIOData> profile_io_data_; 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Factory that creates the ChromeURLRequestContext for a given isolated app. 74ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass FactoryForIsolatedApp : public ChromeURLRequestContextFactory { 75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 76ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen FactoryForIsolatedApp(const ProfileIOData* profile_io_data, 77ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& app_id, 78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeURLRequestContextGetter* main_context) 79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : profile_io_data_(profile_io_data), 80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen app_id_(app_id), 81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_request_context_getter_(main_context) {} 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual scoped_refptr<ChromeURLRequestContext> Create() { 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // We will copy most of the state from the main request context. 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return profile_io_data_->GetIsolatedAppRequestContext( 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_request_context_getter_->GetIOContext(), app_id_); 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const scoped_refptr<const ProfileIOData> profile_io_data_; 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string app_id_; 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_refptr<ChromeURLRequestContextGetter> 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen main_request_context_getter_; 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Factory that creates the ChromeURLRequestContext for media. 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass FactoryForMedia : public ChromeURLRequestContextFactory { 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen explicit FactoryForMedia(const ProfileIOData* profile_io_data) 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : profile_io_data_(profile_io_data) { 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 103dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual scoped_refptr<ChromeURLRequestContext> Create() { 104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen return profile_io_data_->GetMediaRequestContext(); 105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const scoped_refptr<const ProfileIOData> profile_io_data_; 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ---------------------------------------------------------------------------- 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ChromeURLRequestContextGetter 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ---------------------------------------------------------------------------- 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeURLRequestContextGetter::ChromeURLRequestContextGetter( 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch Profile* profile, 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ChromeURLRequestContextFactory* factory) 120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch : io_thread_(g_browser_process->io_thread()), 121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch factory_(factory), 122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch url_request_context_(NULL) { 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(factory); 124dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(profile); 125dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RegisterPrefsObserver(profile); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeURLRequestContextGetter::~ChromeURLRequestContextGetter() { 129dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(registrar_.IsEmpty()) << "Probably didn't call CleanupOnUIThread"; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Either we already transformed the factory into a net::URLRequestContext, or 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // we still have a pending factory. 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK((factory_.get() && !url_request_context_.get()) || 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (!factory_.get() && url_request_context_.get())); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (url_request_context_) 139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch io_thread_->UnregisterURLRequestContextGetter(this); 140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The scoped_refptr / scoped_ptr destructors take care of releasing 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |factory_| and |url_request_context_| now. 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Lazily create a ChromeURLRequestContext using our factory. 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennet::URLRequestContext* ChromeURLRequestContextGetter::GetURLRequestContext() { 147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!url_request_context_) { 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(factory_.get()); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch url_request_context_ = factory_->Create(); 152731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (is_main()) { 153731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick url_request_context_->set_is_main(true); 154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(USE_NSS) 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // TODO(ukai): find a better way to set the net::URLRequestContext for 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // OCSP. 157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick net::SetURLRequestContextForOCSP(url_request_context_); 158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 160731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch factory_.reset(); 162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch io_thread_->RegisterURLRequestContextGetter(this); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return url_request_context_; 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168513209b27ff55e2841eac0e4120199c23acce758Ben Murdochvoid ChromeURLRequestContextGetter::ReleaseURLRequestContext() { 169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DCHECK(url_request_context_); 170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch url_request_context_ = NULL; 171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch} 172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsennet::CookieStore* ChromeURLRequestContextGetter::DONTUSEME_GetCookieStore() { 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If we are running on the IO thread this is real easy. 175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (BrowserThread::CurrentlyOn(BrowserThread::IO)) 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return GetURLRequestContext()->cookie_store(); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If we aren't running on the IO thread, we cannot call 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // GetURLRequestContext(). Instead we will post a task to the IO loop 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // and wait for it to complete. 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::WaitableEvent completion(false, false); 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::CookieStore* result = NULL; 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 185731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 186731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod(this, 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &ChromeURLRequestContextGetter::GetCookieStoreAsyncHelper, 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &completion, 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &result)); 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion.Wait(); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(result); 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return result; 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochscoped_refptr<base::MessageLoopProxy> 198513209b27ff55e2841eac0e4120199c23acce758Ben MurdochChromeURLRequestContextGetter::GetIOMessageLoopProxy() const { 199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeURLRequestContextGetter* ChromeURLRequestContextGetter::CreateOriginal( 20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Profile* profile, 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const ProfileIOData* profile_io_data) { 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!profile->IsOffTheRecord()); 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return new ChromeURLRequestContextGetter( 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile, 209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new FactoryForMain(profile_io_data)); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeURLRequestContextGetter* 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeURLRequestContextGetter::CreateOriginalForMedia( 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Profile* profile, const ProfileIOData* profile_io_data) { 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!profile->IsOffTheRecord()); 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return new ChromeURLRequestContextGetter( 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen profile, 219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new FactoryForMedia(profile_io_data)); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeURLRequestContextGetter* 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeURLRequestContextGetter::CreateOriginalForExtensions( 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Profile* profile, const ProfileIOData* profile_io_data) { 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(!profile->IsOffTheRecord()); 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return new ChromeURLRequestContextGetter( 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch profile, 229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new FactoryForExtensions(profile_io_data)); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeURLRequestContextGetter* 234ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenChromeURLRequestContextGetter::CreateOriginalForIsolatedApp( 235ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Profile* profile, 236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ProfileIOData* profile_io_data, 237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& app_id) { 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(!profile->IsOffTheRecord()); 239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeURLRequestContextGetter* main_context = 240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<ChromeURLRequestContextGetter*>(profile->GetRequestContext()); 241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return new ChromeURLRequestContextGetter( 242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile, 243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new FactoryForIsolatedApp(profile_io_data, app_id, main_context)); 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 245ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 246ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenChromeURLRequestContextGetter* 248dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenChromeURLRequestContextGetter::CreateOffTheRecord( 249dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Profile* profile, const ProfileIOData* profile_io_data) { 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(profile->IsOffTheRecord()); 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return new ChromeURLRequestContextGetter( 252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile, new FactoryForMain(profile_io_data)); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static 2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickChromeURLRequestContextGetter* 2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickChromeURLRequestContextGetter::CreateOffTheRecordForExtensions( 258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Profile* profile, const ProfileIOData* profile_io_data) { 2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(profile->IsOffTheRecord()); 2603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return new ChromeURLRequestContextGetter( 261dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen profile, new FactoryForExtensions(profile_io_data)); 2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 264ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// static 265ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenChromeURLRequestContextGetter* 266ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenChromeURLRequestContextGetter::CreateOffTheRecordForIsolatedApp( 267ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen Profile* profile, 268ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const ProfileIOData* profile_io_data, 269ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen const std::string& app_id) { 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DCHECK(profile->IsOffTheRecord()); 271ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ChromeURLRequestContextGetter* main_context = 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen static_cast<ChromeURLRequestContextGetter*>(profile->GetRequestContext()); 273ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen return new ChromeURLRequestContextGetter( 274ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen profile, 275ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new FactoryForIsolatedApp(profile_io_data, app_id, main_context)); 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 277ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeURLRequestContextGetter::CleanupOnUIThread() { 279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 2803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Unregister for pref notifications. 281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(!registrar_.IsEmpty()) << "Called more than once!"; 2823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick registrar_.RemoveAll(); 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NotificationObserver implementation. 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeURLRequestContextGetter::Observe( 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType type, 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationSource& source, 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const NotificationDetails& details) { 290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (NotificationType::PREF_CHANGED == type) { 2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick std::string* pref_name_in = Details<std::string>(details).ptr(); 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PrefService* prefs = Source<PrefService>(source).ptr(); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(pref_name_in && prefs); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (*pref_name_in == prefs::kAcceptLanguages) { 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string accept_language = 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs->GetString(prefs::kAcceptLanguages); 299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod( 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &ChromeURLRequestContextGetter::OnAcceptLanguageChange, 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch accept_language)); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (*pref_name_in == prefs::kDefaultCharset) { 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string default_charset = 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefs->GetString(prefs::kDefaultCharset); 308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::PostTask( 309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserThread::IO, FROM_HERE, 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NewRunnableMethod( 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this, 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &ChromeURLRequestContextGetter::OnDefaultCharsetChange, 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default_charset)); 31421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } else if (*pref_name_in == prefs::kClearSiteDataOnExit) { 31521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool clear_site_data = 31621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen prefs->GetBoolean(prefs::kClearSiteDataOnExit); 31721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen BrowserThread::PostTask( 31821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen BrowserThread::IO, FROM_HERE, 31921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen NewRunnableMethod( 32021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen this, 32121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen &ChromeURLRequestContextGetter::OnClearSiteDataOnExitChange, 32221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen clear_site_data)); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NOTREACHED(); 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeURLRequestContextGetter::RegisterPrefsObserver(Profile* profile) { 330dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick registrar_.Init(profile->GetPrefs()); 3333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick registrar_.Add(prefs::kAcceptLanguages, this); 3343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick registrar_.Add(prefs::kDefaultCharset, this); 33521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen registrar_.Add(prefs::kClearSiteDataOnExit, this); 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeURLRequestContextGetter::OnAcceptLanguageChange( 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& accept_language) { 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetIOContext()->OnAcceptLanguageChange(accept_language); 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeURLRequestContextGetter::OnDefaultCharsetChange( 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& default_charset) { 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetIOContext()->OnDefaultCharsetChange(default_charset); 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 34821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenvoid ChromeURLRequestContextGetter::OnClearSiteDataOnExitChange( 34921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen bool clear_site_data) { 350ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen GetURLRequestContext()->cookie_store()->GetCookieMonster()-> 35121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen SetClearPersistentStoreOnExit(clear_site_data); 35221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 35321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeURLRequestContextGetter::GetCookieStoreAsyncHelper( 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch base::WaitableEvent* completion, 356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch net::CookieStore** result) { 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Note that CookieStore is refcounted, yet we do not add a reference. 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *result = GetURLRequestContext()->cookie_store(); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch completion->Signal(); 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ---------------------------------------------------------------------------- 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ChromeURLRequestContext 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ---------------------------------------------------------------------------- 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 3663345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickChromeURLRequestContext::ChromeURLRequestContext() 367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : is_incognito_(false) { 368dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 369dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 370dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 371ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid ChromeURLRequestContext::CopyFrom(ChromeURLRequestContext* other) { 372ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen URLRequestContext::CopyFrom(other); 373ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 374ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Copy ChromeURLRequestContext parameters. 375ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_user_script_dir_path(other->user_script_dir_path()); 376ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_appcache_service(other->appcache_service()); 377ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_host_content_settings_map(other->host_content_settings_map()); 378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_host_zoom_map(other->host_zoom_map_); 379ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_blob_storage_context(other->blob_storage_context()); 380ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_file_system_context(other->file_system_context()); 381ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_extension_info_map(other->extension_info_map_); 382ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_prerender_manager(other->prerender_manager()); 383ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // ChromeURLDataManagerBackend is unique per context. 384ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen set_is_incognito(other->is_incognito()); 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenChromeURLDataManagerBackend* 38872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ChromeURLRequestContext::GetChromeURLDataManagerBackend() { 38972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (!chrome_url_data_manager_backend_.get()) 39072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen chrome_url_data_manager_backend_.reset(new ChromeURLDataManagerBackend()); 39172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return chrome_url_data_manager_backend_.get(); 39272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 39372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochChromeURLRequestContext::~ChromeURLRequestContext() { 395dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (appcache_service_.get() && appcache_service_->request_context() == this) 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch appcache_service_->set_request_context(NULL); 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(USE_NSS) 401731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (is_main()) { 40272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen net::URLRequestContext* ocsp_context = net::GetURLRequestContextForOCSP(); 403513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (ocsp_context) { 404513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch DCHECK_EQ(this, ocsp_context); 40572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We are releasing the net::URLRequestContext used by OCSP handlers. 406513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch net::SetURLRequestContextForOCSP(NULL); 407513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::current()->Notify( 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationType::URL_REQUEST_CONTEXT_RELEASED, 41372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen Source<net::URLRequestContext>(this), 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch NotificationService::NoDetails()); 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // cookie_policy_'s lifetime is auto-managed by chrome_cookie_policy_. We 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // null this out here to avoid a dangling reference to chrome_cookie_policy_ 41872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // when ~net::URLRequestContext runs. 419dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen set_cookie_policy(NULL); 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst std::string& ChromeURLRequestContext::GetUserAgent( 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url) const { 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return webkit_glue::GetUserAgent(url); 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeURLRequestContext::OnAcceptLanguageChange( 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& accept_language) { 429dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 430dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen set_accept_language( 431dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::HttpUtil::GenerateAcceptLanguageHeader(accept_language)); 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ChromeURLRequestContext::OnDefaultCharsetChange( 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string& default_charset) { 436dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 437dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen set_referrer_charset(default_charset); 438dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen set_accept_charset( 439dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen net::HttpUtil::GenerateAcceptCharsetHeader(default_charset)); 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 441