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 "android_webview/browser/net/aw_url_request_context_getter.h" | 5 #include "android_webview/browser/net/aw_url_request_context_getter.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "android_webview/browser/aw_browser_context.h" | 9 #include "android_webview/browser/aw_browser_context.h" |
10 #include "android_webview/browser/aw_content_browser_client.h" | 10 #include "android_webview/browser/aw_content_browser_client.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 params->net_log = context->net_log(); | 94 params->net_log = context->net_log(); |
95 | 95 |
96 // TODO(sgurun) remove once crbug.com/329681 is fixed. | 96 // TODO(sgurun) remove once crbug.com/329681 is fixed. |
97 params->next_protos = net::NextProtosSpdy31(); | 97 params->next_protos = net::NextProtosSpdy31(); |
98 params->use_alternate_protocols = true; | 98 params->use_alternate_protocols = true; |
99 | 99 |
100 ApplyCmdlineOverridesToNetworkSessionParams(params); | 100 ApplyCmdlineOverridesToNetworkSessionParams(params); |
101 } | 101 } |
102 | 102 |
103 scoped_ptr<net::URLRequestJobFactory> CreateJobFactory( | 103 scoped_ptr<net::URLRequestJobFactory> CreateJobFactory( |
104 content::ProtocolHandlerMap* protocol_handlers) { | 104 content::ProtocolHandlerMap* protocol_handlers, |
| 105 content::URLRequestInterceptorScopedVector request_interceptors) { |
105 scoped_ptr<AwURLRequestJobFactory> aw_job_factory(new AwURLRequestJobFactory); | 106 scoped_ptr<AwURLRequestJobFactory> aw_job_factory(new AwURLRequestJobFactory); |
106 bool set_protocol = aw_job_factory->SetProtocolHandler( | 107 bool set_protocol = aw_job_factory->SetProtocolHandler( |
107 url::kFileScheme, | 108 url::kFileScheme, |
108 new net::FileProtocolHandler( | 109 new net::FileProtocolHandler( |
109 content::BrowserThread::GetBlockingPool()-> | 110 content::BrowserThread::GetBlockingPool()-> |
110 GetTaskRunnerWithShutdownBehavior( | 111 GetTaskRunnerWithShutdownBehavior( |
111 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN))); | 112 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN))); |
112 DCHECK(set_protocol); | 113 DCHECK(set_protocol); |
113 set_protocol = aw_job_factory->SetProtocolHandler( | 114 set_protocol = aw_job_factory->SetProtocolHandler( |
114 url::kDataScheme, new net::DataProtocolHandler()); | 115 url::kDataScheme, new net::DataProtocolHandler()); |
115 DCHECK(set_protocol); | 116 DCHECK(set_protocol); |
116 set_protocol = aw_job_factory->SetProtocolHandler( | 117 set_protocol = aw_job_factory->SetProtocolHandler( |
117 url::kBlobScheme, | 118 url::kBlobScheme, |
118 (*protocol_handlers)[url::kBlobScheme].release()); | 119 (*protocol_handlers)[url::kBlobScheme].release()); |
119 DCHECK(set_protocol); | 120 DCHECK(set_protocol); |
120 set_protocol = aw_job_factory->SetProtocolHandler( | 121 set_protocol = aw_job_factory->SetProtocolHandler( |
121 url::kFileSystemScheme, | 122 url::kFileSystemScheme, |
122 (*protocol_handlers)[url::kFileSystemScheme].release()); | 123 (*protocol_handlers)[url::kFileSystemScheme].release()); |
123 DCHECK(set_protocol); | 124 DCHECK(set_protocol); |
124 set_protocol = aw_job_factory->SetProtocolHandler( | 125 set_protocol = aw_job_factory->SetProtocolHandler( |
125 content::kChromeUIScheme, | 126 content::kChromeUIScheme, |
126 (*protocol_handlers)[content::kChromeUIScheme].release()); | 127 (*protocol_handlers)[content::kChromeUIScheme].release()); |
127 DCHECK(set_protocol); | 128 DCHECK(set_protocol); |
128 set_protocol = aw_job_factory->SetProtocolHandler( | 129 set_protocol = aw_job_factory->SetProtocolHandler( |
129 content::kChromeDevToolsScheme, | 130 content::kChromeDevToolsScheme, |
130 (*protocol_handlers)[content::kChromeDevToolsScheme].release()); | 131 (*protocol_handlers)[content::kChromeDevToolsScheme].release()); |
131 DCHECK(set_protocol); | 132 DCHECK(set_protocol); |
132 protocol_handlers->clear(); | 133 protocol_handlers->clear(); |
133 | 134 |
134 // Create a chain of URLRequestJobFactories. The handlers will be invoked | |
135 // in the order in which they appear in the |request_interceptors| vector. | |
136 typedef std::vector<net::URLRequestInterceptor*> | |
137 URLRequestInterceptorVector; | |
138 URLRequestInterceptorVector request_interceptors; | |
139 | |
140 // Note that even though the content:// scheme handler is created here, | 135 // Note that even though the content:// scheme handler is created here, |
141 // it cannot be used by child processes until access to it is granted via | 136 // it cannot be used by child processes until access to it is granted via |
142 // ChildProcessSecurityPolicy::GrantScheme(). This is done in | 137 // ChildProcessSecurityPolicy::GrantScheme(). This is done in |
143 // AwContentBrowserClient. | 138 // AwContentBrowserClient. |
144 request_interceptors.push_back( | 139 request_interceptors.push_back( |
145 CreateAndroidContentRequestInterceptor().release()); | 140 CreateAndroidContentRequestInterceptor().release()); |
146 request_interceptors.push_back( | 141 request_interceptors.push_back( |
147 CreateAndroidAssetFileRequestInterceptor().release()); | 142 CreateAndroidAssetFileRequestInterceptor().release()); |
148 // The AwRequestInterceptor must come after the content and asset file job | 143 // The AwRequestInterceptor must come after the content and asset file job |
149 // factories. This for WebViewClassic compatibility where it was not | 144 // factories. This for WebViewClassic compatibility where it was not |
150 // possible to intercept resource loads to resolvable content:// and | 145 // possible to intercept resource loads to resolvable content:// and |
151 // file:// URIs. | 146 // file:// URIs. |
152 // This logical dependency is also the reason why the Content | 147 // This logical dependency is also the reason why the Content |
153 // URLRequestInterceptor has to be added as an interceptor rather than as a | 148 // URLRequestInterceptor has to be added as an interceptor rather than as a |
154 // ProtocolHandler. | 149 // ProtocolHandler. |
155 request_interceptors.push_back(new AwRequestInterceptor()); | 150 request_interceptors.push_back(new AwRequestInterceptor()); |
156 | 151 |
157 // The chain of responsibility will execute the handlers in reverse to the | 152 // The chain of responsibility will execute the handlers in reverse to the |
158 // order in which the elements of the chain are created. | 153 // order in which the elements of the chain are created. |
159 scoped_ptr<net::URLRequestJobFactory> job_factory(aw_job_factory.Pass()); | 154 scoped_ptr<net::URLRequestJobFactory> job_factory(aw_job_factory.Pass()); |
160 for (URLRequestInterceptorVector::reverse_iterator | 155 for (content::URLRequestInterceptorScopedVector::reverse_iterator i = |
161 i = request_interceptors.rbegin(); | 156 request_interceptors.rbegin(); |
162 i != request_interceptors.rend(); | 157 i != request_interceptors.rend(); |
163 ++i) { | 158 ++i) { |
164 job_factory.reset(new net::URLRequestInterceptingJobFactory( | 159 job_factory.reset(new net::URLRequestInterceptingJobFactory( |
165 job_factory.Pass(), make_scoped_ptr(*i))); | 160 job_factory.Pass(), make_scoped_ptr(*i))); |
166 } | 161 } |
| 162 request_interceptors.weak_clear(); |
167 | 163 |
168 return job_factory.Pass(); | 164 return job_factory.Pass(); |
169 } | 165 } |
170 | 166 |
171 } // namespace | 167 } // namespace |
172 | 168 |
173 AwURLRequestContextGetter::AwURLRequestContextGetter( | 169 AwURLRequestContextGetter::AwURLRequestContextGetter( |
174 const base::FilePath& partition_path, net::CookieStore* cookie_store) | 170 const base::FilePath& partition_path, net::CookieStore* cookie_store) |
175 : partition_path_(partition_path), | 171 : partition_path_(partition_path), |
176 cookie_store_(cookie_store), | 172 cookie_store_(cookie_store), |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 DataReductionProxySettings::InitDataReductionProxySession( | 235 DataReductionProxySettings::InitDataReductionProxySession( |
240 main_cache->GetSession(), &drp_params); | 236 main_cache->GetSession(), &drp_params); |
241 } | 237 } |
242 } | 238 } |
243 #endif | 239 #endif |
244 | 240 |
245 main_http_factory_.reset(main_cache); | 241 main_http_factory_.reset(main_cache); |
246 url_request_context_->set_http_transaction_factory(main_cache); | 242 url_request_context_->set_http_transaction_factory(main_cache); |
247 url_request_context_->set_cookie_store(cookie_store_); | 243 url_request_context_->set_cookie_store(cookie_store_); |
248 | 244 |
249 job_factory_ = CreateJobFactory(&protocol_handlers_); | 245 job_factory_ = CreateJobFactory(&protocol_handlers_, |
| 246 request_interceptors_.Pass()); |
250 url_request_context_->set_job_factory(job_factory_.get()); | 247 url_request_context_->set_job_factory(job_factory_.get()); |
251 } | 248 } |
252 | 249 |
253 net::URLRequestContext* AwURLRequestContextGetter::GetURLRequestContext() { | 250 net::URLRequestContext* AwURLRequestContextGetter::GetURLRequestContext() { |
254 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 251 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
255 if (!url_request_context_) | 252 if (!url_request_context_) |
256 InitializeURLRequestContext(); | 253 InitializeURLRequestContext(); |
257 | 254 |
258 return url_request_context_.get(); | 255 return url_request_context_.get(); |
259 } | 256 } |
260 | 257 |
261 scoped_refptr<base::SingleThreadTaskRunner> | 258 scoped_refptr<base::SingleThreadTaskRunner> |
262 AwURLRequestContextGetter::GetNetworkTaskRunner() const { | 259 AwURLRequestContextGetter::GetNetworkTaskRunner() const { |
263 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); | 260 return BrowserThread::GetMessageLoopProxyForThread(BrowserThread::IO); |
264 } | 261 } |
265 | 262 |
266 void AwURLRequestContextGetter::SetProtocolHandlers( | 263 void AwURLRequestContextGetter::SetHandlersAndInterceptors( |
267 content::ProtocolHandlerMap* protocol_handlers) { | 264 content::ProtocolHandlerMap* protocol_handlers, |
| 265 content::URLRequestInterceptorScopedVector request_interceptors) { |
268 std::swap(protocol_handlers_, *protocol_handlers); | 266 std::swap(protocol_handlers_, *protocol_handlers); |
| 267 request_interceptors_.swap(request_interceptors); |
269 } | 268 } |
270 | 269 |
271 DataReductionProxyConfigService* | 270 DataReductionProxyConfigService* |
272 AwURLRequestContextGetter::proxy_config_service() { | 271 AwURLRequestContextGetter::proxy_config_service() { |
273 // TODO(bengr): return system config if data reduction proxy is disabled. | 272 // TODO(bengr): return system config if data reduction proxy is disabled. |
274 return proxy_config_service_.get(); | 273 return proxy_config_service_.get(); |
275 } | 274 } |
276 | 275 |
277 } // namespace android_webview | 276 } // namespace android_webview |
OLD | NEW |