Index: chrome/browser/shell_integration.cc |
diff --git a/chrome/browser/shell_integration.cc b/chrome/browser/shell_integration.cc |
index a846887aa0d8bb3a30a26c9878843fec0096d1bd..6497e0cde5448149f331d209b4c10b7ccd6d4f3a 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" |
@@ -136,15 +137,14 @@ base::string16 GetAppShortcutsSubdirName() { |
// |
void DefaultWebClientWorker::StartCheckIsDefault() { |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&DefaultWebClientWorker::CheckIsDefault, this, false)); |
+ base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()}) |
gab
2017/05/26 18:44:05
Why does this need to be called on a sequence whic
Patrick Monette
2017/05/29 18:54:14
I decided to go with sequencing everything
|
+ ->PostTask(FROM_HERE, base::Bind(&DefaultWebClientWorker::CheckIsDefault, |
+ this, false)); |
} |
void DefaultWebClientWorker::StartSetAsDefault() { |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&DefaultWebClientWorker::SetAsDefault, this)); |
+ GetSetDefaultTaskRunner()->PostTask( |
+ FROM_HERE, base::Bind(&DefaultWebClientWorker::SetAsDefault, this)); |
} |
/////////////////////////////////////////////////////////////////////////////// |
@@ -170,8 +170,38 @@ void DefaultWebClientWorker::OnCheckIsDefaultComplete( |
/////////////////////////////////////////////////////////////////////////////// |
// DefaultWebClientWorker, private: |
+scoped_refptr<base::SequencedTaskRunner> |
+DefaultWebClientWorker::GetSetDefaultTaskRunner() { |
+ DCHECK_CURRENTLY_ON(BrowserThread::UI); |
+#if defined(OS_WIN) |
+ if (base::win::GetVersion() >= base::win::VERSION_WIN10) { |
+ // On Windows 10, all the calls to SetAsDefault() must be done on the same |
+ // SequencedTaskRunner (see OpenSystemSettingsHelper). Because the callers |
+ // don't know each others, a global is shared between them. |
+ // |
+ // 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. |
gab
2017/05/26 18:44:05
Feels like we might as well just sequence all atte
Patrick Monette
2017/05/29 18:54:14
Sounds good.
|
+ static base::SingleThreadTaskRunner* task_runner = nullptr; |
gab
2017/05/26 18:44:05
Make this a scoped_refptr<> assign the result of b
Patrick Monette
2017/05/29 18:54:14
Done.
|
+ |
+ if (!task_runner) { |
+ scoped_refptr<base::SingleThreadTaskRunner> new_task_runner = |
+ base::CreateSingleThreadTaskRunnerWithTraits({base::MayBlock()}); |
+ |
+ new_task_runner->AddRef(); |
+ task_runner = new_task_runner.get(); |
+ } |
+ |
+ return task_runner; |
+ } |
+#endif // defined(OS_WIN) |
gab
2017/05/26 18:44:05
#else?
Patrick Monette
2017/05/29 18:54:14
Done.
|
+ return base::CreateSequencedTaskRunnerWithTraits({base::MayBlock()}); |
+#endif // !defined(OS_WIN) |
gab
2017/05/26 18:44:05
#endif // defined(OS_WIN)
^ don't add
Patrick Monette
2017/05/29 18:54:14
Done.
|
+} |
+ |
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 +210,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( |