Index: content/browser/dom_storage/dom_storage_context_wrapper.cc |
diff --git a/content/browser/dom_storage/dom_storage_context_wrapper.cc b/content/browser/dom_storage/dom_storage_context_wrapper.cc |
index 67353fd7b879b2fd7004e99e3b2badf4aec6091f..b8059d985655666f84a8820968f72b74e401ffc6 100644 |
--- a/content/browser/dom_storage/dom_storage_context_wrapper.cc |
+++ b/content/browser/dom_storage/dom_storage_context_wrapper.cc |
@@ -14,8 +14,10 @@ |
#include "base/memory/memory_coordinator_client_registry.h" |
#include "base/memory/ptr_util.h" |
#include "base/memory/weak_ptr.h" |
+#include "base/sequenced_task_runner.h" |
#include "base/single_thread_task_runner.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "base/task_scheduler/post_task.h" |
#include "base/threading/thread_task_runner_handle.h" |
#include "components/filesystem/public/interfaces/directory.mojom.h" |
#include "components/leveldb/public/interfaces/leveldb.mojom.h" |
@@ -26,8 +28,10 @@ |
#include "content/browser/leveldb_wrapper_impl.h" |
#include "content/browser/memory/memory_coordinator.h" |
#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/content_browser_client.h" |
#include "content/public/browser/local_storage_usage_info.h" |
#include "content/public/browser/session_storage_usage_info.h" |
+#include "content/public/common/content_client.h" |
#include "content/public/common/content_features.h" |
#include "mojo/common/common_type_converters.h" |
#include "services/file/public/interfaces/constants.mojom.h" |
@@ -274,18 +278,41 @@ DOMStorageContextWrapper::DOMStorageContextWrapper( |
base::FilePath data_path; |
if (!profile_path.empty()) |
data_path = profile_path.Append(local_partition_path); |
- base::SequencedWorkerPool* worker_pool = BrowserThread::GetBlockingPool(); |
+ |
+ scoped_refptr<base::SequencedTaskRunner> primary_sequence; |
+ scoped_refptr<base::SequencedTaskRunner> commit_sequence; |
+ if (GetContentClient()->browser()->ShouldRedirectDOMStorageTaskRunner()) { |
+ // TaskPriority::USER_BLOCKING as an experiment because this is currently |
+ // believed to be blocking synchronous IPCs from the renderers: |
+ // http://crbug.com/665588 (yes we want to fix that bug, but are taking it |
+ // as an opportunity to experiment with the scheduler). |
+ base::TaskTraits dom_storage_traits = |
+ base::TaskTraits() |
+ .WithShutdownBehavior(base::TaskShutdownBehavior::BLOCK_SHUTDOWN) |
+ .WithFileIO() |
+ .WithPriority(base::TaskPriority::USER_BLOCKING); |
+ primary_sequence = |
+ base::CreateSequencedTaskRunnerWithTraits(dom_storage_traits); |
+ commit_sequence = |
+ base::CreateSequencedTaskRunnerWithTraits(dom_storage_traits); |
+ } else { |
+ base::SequencedWorkerPool* worker_pool = BrowserThread::GetBlockingPool(); |
+ primary_sequence = worker_pool->GetSequencedTaskRunner( |
+ worker_pool->GetNamedSequenceToken("dom_storage_primary")); |
+ commit_sequence = worker_pool->GetSequencedTaskRunner( |
+ worker_pool->GetNamedSequenceToken("dom_storage_commit")); |
+ } |
+ DCHECK(primary_sequence); |
+ DCHECK(commit_sequence); |
+ |
context_ = new DOMStorageContextImpl( |
data_path.empty() ? data_path |
: data_path.AppendASCII(kLocalStorageDirectory), |
data_path.empty() ? data_path |
: data_path.AppendASCII(kSessionStorageDirectory), |
special_storage_policy, |
- new DOMStorageWorkerPoolTaskRunner( |
- worker_pool, |
- worker_pool->GetNamedSequenceToken("dom_storage_primary"), |
- worker_pool->GetNamedSequenceToken("dom_storage_commit"), |
- BrowserThread::GetTaskRunnerForThread(BrowserThread::IO).get())); |
+ new DOMStorageWorkerPoolTaskRunner(std::move(primary_sequence), |
+ std::move(commit_sequence))); |
if (base::FeatureList::IsEnabled(features::kMemoryCoordinator)) { |
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(this); |