1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/extensions/api/storage/sync_value_store_cache.h"
8 #include "base/callback.h"
9 #include "base/files/file_path.h"
10 #include "base/sequenced_task_runner.h"
11 #include "chrome/browser/extensions/api/storage/sync_storage_backend.h"
12 #include "chrome/browser/sync/glue/sync_start_util.h"
13 #include "content/public/browser/browser_thread.h"
14 #include "extensions/browser/api/storage/settings_storage_quota_enforcer.h"
15 #include "extensions/browser/api/storage/storage_frontend.h"
16 #include "extensions/common/api/storage.h"
17 #include "extensions/common/constants.h"
18 #include "extensions/common/extension.h"
20 using content::BrowserThread
;
22 namespace extensions
{
26 // Returns the quota limit for sync storage, taken from the schema in
27 // extensions/common/api/storage.json.
28 SettingsStorageQuotaEnforcer::Limits
GetSyncQuotaLimits() {
29 SettingsStorageQuotaEnforcer::Limits limits
= {
30 static_cast<size_t>(core_api::storage::sync::QUOTA_BYTES
),
31 static_cast<size_t>(core_api::storage::sync::QUOTA_BYTES_PER_ITEM
),
32 static_cast<size_t>(core_api::storage::sync::MAX_ITEMS
)
39 SyncValueStoreCache::SyncValueStoreCache(
40 const scoped_refptr
<SettingsStorageFactory
>& factory
,
41 const scoped_refptr
<SettingsObserverList
>& observers
,
42 const base::FilePath
& profile_path
)
43 : initialized_(false) {
44 DCHECK_CURRENTLY_ON(BrowserThread::UI
);
46 // This post is safe since the destructor can only be invoked from the
47 // same message loop, and any potential post of a deletion task must come
48 // after the constructor returns.
49 BrowserThread::PostTask(
50 BrowserThread::FILE, FROM_HERE
,
51 base::Bind(&SyncValueStoreCache::InitOnFileThread
,
52 base::Unretained(this),
53 factory
, observers
, profile_path
));
56 SyncValueStoreCache::~SyncValueStoreCache() {
57 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
60 syncer::SyncableService
* SyncValueStoreCache::GetSyncableService(
61 syncer::ModelType type
) const {
62 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
66 case syncer::APP_SETTINGS
:
67 return app_backend_
.get();
68 case syncer::EXTENSION_SETTINGS
:
69 return extension_backend_
.get();
76 void SyncValueStoreCache::RunWithValueStoreForExtension(
77 const StorageCallback
& callback
,
78 scoped_refptr
<const Extension
> extension
) {
79 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
81 SyncStorageBackend
* backend
=
82 extension
->is_app() ? app_backend_
.get() : extension_backend_
.get();
83 callback
.Run(backend
->GetStorage(extension
->id()));
86 void SyncValueStoreCache::DeleteStorageSoon(const std::string
& extension_id
) {
87 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
88 app_backend_
->DeleteStorage(extension_id
);
89 extension_backend_
->DeleteStorage(extension_id
);
92 void SyncValueStoreCache::InitOnFileThread(
93 const scoped_refptr
<SettingsStorageFactory
>& factory
,
94 const scoped_refptr
<SettingsObserverList
>& observers
,
95 const base::FilePath
& profile_path
) {
96 DCHECK_CURRENTLY_ON(BrowserThread::FILE);
97 DCHECK(!initialized_
);
98 app_backend_
.reset(new SyncStorageBackend(
100 profile_path
.AppendASCII(kSyncAppSettingsDirectoryName
),
101 GetSyncQuotaLimits(),
103 syncer::APP_SETTINGS
,
104 sync_start_util::GetFlareForSyncableService(profile_path
)));
105 extension_backend_
.reset(new SyncStorageBackend(
107 profile_path
.AppendASCII(kSyncExtensionSettingsDirectoryName
),
108 GetSyncQuotaLimits(),
110 syncer::EXTENSION_SETTINGS
,
111 sync_start_util::GetFlareForSyncableService(profile_path
)));
115 } // namespace extensions