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 |