Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6029)

Unified Diff: chrome/browser/extensions/extension_settings_frontend.cc

Issue 8177022: Add onChanged events to the extension settings API, both from sync and between (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698