Index: chrome/browser/profiles/profile_io_data.h |
diff --git a/chrome/browser/profiles/profile_io_data.h b/chrome/browser/profiles/profile_io_data.h |
index 4adb1b11a2a6f0b61eb63bd37ae1c10a90dd1505..e1c0e2d9d37e0ff428a566b12014df19157e4ace 100644 |
--- a/chrome/browser/profiles/profile_io_data.h |
+++ b/chrome/browser/profiles/profile_io_data.h |
@@ -85,7 +85,6 @@ class ProfileIOData { |
// with a content::ResourceContext, and they want access to Chrome data for |
// that profile. |
ExtensionInfoMap* GetExtensionInfoMap() const; |
- HostContentSettingsMap* GetHostContentSettingsMap() const; |
CookieSettings* GetCookieSettings() const; |
#if defined(ENABLE_NOTIFICATIONS) |
@@ -142,7 +141,6 @@ class ProfileIOData { |
std::string accept_charset; |
std::string referrer_charset; |
IOThread* io_thread; |
- scoped_refptr<HostContentSettingsMap> host_content_settings_map; |
scoped_refptr<CookieSettings> cookie_settings; |
scoped_refptr<net::SSLConfigService> ssl_config_service; |
scoped_refptr<net::CookieMonster::Delegate> cookie_monster_delegate; |
@@ -217,18 +215,24 @@ class ProfileIOData { |
return main_request_context_; |
} |
+ // Destroys the ResourceContext first, to cancel any URLRequests that are |
+ // using it still, before we destroy the member variables that those |
+ // URLRequests may be accessing. |
+ void DestroyResourceContext(); |
+ |
private: |
class ResourceContext : public content::ResourceContext { |
public: |
explicit ResourceContext(ProfileIOData* io_data); |
virtual ~ResourceContext(); |
- private: |
- friend class ProfileIOData; |
- |
// ResourceContext implementation: |
virtual net::HostResolver* GetHostResolver() OVERRIDE; |
virtual net::URLRequestContext* GetRequestContext() OVERRIDE; |
+ |
+ private: |
+ friend class ProfileIOData; |
+ |
void EnsureInitialized(); |
ProfileIOData* const io_data_; |
@@ -263,6 +267,19 @@ class ProfileIOData { |
scoped_refptr<ChromeURLRequestContext> main_context, |
const std::string& app_id) const = 0; |
+ // The order *DOES* matter for the majority of these member variables, so |
+ // don't move them around unless you know what you're doing! |
+ // General rules: |
+ // * ResourceContext references the URLRequestContexts, so |
+ // URLRequestContexts must outlive ResourceContext, hence ResourceContext |
+ // should be destroyed first. |
+ // * URLRequestContexts reference a whole bunch of members, so |
+ // URLRequestContext needs to be destroyed before them. |
+ // * Therefore, ResourceContext should be listed last, and then the |
+ // URLRequestContexts, and then the URLRequestContext members. |
+ // * Note that URLRequestContext members have a directed dependency graph |
+ // too, so they must themselves be ordered correctly. |
+ |
// Tracks whether or not we've been lazily initialized. |
mutable bool initialized_; |
@@ -293,19 +310,10 @@ class ProfileIOData { |
mutable scoped_ptr<chrome_browser_net::HttpServerPropertiesManager> |
http_server_properties_manager_; |
- // Pointed to by ResourceContext. |
- |
- // TODO(willchan): Remove from ResourceContext. |
- mutable scoped_refptr<ExtensionInfoMap> extension_info_map_; |
- mutable scoped_refptr<HostContentSettingsMap> host_content_settings_map_; |
- mutable scoped_refptr<CookieSettings> cookie_settings_; |
- |
#if defined(ENABLE_NOTIFICATIONS) |
mutable DesktopNotificationService* notification_service_; |
#endif |
- mutable ResourceContext resource_context_; |
- |
mutable scoped_ptr<TransportSecurityPersister> |
transport_security_persister_; |
@@ -316,6 +324,11 @@ class ProfileIOData { |
// One AppRequestContext per isolated app. |
mutable AppRequestContextMap app_request_context_map_; |
+ mutable scoped_ptr<ResourceContext> resource_context_; |
+ |
+ mutable scoped_refptr<ExtensionInfoMap> extension_info_map_; |
+ mutable scoped_refptr<CookieSettings> cookie_settings_; |
+ |
// TODO(jhawkins): Remove once crbug.com/102004 is fixed. |
bool initialized_on_UI_thread_; |