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

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

Issue 8375047: Separate the syncing of extension settings and app settings into separate data (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 84bfaacc003839c6bbfd33b7bad3b1d7d98d5fed..2b2bb8fa0bd35e0a7b9d648a474dfe27a06936d5 100644
--- a/chrome/browser/extensions/extension_settings_frontend.cc
+++ b/chrome/browser/extensions/extension_settings_frontend.cc
@@ -14,6 +14,69 @@
#include "content/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
+namespace {
+
+struct Backends {
+ Backends(
+ const FilePath& profile_path,
+ const scoped_refptr<ExtensionSettingsObserverList>& observers)
+ : extensions_backend_(
+ profile_path.AppendASCII(
+ ExtensionService::kExtensionSettingsDirectoryName),
+ observers),
+ apps_backend_(
+ profile_path.AppendASCII(
+ ExtensionService::kAppSettingsDirectoryName),
+ observers) {}
+
+ ExtensionSettingsBackend extensions_backend_;
+ ExtensionSettingsBackend apps_backend_;
+};
+
+static void CallbackWithExtensionsBackend(
+ const ExtensionSettingsFrontend::SyncableServiceCallback& callback,
+ Backends* backends) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ callback.Run(&backends->extensions_backend_);
+}
+
+void CallbackWithAppsBackend(
+ const ExtensionSettingsFrontend::SyncableServiceCallback& callback,
+ Backends* backends) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ callback.Run(&backends->apps_backend_);
+}
+
+void CallbackWithExtensionsStorage(
+ const std::string& extension_id,
+ const ExtensionSettingsFrontend::StorageCallback& callback,
+ Backends* backends) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ callback.Run(backends->extensions_backend_.GetStorage(extension_id));
+}
+
+void CallbackWithAppsStorage(
+ const std::string& extension_id,
+ const ExtensionSettingsFrontend::StorageCallback& callback,
+ Backends* backends) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ callback.Run(backends->apps_backend_.GetStorage(extension_id));
+}
+
+void CallbackWithNullStorage(
+ const ExtensionSettingsFrontend::StorageCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ callback.Run(NULL);
+}
+
+void DeleteStorageOnFileThread(
+ const std::string& extension_id, Backends* backends) {
+ backends->extensions_backend_.DeleteStorage(extension_id);
akalin 2011/10/28 06:04:54 DCHECK FILE thread
not at google - send to devlin 2011/10/31 00:02:23 Done.
+ backends->apps_backend_.DeleteStorage(extension_id);
+}
+
+} // namespace
+
class ExtensionSettingsFrontend::DefaultObserver
: public ExtensionSettingsObserver {
public:
@@ -44,34 +107,47 @@ class ExtensionSettingsFrontend::Core
: public base::RefCountedThreadSafe<Core> {
public:
explicit Core(
- const scoped_refptr<ObserverListThreadSafe<ExtensionSettingsObserver> >&
- observers)
- : observers_(observers), backend_(NULL) {
+ const scoped_refptr<ExtensionSettingsObserverList>& observers)
+ : observers_(observers), backends_(NULL) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
}
+ typedef base::Callback<void(Backends*)> BackendsCallback;
+
// Does any FILE thread specific initialization, such as construction of
// |backend_|. Must be called before any call to
// RunWithBackendOnFileThread().
- void InitOnFileThread(const FilePath& base_path) {
+ void InitOnFileThread(const FilePath& profile_path) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- DCHECK(!backend_);
- backend_ = new ExtensionSettingsBackend(base_path, observers_);
+ DCHECK(!backends_);
+ backends_ = new Backends(profile_path, observers_);
}
- // Runs |callback| with the extension backend.
- void RunWithBackendOnFileThread(const BackendCallback& callback) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
- DCHECK(backend_);
- callback.Run(backend_);
+ // Runs |callback| with both the extensions and apps settings on the FILE
+ // thread.
+ void RunWithBackends(const BackendsCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ BrowserThread::PostTask(
+ BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(
+ &ExtensionSettingsFrontend::Core::RunWithBackendsOnFileThread,
+ this,
+ callback));
}
private:
+ void RunWithBackendsOnFileThread(const BackendsCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+ DCHECK(backends_);
+ callback.Run(backends_);
+ }
+
virtual ~Core() {
if (BrowserThread::CurrentlyOn(BrowserThread::FILE)) {
- delete backend_;
+ delete backends_;
} else if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
- BrowserThread::DeleteSoon(BrowserThread::FILE, FROM_HERE, backend_);
+ BrowserThread::DeleteSoon(BrowserThread::FILE, FROM_HERE, backends_);
} else {
NOTREACHED();
}
@@ -80,19 +156,18 @@ class ExtensionSettingsFrontend::Core
friend class base::RefCountedThreadSafe<Core>;
// Observers to settings changes (thread safe).
- scoped_refptr<ObserverListThreadSafe<ExtensionSettingsObserver> >
- observers_;
+ scoped_refptr<ExtensionSettingsObserverList> observers_;
- // Lives on the FILE thread.
- ExtensionSettingsBackend* backend_;
+ // Backends for extensions and apps settings. Lives on FILE thread.
+ Backends* backends_;
DISALLOW_COPY_AND_ASSIGN(Core);
};
ExtensionSettingsFrontend::ExtensionSettingsFrontend(Profile* profile)
: profile_(profile),
- observers_(new ObserverListThreadSafe<ExtensionSettingsObserver>()),
- core_(new ExtensionSettingsFrontend::Core(observers_.get())) {
+ observers_(new ExtensionSettingsObserverList()),
+ core_(new ExtensionSettingsFrontend::Core(observers_)) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(!profile->IsOffTheRecord());
@@ -111,34 +186,64 @@ ExtensionSettingsFrontend::ExtensionSettingsFrontend(Profile* profile)
base::Bind(
&ExtensionSettingsFrontend::Core::InitOnFileThread,
core_.get(),
- profile->GetPath().AppendASCII(
- ExtensionService::kSettingsDirectoryName)));
+ profile->GetPath()));
}
ExtensionSettingsFrontend::~ExtensionSettingsFrontend() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
}
-void ExtensionSettingsFrontend::RunWithBackend(
- const BackendCallback& callback) {
+void ExtensionSettingsFrontend::RunWithSyncableService(
+ syncable::ModelType model_type, const SyncableServiceCallback& callback) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
- BrowserThread::PostTask(
- BrowserThread::FILE,
- FROM_HERE,
- base::Bind(
- &ExtensionSettingsFrontend::Core::RunWithBackendOnFileThread,
- core_.get(),
- callback));
+ switch (model_type) {
+ case syncable::EXTENSION_SETTINGS:
+ core_->RunWithBackends(
+ base::Bind(&CallbackWithExtensionsBackend, callback));
+ break;
+ case syncable::APP_SETTINGS:
+ core_->RunWithBackends(
+ base::Bind(&CallbackWithAppsBackend, callback));
+ break;
+ default:
+ NOTREACHED();
+ }
+}
+
+void ExtensionSettingsFrontend::RunWithStorage(
+ const std::string& extension_id,
+ const StorageCallback& callback) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+
+ const Extension* extension =
+ profile_->GetExtensionService()->GetExtensionById(extension_id, true);
+ if (!extension) {
+ BrowserThread::PostTask(
+ BrowserThread::FILE,
+ FROM_HERE,
+ base::Bind(&CallbackWithNullStorage, callback));
+ return;
+ }
+
+ if (extension->is_app()) {
+ core_->RunWithBackends(
+ base::Bind(&CallbackWithAppsStorage, extension_id, callback));
+ } else {
+ core_->RunWithBackends(
+ base::Bind(&CallbackWithExtensionsStorage, extension_id, callback));
+ }
}
-void ExtensionSettingsFrontend::AddObserver(
- ExtensionSettingsObserver* observer) {
- observers_->AddObserver(observer);
+void ExtensionSettingsFrontend::DeleteStorageSoon(
+ const std::string& extension_id) {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ core_->RunWithBackends(base::Bind(&DeleteStorageOnFileThread, extension_id));
}
-void ExtensionSettingsFrontend::RemoveObserver(
- ExtensionSettingsObserver* observer) {
- observers_->RemoveObserver(observer);
+scoped_refptr<ExtensionSettingsObserverList>
+ExtensionSettingsFrontend::GetObservers() {
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
+ return observers_;
}
void ExtensionSettingsFrontend::Observe(
@@ -184,13 +289,13 @@ void ExtensionSettingsFrontend::SetDefaultObserver(
Profile* profile, scoped_ptr<DefaultObserver>* observer) {
DCHECK(!observer->get());
observer->reset(new DefaultObserver(profile));
- AddObserver(observer->get());
+ observers_->AddObserver(observer->get());
}
void ExtensionSettingsFrontend::ClearDefaultObserver(
scoped_ptr<DefaultObserver>* observer) {
if (observer->get()) {
- RemoveObserver(observer->get());
+ observers_->RemoveObserver(observer->get());
observer->reset();
}
}

Powered by Google App Engine
This is Rietveld 408576698