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