Index: chrome/browser/extensions/extension_settings_frontend.cc |
diff --git a/chrome/browser/extensions/extension_settings_frontend.cc b/chrome/browser/extensions/extension_settings_frontend.cc |
index 4963e927ae92c67c77fb084f76387cce05297626..5490f13755ea5314fbbaf16aff4819c443a62630 100644 |
--- a/chrome/browser/extensions/extension_settings_frontend.cc |
+++ b/chrome/browser/extensions/extension_settings_frontend.cc |
@@ -6,20 +6,37 @@ |
#include "base/bind.h" |
#include "base/file_path.h" |
+#include "chrome/browser/extensions/extension_event_names.h" |
+#include "chrome/browser/extensions/extension_event_router.h" |
+#include "chrome/browser/extensions/extension_service.h" |
#include "chrome/browser/extensions/extension_settings_backend.h" |
+#include "chrome/browser/profiles/profile.h" |
#include "content/browser/browser_thread.h" |
-ExtensionSettingsFrontend::ExtensionSettingsFrontend( |
- const FilePath& base_path) |
- : core_(new ExtensionSettingsFrontend::Core()) { |
+ExtensionSettingsFrontend::ExtensionSettingsFrontend(Profile* profile) |
+ : observers_(new ObserverListThreadSafe<ExtensionSettingsObserver>()), |
+ core_(new ExtensionSettingsFrontend::Core(observers_.get())), |
+ profile_(profile) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ |
+ registrar_.Add(this, chrome::NOTIFICATION_PROFILE_CREATED, |
+ NotificationService::AllBrowserContextsAndSources()); |
+ registrar_.Add(this, chrome::NOTIFICATION_PROFILE_DESTROYED, |
+ NotificationService::AllBrowserContextsAndSources()); |
+ OnProfileCreated(profile); |
+ |
BrowserThread::PostTask( |
BrowserThread::FILE, |
FROM_HERE, |
base::Bind( |
&ExtensionSettingsFrontend::Core::InitOnFileThread, |
core_.get(), |
- base_path)); |
+ profile->GetPath().AppendASCII( |
+ ExtensionService::kSettingsDirectoryName))); |
+} |
+ |
+ExtensionSettingsFrontend::~ExtensionSettingsFrontend() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
} |
void ExtensionSettingsFrontend::RunWithBackend( |
@@ -34,11 +51,61 @@ void ExtensionSettingsFrontend::RunWithBackend( |
callback)); |
} |
-ExtensionSettingsFrontend::~ExtensionSettingsFrontend() { |
+void ExtensionSettingsFrontend::AddObserver( |
+ ExtensionSettingsObserver* observer) { |
+ observers_->AddObserver(observer); |
akalin
2011/10/07 21:06:23
DCHECK UI
not at google - send to devlin
2011/10/10 01:00:16
Done.
|
+} |
+ |
+void ExtensionSettingsFrontend::RemoveObserver( |
+ ExtensionSettingsObserver* observer) { |
+ observers_->RemoveObserver(observer); |
akalin
2011/10/07 21:06:23
DCHECK UI
not at google - send to devlin
2011/10/10 01:00:16
Done.
|
+} |
+ |
+void ExtensionSettingsFrontend::TriggerOnSettingsChanged( |
+ Profile* profile, |
+ const std::string& extension_id, |
+ const ExtensionSettingsObserver::ChangeList& changes) { |
+ observers_->Notify( |
akalin
2011/10/07 21:06:23
DCHECK UI
not at google - send to devlin
2011/10/10 01:00:16
Method deleted.
|
+ &ExtensionSettingsObserver::OnSettingsChanged, |
+ profile, |
+ extension_id, |
+ changes.GetEventJson()); |
+} |
+ |
+void ExtensionSettingsFrontend::Observe( |
+ int type, |
+ const NotificationSource& source, |
+ const NotificationDetails& details) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ switch (type) { |
+ case chrome::NOTIFICATION_PROFILE_CREATED: |
+ OnProfileCreated(Source<Profile>(source).ptr()); |
+ break; |
+ case chrome::NOTIFICATION_PROFILE_DESTROYED: |
+ OnProfileDestroyed(Source<Profile>(source).ptr()); |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+} |
+ |
+void ExtensionSettingsFrontend::OnProfileCreated(Profile* new_profile) { |
+ DCHECK(profile_observers_.find(new_profile) == profile_observers_.end()); |
+ DefaultObserver* new_observer = new DefaultObserver(new_profile); |
+ profile_observers_[new_profile] = new_observer; |
+ AddObserver(new_observer); |
+} |
+ |
+void ExtensionSettingsFrontend::OnProfileDestroyed(Profile* old_profile) { |
+ DefaultObserver* old_observer = profile_observers_[old_profile]; |
+ DCHECK(old_observer); |
+ profile_observers_.erase(old_profile); |
akalin
2011/10/07 21:06:23
this is a leak. Suggest using link_ptrs instead.
not at google - send to devlin
2011/10/10 01:00:16
Ah.
|
+ RemoveObserver(old_observer); |
} |
-ExtensionSettingsFrontend::Core::Core() : backend_(NULL) { |
+ExtensionSettingsFrontend::Core::Core( |
+ ObserverListThreadSafe<ExtensionSettingsObserver>* observers) |
+ : observers_(observers), backend_(NULL) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
} |
@@ -46,7 +113,7 @@ void ExtensionSettingsFrontend::Core::InitOnFileThread( |
const FilePath& base_path) { |
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); |
DCHECK(!backend_); |
- backend_ = new ExtensionSettingsBackend(base_path); |
+ backend_ = new ExtensionSettingsBackend(base_path, observers_); |
} |
void ExtensionSettingsFrontend::Core::RunWithBackendOnFileThread( |
@@ -65,3 +132,22 @@ ExtensionSettingsFrontend::Core::~Core() { |
NOTREACHED(); |
} |
} |
+ |
+ExtensionSettingsFrontend::DefaultObserver::DefaultObserver( |
+ Profile* target_profile) : target_profile_(target_profile) {} |
+ |
+ExtensionSettingsFrontend::DefaultObserver::~DefaultObserver() {} |
+ |
+void ExtensionSettingsFrontend::DefaultObserver::OnSettingsChanged( |
+ Profile* origin_profile, |
+ const std::string& extension_id, |
+ const std::string& event_json) { |
+ if (origin_profile != target_profile_) { |
+ target_profile_->GetExtensionEventRouter()->DispatchEventToExtension( |
+ extension_id, |
+ extension_event_names::kOnSettingsChanged, |
+ event_json, |
+ target_profile_, |
+ GURL()); |
+ } |
+} |