| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/resource_context_impl.h" | 5 #include "content/browser/resource_context_impl.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "content/browser/appcache/chrome_appcache_service.h" | 8 #include "content/browser/appcache/chrome_appcache_service.h" |
| 9 #include "content/browser/fileapi/browser_file_system_helper.h" | 9 #include "content/browser/fileapi/browser_file_system_helper.h" |
| 10 #include "content/browser/fileapi/chrome_blob_storage_context.h" | 10 #include "content/browser/fileapi/chrome_blob_storage_context.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 | 47 |
| 48 class NonOwningZoomData : public base::SupportsUserData::Data { | 48 class NonOwningZoomData : public base::SupportsUserData::Data { |
| 49 public: | 49 public: |
| 50 explicit NonOwningZoomData(HostZoomMap* hzm) : host_zoom_map_(hzm) {} | 50 explicit NonOwningZoomData(HostZoomMap* hzm) : host_zoom_map_(hzm) {} |
| 51 HostZoomMap* host_zoom_map() { return host_zoom_map_; } | 51 HostZoomMap* host_zoom_map() { return host_zoom_map_; } |
| 52 | 52 |
| 53 private: | 53 private: |
| 54 HostZoomMap* host_zoom_map_; | 54 HostZoomMap* host_zoom_map_; |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 class BlobProtocolHandler : public webkit_blob::BlobProtocolHandler { | |
| 58 public: | |
| 59 BlobProtocolHandler( | |
| 60 webkit_blob::BlobStorageController* blob_storage_controller, | |
| 61 base::MessageLoopProxy* loop_proxy) | |
| 62 : webkit_blob::BlobProtocolHandler(blob_storage_controller, | |
| 63 loop_proxy) {} | |
| 64 | |
| 65 virtual ~BlobProtocolHandler() {} | |
| 66 | |
| 67 private: | |
| 68 virtual scoped_refptr<webkit_blob::BlobData> | |
| 69 LookupBlobData(net::URLRequest* request) const { | |
| 70 const ResourceRequestInfoImpl* info = | |
| 71 ResourceRequestInfoImpl::ForRequest(request); | |
| 72 if (!info) | |
| 73 return NULL; | |
| 74 return info->requested_blob_data(); | |
| 75 } | |
| 76 | |
| 77 DISALLOW_COPY_AND_ASSIGN(BlobProtocolHandler); | |
| 78 }; | |
| 79 | |
| 80 // Adds a bunch of debugging urls. We use an interceptor instead of a protocol | |
| 81 // handler because we want to reuse the chrome://scheme (everyone is familiar | |
| 82 // with it, and no need to expose the content/chrome separation through our UI). | |
| 83 class DeveloperProtocolHandler | |
| 84 : public net::URLRequestJobFactory::Interceptor { | |
| 85 public: | |
| 86 DeveloperProtocolHandler( | |
| 87 AppCacheService* appcache_service, | |
| 88 BlobStorageController* blob_storage_controller) | |
| 89 : appcache_service_(appcache_service), | |
| 90 blob_storage_controller_(blob_storage_controller) {} | |
| 91 virtual ~DeveloperProtocolHandler() {} | |
| 92 | |
| 93 virtual net::URLRequestJob* MaybeIntercept( | |
| 94 net::URLRequest* request, | |
| 95 net::NetworkDelegate* network_delegate) const OVERRIDE { | |
| 96 // Check for chrome://view-http-cache/*, which uses its own job type. | |
| 97 if (ViewHttpCacheJobFactory::IsSupportedURL(request->url())) | |
| 98 return ViewHttpCacheJobFactory::CreateJobForRequest(request, | |
| 99 network_delegate); | |
| 100 | |
| 101 // Next check for chrome://appcache-internals/, which uses its own job type. | |
| 102 if (request->url().SchemeIs(chrome::kChromeUIScheme) && | |
| 103 request->url().host() == chrome::kChromeUIAppCacheInternalsHost) { | |
| 104 return appcache::ViewAppCacheInternalsJobFactory::CreateJobForRequest( | |
| 105 request, network_delegate, appcache_service_); | |
| 106 } | |
| 107 | |
| 108 // Next check for chrome://blob-internals/, which uses its own job type. | |
| 109 if (ViewBlobInternalsJobFactory::IsSupportedURL(request->url())) { | |
| 110 return ViewBlobInternalsJobFactory::CreateJobForRequest( | |
| 111 request, network_delegate, blob_storage_controller_); | |
| 112 } | |
| 113 | |
| 114 #if defined(USE_TCMALLOC) | |
| 115 // Next check for chrome://tcmalloc/, which uses its own job type. | |
| 116 if (request->url().SchemeIs(chrome::kChromeUIScheme) && | |
| 117 request->url().host() == chrome::kChromeUITcmallocHost) { | |
| 118 return new TcmallocInternalsRequestJob(request, network_delegate); | |
| 119 } | |
| 120 #endif | |
| 121 | |
| 122 // Next check for chrome://histograms/, which uses its own job type. | |
| 123 if (request->url().SchemeIs(chrome::kChromeUIScheme) && | |
| 124 request->url().host() == chrome::kChromeUIHistogramHost) { | |
| 125 return new HistogramInternalsRequestJob(request, network_delegate); | |
| 126 } | |
| 127 | |
| 128 return NULL; | |
| 129 } | |
| 130 | |
| 131 virtual net::URLRequestJob* MaybeInterceptRedirect( | |
| 132 const GURL& location, | |
| 133 net::URLRequest* request, | |
| 134 net::NetworkDelegate* network_delegate) const OVERRIDE { | |
| 135 return NULL; | |
| 136 } | |
| 137 | |
| 138 virtual net::URLRequestJob* MaybeInterceptResponse( | |
| 139 net::URLRequest* request, | |
| 140 net::NetworkDelegate* network_delegate) const OVERRIDE { | |
| 141 return NULL; | |
| 142 } | |
| 143 | |
| 144 virtual bool WillHandleProtocol(const std::string& protocol) const { | |
| 145 return protocol == chrome::kChromeUIScheme; | |
| 146 } | |
| 147 | |
| 148 private: | |
| 149 AppCacheService* appcache_service_; | |
| 150 BlobStorageController* blob_storage_controller_; | |
| 151 }; | |
| 152 | |
| 153 void InitializeRequestContext( | |
| 154 scoped_refptr<net::URLRequestContextGetter> context_getter, | |
| 155 AppCacheService* appcache_service, | |
| 156 FileSystemContext* file_system_context, | |
| 157 ChromeBlobStorageContext* blob_storage_context) { | |
| 158 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | |
| 159 if (!context_getter) | |
| 160 return; // tests. | |
| 161 net::URLRequestContext* context = context_getter->GetURLRequestContext(); | |
| 162 net::URLRequestJobFactory* job_factory = | |
| 163 const_cast<net::URLRequestJobFactory*>(context->job_factory()); | |
| 164 if (job_factory->IsHandledProtocol(chrome::kBlobScheme)) | |
| 165 return; // Already initialized this RequestContext. | |
| 166 | |
| 167 bool set_protocol = job_factory->SetProtocolHandler( | |
| 168 chrome::kBlobScheme, | |
| 169 new BlobProtocolHandler( | |
| 170 blob_storage_context->controller(), | |
| 171 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE))); | |
| 172 DCHECK(set_protocol); | |
| 173 set_protocol = job_factory->SetProtocolHandler( | |
| 174 chrome::kFileSystemScheme, | |
| 175 CreateFileSystemProtocolHandler(file_system_context)); | |
| 176 DCHECK(set_protocol); | |
| 177 | |
| 178 job_factory->AddInterceptor( | |
| 179 new DeveloperProtocolHandler(appcache_service, | |
| 180 blob_storage_context->controller())); | |
| 181 | |
| 182 // TODO(jam): Add the ProtocolHandlerRegistryIntercepter here! | |
| 183 } | |
| 184 | |
| 185 } // namespace | 57 } // namespace |
| 186 | 58 |
| 187 | 59 |
| 188 ResourceContext::ResourceContext() { | 60 ResourceContext::ResourceContext() { |
| 189 if (ResourceDispatcherHostImpl::Get()) | 61 if (ResourceDispatcherHostImpl::Get()) |
| 190 ResourceDispatcherHostImpl::Get()->AddResourceContext(this); | 62 ResourceDispatcherHostImpl::Get()->AddResourceContext(this); |
| 191 } | 63 } |
| 192 | 64 |
| 193 ResourceContext::~ResourceContext() { | 65 ResourceContext::~ResourceContext() { |
| 194 ResourceDispatcherHostImpl* rdhi = ResourceDispatcherHostImpl::Get(); | 66 ResourceDispatcherHostImpl* rdhi = ResourceDispatcherHostImpl::Get(); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 220 new UserDataAdapter<ChromeBlobStorageContext>( | 92 new UserDataAdapter<ChromeBlobStorageContext>( |
| 221 ChromeBlobStorageContext::GetFor(browser_context))); | 93 ChromeBlobStorageContext::GetFor(browser_context))); |
| 222 | 94 |
| 223 // This object is owned by the BrowserContext and not ResourceContext, so | 95 // This object is owned by the BrowserContext and not ResourceContext, so |
| 224 // store a non-owning pointer here. | 96 // store a non-owning pointer here. |
| 225 resource_context->SetUserData( | 97 resource_context->SetUserData( |
| 226 kHostZoomMapKeyName, | 98 kHostZoomMapKeyName, |
| 227 new NonOwningZoomData( | 99 new NonOwningZoomData( |
| 228 HostZoomMap::GetForBrowserContext(browser_context))); | 100 HostZoomMap::GetForBrowserContext(browser_context))); |
| 229 resource_context->DetachUserDataThread(); | 101 resource_context->DetachUserDataThread(); |
| 230 | |
| 231 StoragePartition* storage_partition = | |
| 232 BrowserContext::GetDefaultStoragePartition(browser_context); | |
| 233 | |
| 234 // Add content's URLRequestContext's hooks. | |
| 235 // Check first to avoid memory leak in unittests. | |
| 236 // TODO(creis): Do equivalent initializations for isolated app and isolated | |
| 237 // media request contexts. | |
| 238 if (BrowserThread::IsMessageLoopValid(BrowserThread::IO)) { | |
| 239 // TODO(ajwong): Move this whole block into | |
| 240 // StoragePartitionImplMap::PostCreateInitialization after we're certain | |
| 241 // this is safe to happen before InitializeResourceContext, and after we've | |
| 242 // found the right URLRequestContext for a storage partition. Otherwise, | |
| 243 // our isolated URLRequestContext getters will do the wrong thing for blobs, | |
| 244 // and FileSystemContext. | |
| 245 // | |
| 246 // http://crbug.com/85121 | |
| 247 | |
| 248 BrowserThread::PostTask( | |
| 249 BrowserThread::IO, FROM_HERE, | |
| 250 base::Bind( | |
| 251 &InitializeRequestContext, | |
| 252 make_scoped_refptr(browser_context->GetRequestContext()), | |
| 253 storage_partition->GetAppCacheService(), | |
| 254 make_scoped_refptr( | |
| 255 storage_partition->GetFileSystemContext()), | |
| 256 make_scoped_refptr( | |
| 257 ChromeBlobStorageContext::GetFor(browser_context)))); | |
| 258 BrowserThread::PostTask( | |
| 259 BrowserThread::IO, FROM_HERE, | |
| 260 base::Bind( | |
| 261 &InitializeRequestContext, | |
| 262 make_scoped_refptr(browser_context->GetMediaRequestContext()), | |
| 263 storage_partition->GetAppCacheService(), | |
| 264 make_scoped_refptr( | |
| 265 storage_partition->GetFileSystemContext()), | |
| 266 make_scoped_refptr( | |
| 267 ChromeBlobStorageContext::GetFor(browser_context)))); | |
| 268 } | |
| 269 } | 102 } |
| 270 | 103 |
| 271 } // namespace content | 104 } // namespace content |
| OLD | NEW |