OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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 "ios/components/io_thread/ios_io_thread.h" | 5 #include "ios/components/io_thread/ios_io_thread.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <utility> | 9 #include <utility> |
10 #include <vector> | 10 #include <vector> |
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
235 // dependencies and (2) make IOSIOThread more flexible for testing. | 235 // dependencies and (2) make IOSIOThread more flexible for testing. |
236 IOSIOThread::IOSIOThread(PrefService* local_state, | 236 IOSIOThread::IOSIOThread(PrefService* local_state, |
237 net_log::ChromeNetLog* net_log) | 237 net_log::ChromeNetLog* net_log) |
238 : net_log_(net_log), | 238 : net_log_(net_log), |
239 globals_(nullptr), | 239 globals_(nullptr), |
240 creation_time_(base::TimeTicks::Now()), | 240 creation_time_(base::TimeTicks::Now()), |
241 weak_factory_(this) { | 241 weak_factory_(this) { |
242 pref_proxy_config_tracker_ = | 242 pref_proxy_config_tracker_ = |
243 ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState( | 243 ProxyServiceFactory::CreatePrefProxyConfigTrackerOfLocalState( |
244 local_state); | 244 local_state); |
| 245 system_proxy_config_service_ = ProxyServiceFactory::CreateProxyConfigService( |
| 246 pref_proxy_config_tracker_.get()); |
| 247 |
245 ssl_config_service_manager_.reset( | 248 ssl_config_service_manager_.reset( |
246 ssl_config::SSLConfigServiceManager::CreateDefaultManager( | 249 ssl_config::SSLConfigServiceManager::CreateDefaultManager( |
247 local_state, | 250 local_state, |
248 web::WebThread::GetTaskRunnerForThread(web::WebThread::IO))); | 251 web::WebThread::GetTaskRunnerForThread(web::WebThread::IO))); |
249 | 252 |
250 web::WebThread::SetDelegate(web::WebThread::IO, this); | 253 web::WebThread::SetDelegate(web::WebThread::IO, this); |
251 } | 254 } |
252 | 255 |
253 IOSIOThread::~IOSIOThread() { | 256 IOSIOThread::~IOSIOThread() { |
254 // This isn't needed for production code, but in tests, IOSIOThread may | 257 // This isn't needed for production code, but in tests, IOSIOThread may |
(...skipping 23 matching lines...) Expand all Loading... |
278 DCHECK_CURRENTLY_ON(web::WebThread::UI); | 281 DCHECK_CURRENTLY_ON(web::WebThread::UI); |
279 web::WebThread::PostTask( | 282 web::WebThread::PostTask( |
280 web::WebThread::IO, FROM_HERE, | 283 web::WebThread::IO, FROM_HERE, |
281 base::Bind(&IOSIOThread::ChangedToOnTheRecordOnIOThread, | 284 base::Bind(&IOSIOThread::ChangedToOnTheRecordOnIOThread, |
282 base::Unretained(this))); | 285 base::Unretained(this))); |
283 } | 286 } |
284 | 287 |
285 net::URLRequestContextGetter* IOSIOThread::system_url_request_context_getter() { | 288 net::URLRequestContextGetter* IOSIOThread::system_url_request_context_getter() { |
286 DCHECK_CURRENTLY_ON(web::WebThread::UI); | 289 DCHECK_CURRENTLY_ON(web::WebThread::UI); |
287 if (!system_url_request_context_getter_.get()) { | 290 if (!system_url_request_context_getter_.get()) { |
288 InitSystemRequestContext(); | 291 // If we're in unit_tests, IOSIOThread may not be run. |
| 292 if (!web::WebThread::IsMessageLoopValid(web::WebThread::IO)) |
| 293 return nullptr; |
| 294 system_url_request_context_getter_ = |
| 295 new SystemURLRequestContextGetter(this); |
289 } | 296 } |
290 return system_url_request_context_getter_.get(); | 297 return system_url_request_context_getter_.get(); |
291 } | 298 } |
292 | 299 |
293 void IOSIOThread::Init() { | 300 void IOSIOThread::Init() { |
294 TRACE_EVENT0("startup", "IOSIOThread::Init"); | 301 TRACE_EVENT0("startup", "IOSIOThread::Init"); |
295 DCHECK_CURRENTLY_ON(web::WebThread::IO); | 302 DCHECK_CURRENTLY_ON(web::WebThread::IO); |
296 | 303 |
297 DCHECK(!globals_); | 304 DCHECK(!globals_); |
298 globals_ = new Globals; | 305 globals_ = new Globals; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
346 quic_user_agent_id.append( | 353 quic_user_agent_id.append( |
347 version_info::GetProductNameAndVersionForUserAgent()); | 354 version_info::GetProductNameAndVersionForUserAgent()); |
348 quic_user_agent_id.push_back(' '); | 355 quic_user_agent_id.push_back(' '); |
349 quic_user_agent_id.append(web::BuildOSCpuInfo()); | 356 quic_user_agent_id.append(web::BuildOSCpuInfo()); |
350 | 357 |
351 // Set up field trials, ignoring debug command line options. | 358 // Set up field trials, ignoring debug command line options. |
352 network_session_configurator::ParseCommandLineAndFieldTrials( | 359 network_session_configurator::ParseCommandLineAndFieldTrials( |
353 base::CommandLine(base::CommandLine::NO_PROGRAM), | 360 base::CommandLine(base::CommandLine::NO_PROGRAM), |
354 /*is_quic_force_disabled=*/false, quic_user_agent_id, ¶ms_); | 361 /*is_quic_force_disabled=*/false, quic_user_agent_id, ¶ms_); |
355 | 362 |
356 // InitSystemRequestContext turns right around and posts a task back | 363 globals_->system_proxy_service = ProxyServiceFactory::CreateProxyService( |
357 // to the IO thread, so we can't let it run until we know the IO | 364 net_log_, nullptr, globals_->system_network_delegate.get(), |
358 // thread has started. | 365 std::move(system_proxy_config_service_), true /* quick_check_enabled */); |
359 // | 366 |
360 // Note that since we are at WebThread::Init time, the UI thread | 367 globals_->system_request_context.reset( |
361 // is blocked waiting for the thread to start. Therefore, posting | 368 ConstructSystemRequestContext(globals_, params_, net_log_)); |
362 // this task to the main thread's message loop here is guaranteed to | |
363 // get it onto the message loop while the IOSIOThread object still | |
364 // exists. However, the message might not be processed on the UI | |
365 // thread until after IOSIOThread is gone, so use a weak pointer. | |
366 web::WebThread::PostTask(web::WebThread::UI, FROM_HERE, | |
367 base::Bind(&IOSIOThread::InitSystemRequestContext, | |
368 weak_factory_.GetWeakPtr())); | |
369 } | 369 } |
370 | 370 |
371 void IOSIOThread::CleanUp() { | 371 void IOSIOThread::CleanUp() { |
372 system_url_request_context_getter_->Shutdown(); | 372 system_url_request_context_getter_->Shutdown(); |
373 system_url_request_context_getter_ = nullptr; | 373 system_url_request_context_getter_ = nullptr; |
374 | 374 |
375 // Release objects that the net::URLRequestContext could have been pointing | 375 // Release objects that the net::URLRequestContext could have been pointing |
376 // to. | 376 // to. |
377 | 377 |
378 // Shutdown the HistogramWatcher on the IO thread. | 378 // Shutdown the HistogramWatcher on the IO thread. |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 } | 422 } |
423 | 423 |
424 void IOSIOThread::ChangedToOnTheRecordOnIOThread() { | 424 void IOSIOThread::ChangedToOnTheRecordOnIOThread() { |
425 DCHECK_CURRENTLY_ON(web::WebThread::IO); | 425 DCHECK_CURRENTLY_ON(web::WebThread::IO); |
426 | 426 |
427 // Clear the host cache to avoid showing entries from the OTR session | 427 // Clear the host cache to avoid showing entries from the OTR session |
428 // in about:net-internals. | 428 // in about:net-internals. |
429 ClearHostCache(); | 429 ClearHostCache(); |
430 } | 430 } |
431 | 431 |
432 void IOSIOThread::InitSystemRequestContext() { | |
433 if (system_url_request_context_getter_.get()) | |
434 return; | |
435 // If we're in unit_tests, IOSIOThread may not be run. | |
436 if (!web::WebThread::IsMessageLoopValid(web::WebThread::IO)) | |
437 return; | |
438 system_proxy_config_service_ = ProxyServiceFactory::CreateProxyConfigService( | |
439 pref_proxy_config_tracker_.get()); | |
440 | |
441 system_url_request_context_getter_ = new SystemURLRequestContextGetter(this); | |
442 // Safe to post an unretained this pointer, since IOSIOThread is | |
443 // guaranteed to outlive the IO WebThread. | |
444 web::WebThread::PostTask( | |
445 web::WebThread::IO, FROM_HERE, | |
446 base::Bind(&IOSIOThread::InitSystemRequestContextOnIOThread, | |
447 base::Unretained(this))); | |
448 } | |
449 | |
450 void IOSIOThread::InitSystemRequestContextOnIOThread() { | |
451 DCHECK_CURRENTLY_ON(web::WebThread::IO); | |
452 DCHECK(!globals_->system_proxy_service.get()); | |
453 DCHECK(system_proxy_config_service_.get()); | |
454 | |
455 globals_->system_proxy_service = ProxyServiceFactory::CreateProxyService( | |
456 net_log_, nullptr, globals_->system_network_delegate.get(), | |
457 std::move(system_proxy_config_service_), true /* quick_check_enabled */); | |
458 | |
459 globals_->system_request_context.reset( | |
460 ConstructSystemRequestContext(globals_, params_, net_log_)); | |
461 } | |
462 | |
463 net::URLRequestContext* IOSIOThread::ConstructSystemRequestContext( | 432 net::URLRequestContext* IOSIOThread::ConstructSystemRequestContext( |
464 IOSIOThread::Globals* globals, | 433 IOSIOThread::Globals* globals, |
465 const net::HttpNetworkSession::Params& params, | 434 const net::HttpNetworkSession::Params& params, |
466 net::NetLog* net_log) { | 435 net::NetLog* net_log) { |
467 net::URLRequestContext* context = new SystemURLRequestContext; | 436 net::URLRequestContext* context = new SystemURLRequestContext; |
468 context->set_net_log(net_log); | 437 context->set_net_log(net_log); |
469 context->set_host_resolver(globals->host_resolver.get()); | 438 context->set_host_resolver(globals->host_resolver.get()); |
470 context->set_cert_verifier(globals->cert_verifier.get()); | 439 context->set_cert_verifier(globals->cert_verifier.get()); |
471 context->set_transport_security_state( | 440 context->set_transport_security_state( |
472 globals->transport_security_state.get()); | 441 globals->transport_security_state.get()); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 new net::HttpNetworkSession(params, system_context)); | 473 new net::HttpNetworkSession(params, system_context)); |
505 globals->system_http_transaction_factory.reset( | 474 globals->system_http_transaction_factory.reset( |
506 new net::HttpNetworkLayer(globals->system_http_network_session.get())); | 475 new net::HttpNetworkLayer(globals->system_http_network_session.get())); |
507 context->set_http_transaction_factory( | 476 context->set_http_transaction_factory( |
508 globals->system_http_transaction_factory.get()); | 477 globals->system_http_transaction_factory.get()); |
509 | 478 |
510 return context; | 479 return context; |
511 } | 480 } |
512 | 481 |
513 } // namespace io_thread | 482 } // namespace io_thread |
OLD | NEW |