Index: chrome/browser/extensions/api/settings_private/settings_private_event_router.cc |
diff --git a/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc b/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc |
index f42e2ef98f92d0e5a7ff9316f84b53124b5edd27..d5d266359779a7f090323bfe3bcadbc5b72e499c 100644 |
--- a/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc |
+++ b/chrome/browser/extensions/api/settings_private/settings_private_event_router.cc |
@@ -9,6 +9,7 @@ |
#include "base/bind.h" |
#include "base/bind_helpers.h" |
+#include "base/threading/thread_task_runner_handle.h" |
#include "build/build_config.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/profiles/profile.h" |
@@ -20,7 +21,7 @@ namespace extensions { |
SettingsPrivateEventRouter::SettingsPrivateEventRouter( |
content::BrowserContext* context) |
- : context_(context), listening_(false) { |
+ : context_(context), listening_(false), weak_ptr_factory_(this) { |
// Register with the event router so we know when renderers are listening to |
// our events. We first check and see if there *is* an event router, because |
// some unit tests try to create all context services, but don't initialize |
@@ -123,6 +124,15 @@ void SettingsPrivateEventRouter::StartOrStopListeningForPrefsChanges() { |
void SettingsPrivateEventRouter::OnPreferenceChanged( |
const std::string& pref_name) { |
+ // This posts an asynchronous task to ensure that all pref stores are updated, |
+ // as |prefs_util_->GetPref()| relies on this information to determine if a |
+ // preference is controlled by e.g. extensions. |
+ base::ThreadTaskRunnerHandle::Get()->PostTask( |
+ FROM_HERE, base::Bind(&SettingsPrivateEventRouter::SendPrefChange, |
+ weak_ptr_factory_.GetWeakPtr(), pref_name)); |
+} |
+ |
+void SettingsPrivateEventRouter::SendPrefChange(const std::string& pref_name) { |
EventRouter* event_router = EventRouter::Get(context_); |
if (!event_router->HasEventListener( |
api::settings_private::OnPrefsChanged::kEventName)) { |