Index: chrome/browser/shell_integration.cc |
diff --git a/chrome/browser/shell_integration.cc b/chrome/browser/shell_integration.cc |
index a846887aa0d8bb3a30a26c9878843fec0096d1bd..e18e93ead9fa247dd6c4fb8842a8c85098ee869f 100644 |
--- a/chrome/browser/shell_integration.cc |
+++ b/chrome/browser/shell_integration.cc |
@@ -11,6 +11,7 @@ |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "base/task_scheduler/post_task.h" |
#include "base/threading/thread_restrictions.h" |
#include "build/build_config.h" |
#include "chrome/browser/policy/policy_path_parser.h" |
@@ -44,6 +45,18 @@ namespace { |
const struct AppModeInfo* gAppModeInfo = nullptr; |
+scoped_refptr<base::SequencedTaskRunner> |
+CreateTaskRunnerForDefaultWebClientWorker() { |
+#if defined(OS_WIN) |
+ if (base::win::GetVersion() >= base::win::VERSION_WIN10) |
+ // TODO(pmonette): Windows 10's implementation uses a base::Timer which |
+ // currently still requires a SingleThreadTaskRunner. Change this to a |
+ // SequencedTaskRunner when crbug.com/552633 is fixed. |
+ return base::CreateSingleThreadTaskRunnerWithTraits({base::MayBlock()}); |
+#endif // defined(OS_WIN) |
+ return base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()}); |
+} |
+ |
} // namespace |
bool CanSetAsDefaultBrowser() { |
@@ -136,15 +149,14 @@ base::string16 GetAppShortcutsSubdirName() { |
// |
void DefaultWebClientWorker::StartCheckIsDefault() { |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
+ GetTaskRunner()->PostTask( |
+ FROM_HERE, |
base::Bind(&DefaultWebClientWorker::CheckIsDefault, this, false)); |
} |
void DefaultWebClientWorker::StartSetAsDefault() { |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&DefaultWebClientWorker::SetAsDefault, this)); |
+ GetTaskRunner()->PostTask( |
+ FROM_HERE, base::Bind(&DefaultWebClientWorker::SetAsDefault, this)); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -170,8 +182,27 @@ void DefaultWebClientWorker::OnCheckIsDefaultComplete( |
/////////////////////////////////////////////////////////////////////////////// |
// DefaultWebClientWorker, private: |
+// static |
+scoped_refptr<base::SequencedTaskRunner> |
+DefaultWebClientWorker::GetTaskRunner() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+ |
+ // TODO(pmonette): The better way to make sure all instances of |
+ // DefaultWebClient share a SequencedTaskRunner is to make the worker a |
+ // singleton. |
+ static scoped_refptr<base::SequencedTaskRunner>* task_runner = nullptr; |
+ |
+ if (!task_runner) { |
+ task_runner = new scoped_refptr<base::SequencedTaskRunner>( |
+ CreateTaskRunnerForDefaultWebClientWorker()); |
+ } |
+ |
+ return *task_runner; |
+} |
+ |
void DefaultWebClientWorker::CheckIsDefault(bool is_following_set_as_default) { |
- DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
+ base::ThreadRestrictions::AssertIOAllowed(); |
+ |
DefaultWebClientState state = CheckIsDefaultImpl(); |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
@@ -180,7 +211,7 @@ void DefaultWebClientWorker::CheckIsDefault(bool is_following_set_as_default) { |
} |
void DefaultWebClientWorker::SetAsDefault() { |
- DCHECK_CURRENTLY_ON(BrowserThread::FILE); |
+ base::ThreadRestrictions::AssertIOAllowed(); |
// SetAsDefaultImpl will make sure the callback is executed exactly once. |
SetAsDefaultImpl( |