// Copyright (c) 2011 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_URL_REQUEST_CONTEXT_H_
#define CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_H_
#pragma once
#include <string>
#include <vector>
#include "base/file_path.h"
#include "chrome/browser/content_settings/host_content_settings_map.h"
#include "chrome/browser/extensions/extension_info_map.h"
#include "chrome/browser/extensions/extension_webrequest_api.h"
#include "chrome/browser/prefs/pref_change_registrar.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/prerender/prerender_manager.h"
#include "chrome/common/extensions/extension_icon_set.h"
#include "content/browser/appcache/chrome_appcache_service.h"
#include "content/browser/chrome_blob_storage_context.h"
#include "content/browser/host_zoom_map.h"
#include "net/base/cookie_policy.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
#include "webkit/fileapi/file_system_context.h"
class ChromeURLDataManagerBackend;
class ChromeURLRequestContextFactory;
class IOThread;
namespace net {
class DnsCertProvenanceChecker;
class NetworkDelegate;
}
class PrefService;
class Profile;
class ProfileIOData;
// Subclass of net::URLRequestContext which can be used to store extra
// information for requests.
//
// All methods of this class must be called from the IO thread,
// including the constructor and destructor.
class ChromeURLRequestContext : public net::URLRequestContext {
public:
ChromeURLRequestContext();
// Copies the state from |other| into this context.
void CopyFrom(ChromeURLRequestContext* other);
// Gets the path to the directory user scripts are stored in.
FilePath user_script_dir_path() const {
return user_script_dir_path_;
}
// Gets the appcache service to be used for requests in this context.
// May be NULL if requests for this context aren't subject to appcaching.
ChromeAppCacheService* appcache_service() const {
return appcache_service_.get();
}
// Gets the blob storage context associated with this context's profile.
ChromeBlobStorageContext* blob_storage_context() const {
return blob_storage_context_.get();
}
// Gets the file system host context with this context's profile.
fileapi::FileSystemContext* file_system_context() const {
return file_system_context_.get();
}
bool is_incognito() const {
return is_incognito_;
}
virtual const std::string& GetUserAgent(const GURL& url) const;
HostContentSettingsMap* host_content_settings_map() {
return host_content_settings_map_;
}
const HostZoomMap* host_zoom_map() const { return host_zoom_map_; }
const ExtensionInfoMap* extension_info_map() const {
return extension_info_map_;
}
prerender::PrerenderManager* prerender_manager() {
return prerender_manager_.get();
}
ChromeURLDataManagerBackend* GetChromeURLDataManagerBackend();
// Setters to simplify initializing from factory objects.
void set_user_script_dir_path(const FilePath& path) {
user_script_dir_path_ = path;
}
void set_is_incognito(bool is_incognito) {
is_incognito_ = is_incognito;
}
void set_host_content_settings_map(
HostContentSettingsMap* host_content_settings_map) {
host_content_settings_map_ = host_content_settings_map;
}
void set_host_zoom_map(HostZoomMap* host_zoom_map) {
host_zoom_map_ = host_zoom_map;
}
void set_appcache_service(ChromeAppCacheService* service) {
appcache_service_ = service;
}
void set_blob_storage_context(ChromeBlobStorageContext* context) {
blob_storage_context_ = context;
}
void set_file_system_context(fileapi::FileSystemContext* context) {
file_system_context_ = context;
}
void set_extension_info_map(ExtensionInfoMap* map) {
extension_info_map_ = map;
}
void set_prerender_manager(prerender::PrerenderManager* prerender_manager) {
prerender_manager_ = prerender_manager;
}
// Callback for when the accept language changes.
void OnAcceptLanguageChange(const std::string& accept_language);
// Callback for when the default charset changes.
void OnDefaultCharsetChange(const std::string& default_charset);
protected:
virtual ~ChromeURLRequestContext();
private:
// ---------------------------------------------------------------------------
// Important: When adding any new members below, consider whether they need to
// be added to CopyFrom.
// ---------------------------------------------------------------------------
// Path to the directory user scripts are stored in.
FilePath user_script_dir_path_;
// TODO(willchan): Make these non-refcounted.
scoped_refptr<ChromeAppCacheService> appcache_service_;
scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
scoped_refptr<HostZoomMap> host_zoom_map_;
scoped_refptr<ChromeBlobStorageContext> blob_storage_context_;
scoped_refptr<fileapi::FileSystemContext> file_system_context_;
// TODO(aa): This should use chrome/common/extensions/extension_set.h.
scoped_refptr<ExtensionInfoMap> extension_info_map_;
scoped_refptr<prerender::PrerenderManager> prerender_manager_;
scoped_ptr<ChromeURLDataManagerBackend> chrome_url_data_manager_backend_;
bool is_incognito_;
// ---------------------------------------------------------------------------
// Important: When adding any new members above, consider whether they need to
// be added to CopyFrom.
// ---------------------------------------------------------------------------
DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContext);
};
// A net::URLRequestContextGetter subclass used by the browser. This returns a
// subclass of net::URLRequestContext which can be used to store extra
// information about requests.
//
// Most methods are expected to be called on the UI thread, except for
// the destructor and GetURLRequestContext().
class ChromeURLRequestContextGetter : public net::URLRequestContextGetter,
public NotificationObserver {
public:
// Constructs a ChromeURLRequestContextGetter that will use |factory| to
// create the ChromeURLRequestContext. If |profile| is non-NULL, then the
// ChromeURLRequestContextGetter will additionally watch the preferences for
// changes to charset/language and CleanupOnUIThread() will need to be
// called to unregister.
ChromeURLRequestContextGetter(Profile* profile,
ChromeURLRequestContextFactory* factory);
// Note that GetURLRequestContext() can only be called from the IO
// thread (it will assert otherwise). DONTUSEME_GetCookieStore() and
// GetIOMessageLoopProxy however can be called from any thread.
//
// net::URLRequestContextGetter implementation.
virtual net::URLRequestContext* GetURLRequestContext();
virtual net::CookieStore* DONTUSEME_GetCookieStore();
virtual scoped_refptr<base::MessageLoopProxy> GetIOMessageLoopProxy() const;
// Releases |url_request_context_|. It's invalid to call
// GetURLRequestContext() after this point.
void ReleaseURLRequestContext();
// Convenience overload of GetURLRequestContext() that returns a
// ChromeURLRequestContext* rather than a net::URLRequestContext*.
ChromeURLRequestContext* GetIOContext() {
return reinterpret_cast<ChromeURLRequestContext*>(GetURLRequestContext());
}
// Create an instance for use with an 'original' (non-OTR) profile. This is
// expected to get called on the UI thread.
static ChromeURLRequestContextGetter* CreateOriginal(
Profile* profile, const ProfileIOData* profile_io_data);
// Create an instance for an original profile for media. This is expected to
// get called on UI thread. This method takes a profile and reuses the
// 'original' net::URLRequestContext for common files.
static ChromeURLRequestContextGetter* CreateOriginalForMedia(
Profile* profile, const ProfileIOData* profile_io_data);
// Create an instance for an original profile for extensions. This is expected
// to get called on UI thread.
static ChromeURLRequestContextGetter* CreateOriginalForExtensions(
Profile* profile, const ProfileIOData* profile_io_data);
// Create an instance for an original profile for an app with isolated
// storage. This is expected to get called on UI thread.
static ChromeURLRequestContextGetter* CreateOriginalForIsolatedApp(
Profile* profile,
const ProfileIOData* profile_io_data,
const std::string& app_id);
// Create an instance for use with an OTR profile. This is expected to get
// called on the UI thread.
static ChromeURLRequestContextGetter* CreateOffTheRecord(
Profile* profile, const ProfileIOData* profile_io_data);
// Create an instance for an OTR profile for extensions. This is expected
// to get called on UI thread.
static ChromeURLRequestContextGetter* CreateOffTheRecordForExtensions(
Profile* profile, const ProfileIOData* profile_io_data);
// Create an instance for an OTR profile for an app with isolated storage.
// This is expected to get called on UI thread.
static ChromeURLRequestContextGetter* CreateOffTheRecordForIsolatedApp(
Profile* profile,
const ProfileIOData* profile_io_data,
const std::string& app_id);
// Clean up UI thread resources. This is expected to get called on the UI
// thread before the instance is deleted on the IO thread.
void CleanupOnUIThread();
// NotificationObserver implementation.
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
private:
// Must be called on the IO thread.
virtual ~ChromeURLRequestContextGetter();
// Registers an observer on |profile|'s preferences which will be used
// to update the context when the default language and charset change.
void RegisterPrefsObserver(Profile* profile);
// These methods simply forward to the corresponding method on
// ChromeURLRequestContext.
void OnAcceptLanguageChange(const std::string& accept_language);
void OnDefaultCharsetChange(const std::string& default_charset);
void OnClearSiteDataOnExitChange(bool clear_site_data);
// Saves the cookie store to |result| and signals |completion|.
void GetCookieStoreAsyncHelper(base::WaitableEvent* completion,
net::CookieStore** result);
PrefChangeRegistrar registrar_;
// |io_thread_| is always valid during the lifetime of |this| since |this| is
// deleted on the IO thread.
IOThread* const io_thread_;
// Deferred logic for creating a ChromeURLRequestContext.
// Access only from the IO thread.
scoped_ptr<ChromeURLRequestContextFactory> factory_;
// NULL if not yet initialized. Otherwise, it is the net::URLRequestContext
// instance that was lazilly created by GetURLRequestContext.
// Access only from the IO thread.
scoped_refptr<net::URLRequestContext> url_request_context_;
DISALLOW_COPY_AND_ASSIGN(ChromeURLRequestContextGetter);
};
#endif // CHROME_BROWSER_NET_CHROME_URL_REQUEST_CONTEXT_H_