Chromium Code Reviews| Index: net/url_request/url_request_context_builder.cc |
| diff --git a/net/url_request/url_request_context_builder.cc b/net/url_request/url_request_context_builder.cc |
| index a1e384d9886375985e156cb7eda5cea2c6b9a808..3a42739a1a043a53f4ebc9134765c498e80f5d02 100644 |
| --- a/net/url_request/url_request_context_builder.cc |
| +++ b/net/url_request/url_request_context_builder.cc |
| @@ -15,8 +15,7 @@ |
| #include "base/message_loop/message_loop.h" |
| #include "base/single_thread_task_runner.h" |
| #include "base/strings/string_util.h" |
| -#include "base/threading/thread.h" |
| -#include "base/threading/thread_task_runner_handle.h" |
| +#include "base/task_scheduler/post_task.h" |
| #include "net/base/cache_type.h" |
| #include "net/base/net_errors.h" |
| #include "net/base/network_delegate_impl.h" |
| @@ -144,9 +143,7 @@ class BasicNetworkDelegate : public NetworkDelegateImpl { |
| // it's not safe to subclass this. |
| class ContainerURLRequestContext final : public URLRequestContext { |
| public: |
| - explicit ContainerURLRequestContext( |
| - const scoped_refptr<base::SingleThreadTaskRunner>& file_task_runner) |
| - : file_task_runner_(file_task_runner), storage_(this) {} |
| + ContainerURLRequestContext() : storage_(this) {} |
| ~ContainerURLRequestContext() override { |
| // Destroy the ReportingService before the rest of the URLRequestContext, so |
| @@ -166,18 +163,6 @@ class ContainerURLRequestContext final : public URLRequestContext { |
| return &storage_; |
| } |
| - scoped_refptr<base::SingleThreadTaskRunner>& GetFileTaskRunner() { |
| - // Create a new thread to run file tasks, if needed. |
| - if (!file_task_runner_) { |
| - DCHECK(!file_thread_); |
| - file_thread_.reset(new base::Thread("Network File Thread")); |
| - file_thread_->StartWithOptions( |
| - base::Thread::Options(base::MessageLoop::TYPE_DEFAULT, 0)); |
| - file_task_runner_ = file_thread_->task_runner(); |
| - } |
| - return file_task_runner_; |
| - } |
| - |
| void set_transport_security_persister( |
| std::unique_ptr<TransportSecurityPersister> |
| transport_security_persister) { |
| @@ -185,10 +170,6 @@ class ContainerURLRequestContext final : public URLRequestContext { |
| } |
| private: |
| - // The thread should be torn down last. |
| - std::unique_ptr<base::Thread> file_thread_; |
| - scoped_refptr<base::SingleThreadTaskRunner> file_task_runner_; |
| - |
| URLRequestContextStorage storage_; |
| std::unique_ptr<TransportSecurityPersister> transport_security_persister_; |
| @@ -322,7 +303,7 @@ void URLRequestContextBuilder::SetHttpServerProperties( |
| std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() { |
| std::unique_ptr<ContainerURLRequestContext> context( |
| - new ContainerURLRequestContext(file_task_runner_)); |
| + new ContainerURLRequestContext()); |
| URLRequestContextStorage* storage = context->storage(); |
| context->set_name(name_); |
| @@ -386,12 +367,18 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() { |
| storage->set_transport_security_state( |
| base::MakeUnique<TransportSecurityState>()); |
| if (!transport_security_persister_path_.empty()) { |
| + // Use a low priority because saving this should not block anything |
| + // user-visible. Block shutdown to ensure it does get persisted to disk, |
| + // since it contains security-relevant information. |
| + scoped_refptr<base::SequencedTaskRunner> task_runner(GetSequencedTaskRunner( |
| + {base::MayBlock(), base::TaskPriority::BACKGROUND, |
| + base::TaskShutdownBehavior::BLOCK_SHUTDOWN})); |
| + |
| context->set_transport_security_persister( |
| base::WrapUnique<TransportSecurityPersister>( |
| new TransportSecurityPersister(context->transport_security_state(), |
| transport_security_persister_path_, |
| - context->GetFileTaskRunner(), |
| - false))); |
| + task_runner, false))); |
| } |
| if (http_server_properties_) { |
| @@ -429,7 +416,9 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() { |
| if (!proxy_config_service_) { |
| proxy_config_service_ = ProxyService::CreateSystemProxyConfigService( |
| base::ThreadTaskRunnerHandle::Get().get(), |
| - context->GetFileTaskRunner()); |
| + GetSingleThreadTaskRunner( |
|
Randy Smith (Not in Mondays)
2017/06/21 12:56:26
When I first looked at this, I thought "Oh, of cou
mmenke
2017/06/21 15:13:55
ProxyService::CreateSystemProxyConfigService requi
|
| + {base::MayBlock(), base::TaskPriority::USER_BLOCKING, |
| + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN})); |
|
Randy Smith (Not in Mondays)
2017/06/21 12:56:26
Why CONTINUE_ON_SHUTDOWN for the proxy service?
mmenke
2017/06/21 15:13:56
Because we aren't writing anything to disk, so no
|
| } |
| #endif // !defined(OS_LINUX) && !defined(OS_ANDROID) |
| proxy_service_ = |
| @@ -462,7 +451,10 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() { |
| : CACHE_BACKEND_SIMPLE; |
| http_cache_backend.reset(new HttpCache::DefaultBackend( |
| DISK_CACHE, backend_type, http_cache_params_.path, |
| - http_cache_params_.max_size, context->GetFileTaskRunner())); |
| + http_cache_params_.max_size, |
| + GetSingleThreadTaskRunner( |
| + {base::MayBlock(), base::TaskPriority::USER_BLOCKING, |
| + base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}))); |
| } else { |
| http_cache_backend = |
| HttpCache::DefaultBackend::InMemory(http_cache_params_.max_size); |
| @@ -491,9 +483,15 @@ std::unique_ptr<URLRequestContext> URLRequestContextBuilder::Build() { |
| #if !BUILDFLAG(DISABLE_FILE_SUPPORT) |
| if (file_enabled_) { |
| + scoped_refptr<base::SequencedTaskRunner> task_runner(GetSequencedTaskRunner( |
| + {base::MayBlock(), base::TaskPriority::BACKGROUND, |
| + base::TaskShutdownBehavior::BLOCK_SHUTDOWN})); |
|
Randy Smith (Not in Mondays)
2017/06/21 12:56:26
It's not doubt due to my mis-reading, but where is
mmenke
2017/06/21 15:13:56
Oops...Copy-paste error.
|
| + |
| job_factory->SetProtocolHandler( |
| url::kFileScheme, |
| - base::MakeUnique<FileProtocolHandler>(context->GetFileTaskRunner())); |
| + base::MakeUnique<FileProtocolHandler>( |
| + GetTaskRunner({base::MayBlock(), base::TaskPriority::USER_VISIBLE, |
| + base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}))); |
|
Randy Smith (Not in Mondays)
2017/06/21 12:56:26
Hmmm. Everything else was USER_BLOCKING, which ma
mmenke
2017/06/21 15:13:55
So, actually, despite the CL description, this was
Randy Smith (Not in Mondays)
2017/06/21 15:48:52
Ah, I missed that. I'd suggest being pretty clear
|
| } |
| #endif // !BUILDFLAG(DISABLE_FILE_SUPPORT) |
| @@ -535,4 +533,27 @@ std::unique_ptr<ProxyService> URLRequestContextBuilder::CreateProxyService( |
| std::move(proxy_config_service), net_log); |
| } |
| +scoped_refptr<base::TaskRunner> URLRequestContextBuilder::GetTaskRunner( |
| + const base::TaskTraits& traits) { |
| + if (file_task_runner_) |
| + return file_task_runner_; |
| + return base::CreateTaskRunnerWithTraits(traits); |
| +} |
| + |
| +scoped_refptr<base::SequencedTaskRunner> |
| +URLRequestContextBuilder::GetSequencedTaskRunner( |
| + const base::TaskTraits& traits) { |
| + if (file_task_runner_) |
| + return file_task_runner_; |
| + return base::CreateSequencedTaskRunnerWithTraits(traits); |
| +} |
| + |
| +scoped_refptr<base::SingleThreadTaskRunner> |
| +URLRequestContextBuilder::GetSingleThreadTaskRunner( |
| + const base::TaskTraits& traits) { |
| + if (file_task_runner_) |
| + return file_task_runner_; |
| + return base::CreateSingleThreadTaskRunnerWithTraits(traits); |
| +} |
| + |
| } // namespace net |