Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright 2013 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. | |
| 4 | |
| 5 #include "webkit/browser/fileapi/syncable/syncable_sandbox_mount_point_provider. h" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 #include "base/metrics/histogram.h" | |
| 9 #include "webkit/browser/fileapi/file_system_context.h" | |
| 10 #include "webkit/browser/fileapi/sandbox_quota_observer.h" | |
| 11 #include "webkit/browser/fileapi/syncable/syncable_file_system_operation.h" | |
| 12 #include "webkit/browser/fileapi/syncable/syncable_file_system_util.h" | |
| 13 #include "webkit/common/fileapi/file_system_util.h" | |
| 14 | |
| 15 namespace sync_file_system { | |
| 16 | |
| 17 namespace { | |
| 18 const char kSyncableOriginsCountLabel[] = "FileSystem.SyncableOriginsCount"; | |
| 19 } // namespace | |
| 20 | |
| 21 SyncableSandboxMountPointProvider::SyncableSandboxMountPointProvider( | |
| 22 quota::QuotaManagerProxy* quota_manager_proxy, | |
| 23 base::SequencedTaskRunner* file_task_runner, | |
| 24 const base::FilePath& profile_path, | |
| 25 const fileapi::FileSystemOptions& file_system_options, | |
| 26 quota::SpecialStoragePolicy* special_storage_policy) | |
| 27 : SandboxMountPointProvider(quota_manager_proxy, | |
| 28 file_task_runner, | |
| 29 profile_path, | |
| 30 file_system_options, | |
| 31 special_storage_policy) { | |
|
kinuko
2013/07/08 12:31:20
Hmm... I realized this needs a bit more design dis
nhiroki
2013/07/22 04:34:14
Done in http://crrev.com/210790/
| |
| 32 fileapi::UpdateObserverList::Source update_observers_src; | |
| 33 | |
| 34 if (enable_usage_tracking_) { | |
| 35 update_observers_src.AddObserver(quota_observer_.get(), | |
| 36 file_task_runner_.get()); | |
| 37 } | |
| 38 | |
| 39 syncable_update_observers_ = | |
| 40 fileapi::UpdateObserverList(update_observers_src); | |
| 41 } | |
| 42 | |
| 43 SyncableSandboxMountPointProvider::~SyncableSandboxMountPointProvider() { | |
| 44 file_task_runner_->DeleteSoon(FROM_HERE, change_tracker_.release()); | |
| 45 } | |
| 46 | |
| 47 bool SyncableSandboxMountPointProvider::CanHandleType( | |
| 48 fileapi::FileSystemType type) const { | |
| 49 return type == fileapi::kFileSystemTypeSyncable || | |
| 50 type == fileapi::kFileSystemTypeSyncableForInternalSync; | |
| 51 } | |
| 52 | |
| 53 GURL SyncableSandboxMountPointProvider::GetRootURI( | |
| 54 const GURL& origin_url, | |
| 55 fileapi::FileSystemType type) const { | |
| 56 if (!CanHandleType(type)) | |
| 57 return GURL(); | |
| 58 if (type == fileapi::kFileSystemTypeSyncableForInternalSync) | |
| 59 return GetFileSystemRootURI(origin_url, type); | |
| 60 return sync_file_system::GetSyncableFileSystemRootURI(origin_url); | |
| 61 } | |
| 62 | |
| 63 fileapi::FileSystemOperation* | |
| 64 SyncableSandboxMountPointProvider::CreateFileSystemOperation( | |
| 65 const fileapi::FileSystemURL& url, | |
| 66 fileapi::FileSystemContext* context, | |
| 67 base::PlatformFileError* error_code) const { | |
| 68 if (!IsAccessValid(url)) { | |
| 69 *error_code = base::PLATFORM_FILE_ERROR_SECURITY; | |
| 70 return NULL; | |
| 71 } | |
| 72 | |
| 73 if (url.type() == fileapi::kFileSystemTypeSyncableForInternalSync) { | |
| 74 return fileapi::SandboxMountPointProvider::CreateFileSystemOperation( | |
| 75 url, context, error_code); | |
| 76 } | |
| 77 | |
| 78 scoped_ptr<fileapi::FileSystemOperationContext> operation_context( | |
| 79 new fileapi::FileSystemOperationContext(context)); | |
| 80 operation_context->set_update_observers(syncable_update_observers_); | |
| 81 operation_context->set_change_observers(syncable_change_observers_); | |
| 82 | |
| 83 return new SyncableFileSystemOperation( | |
| 84 url, context, operation_context.Pass()); | |
| 85 } | |
| 86 | |
| 87 const fileapi::UpdateObserverList* | |
| 88 SyncableSandboxMountPointProvider::GetUpdateObservers( | |
| 89 fileapi::FileSystemType type) const { | |
| 90 if (type == fileapi::kFileSystemTypeSyncableForInternalSync) | |
| 91 return &update_observers_; | |
| 92 return &syncable_update_observers_; | |
| 93 } | |
| 94 | |
| 95 void SyncableSandboxMountPointProvider::GetOriginsForTypeOnFileThread( | |
| 96 fileapi::FileSystemType type, | |
| 97 std::set<GURL>* origins) { | |
| 98 DCHECK(CanHandleType(type)); | |
| 99 DCHECK(origins); | |
| 100 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); | |
| 101 GURL origin; | |
| 102 while (!(origin = enumerator->Next()).is_empty()) { | |
| 103 if (enumerator->HasFileSystemType(type)) | |
| 104 origins->insert(origin); | |
| 105 } | |
| 106 switch (type) { | |
| 107 case fileapi::kFileSystemTypeSyncable: | |
| 108 UMA_HISTOGRAM_COUNTS(kSyncableOriginsCountLabel, origins->size()); | |
| 109 break; | |
| 110 default: | |
| 111 break; | |
| 112 } | |
| 113 } | |
| 114 | |
| 115 void SyncableSandboxMountPointProvider::AddFileUpdateObserver( | |
| 116 fileapi::FileSystemType type, | |
| 117 fileapi::FileUpdateObserver* observer, | |
| 118 base::SequencedTaskRunner* task_runner) { | |
| 119 DCHECK(CanHandleType(type)); | |
| 120 if (type == fileapi::kFileSystemTypeSyncableForInternalSync) { | |
| 121 fileapi::SandboxMountPointProvider::AddFileUpdateObserver( | |
| 122 type, observer, task_runner); | |
| 123 return; | |
| 124 } | |
| 125 | |
| 126 fileapi::UpdateObserverList* list = &syncable_update_observers_; | |
| 127 fileapi::UpdateObserverList::Source observer_source = list->source(); | |
| 128 observer_source.AddObserver(observer, task_runner); | |
| 129 *list = fileapi::UpdateObserverList(observer_source); | |
| 130 } | |
| 131 | |
| 132 void SyncableSandboxMountPointProvider::AddFileChangeObserver( | |
| 133 fileapi::FileSystemType type, | |
| 134 fileapi::FileChangeObserver* observer, | |
| 135 base::SequencedTaskRunner* task_runner) { | |
| 136 DCHECK(CanHandleType(type)); | |
| 137 if (type == fileapi::kFileSystemTypeSyncableForInternalSync) { | |
| 138 fileapi::SandboxMountPointProvider::AddFileChangeObserver( | |
| 139 type, observer, task_runner); | |
| 140 return; | |
| 141 } | |
| 142 | |
| 143 fileapi::ChangeObserverList* list = &syncable_change_observers_; | |
| 144 fileapi::ChangeObserverList::Source observer_source = list->source(); | |
| 145 observer_source.AddObserver(observer, task_runner); | |
| 146 *list = fileapi::ChangeObserverList(observer_source); | |
| 147 } | |
| 148 | |
| 149 // static | |
| 150 SyncableSandboxMountPointProvider* | |
| 151 SyncableSandboxMountPointProvider::GetProvider( | |
| 152 const fileapi::FileSystemContext* file_system_context) { | |
| 153 return static_cast<SyncableSandboxMountPointProvider*>( | |
| 154 file_system_context->GetMountPointProvider( | |
| 155 fileapi::kFileSystemTypeSyncable)); | |
| 156 } | |
| 157 | |
| 158 void SyncableSandboxMountPointProvider::set_change_tracker( | |
| 159 scoped_ptr<LocalFileChangeTracker> tracker) { | |
| 160 DCHECK(!change_tracker_.get()); | |
| 161 DCHECK(tracker.get()); | |
| 162 change_tracker_ = tracker.Pass(); | |
| 163 AddFileUpdateObserver(fileapi::kFileSystemTypeSyncable, | |
| 164 change_tracker_.get(), | |
| 165 file_task_runner_); | |
| 166 AddFileChangeObserver(fileapi::kFileSystemTypeSyncable, | |
| 167 change_tracker_.get(), | |
| 168 file_task_runner_); | |
| 169 } | |
| 170 | |
| 171 void SyncableSandboxMountPointProvider::set_sync_context( | |
| 172 sync_file_system::LocalFileSyncContext* sync_context) { | |
| 173 sync_context_ = sync_context; | |
| 174 } | |
| 175 | |
| 176 } // namespace sync_file_system | |
| OLD | NEW |