OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "webkit/browser/fileapi/sandbox_file_system_backend_delegate.h" | 5 #include "storage/browser/fileapi/sandbox_file_system_backend_delegate.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/file_util.h" | 10 #include "base/file_util.h" |
11 #include "base/metrics/histogram.h" | 11 #include "base/metrics/histogram.h" |
12 #include "base/stl_util.h" | 12 #include "base/stl_util.h" |
13 #include "base/task_runner_util.h" | 13 #include "base/task_runner_util.h" |
14 #include "net/base/net_util.h" | 14 #include "net/base/net_util.h" |
15 #include "webkit/browser/blob/file_stream_reader.h" | 15 #include "storage/browser/blob/file_stream_reader.h" |
16 #include "webkit/browser/fileapi/async_file_util_adapter.h" | 16 #include "storage/browser/fileapi/async_file_util_adapter.h" |
17 #include "webkit/browser/fileapi/file_system_context.h" | 17 #include "storage/browser/fileapi/file_system_context.h" |
18 #include "webkit/browser/fileapi/file_system_operation_context.h" | 18 #include "storage/browser/fileapi/file_system_operation_context.h" |
19 #include "webkit/browser/fileapi/file_system_url.h" | 19 #include "storage/browser/fileapi/file_system_url.h" |
20 #include "webkit/browser/fileapi/file_system_usage_cache.h" | 20 #include "storage/browser/fileapi/file_system_usage_cache.h" |
21 #include "webkit/browser/fileapi/obfuscated_file_util.h" | 21 #include "storage/browser/fileapi/obfuscated_file_util.h" |
22 #include "webkit/browser/fileapi/quota/quota_backend_impl.h" | 22 #include "storage/browser/fileapi/quota/quota_backend_impl.h" |
23 #include "webkit/browser/fileapi/quota/quota_reservation.h" | 23 #include "storage/browser/fileapi/quota/quota_reservation.h" |
24 #include "webkit/browser/fileapi/quota/quota_reservation_manager.h" | 24 #include "storage/browser/fileapi/quota/quota_reservation_manager.h" |
25 #include "webkit/browser/fileapi/sandbox_file_stream_writer.h" | 25 #include "storage/browser/fileapi/sandbox_file_stream_writer.h" |
26 #include "webkit/browser/fileapi/sandbox_file_system_backend.h" | 26 #include "storage/browser/fileapi/sandbox_file_system_backend.h" |
27 #include "webkit/browser/fileapi/sandbox_quota_observer.h" | 27 #include "storage/browser/fileapi/sandbox_quota_observer.h" |
28 #include "webkit/browser/quota/quota_manager_proxy.h" | 28 #include "storage/browser/quota/quota_manager_proxy.h" |
29 #include "webkit/common/fileapi/file_system_util.h" | 29 #include "storage/common/fileapi/file_system_util.h" |
30 | 30 |
31 namespace fileapi { | 31 namespace storage { |
32 | 32 |
33 namespace { | 33 namespace { |
34 | 34 |
35 const char kTemporaryOriginsCountLabel[] = "FileSystem.TemporaryOriginsCount"; | 35 const char kTemporaryOriginsCountLabel[] = "FileSystem.TemporaryOriginsCount"; |
36 const char kPersistentOriginsCountLabel[] = "FileSystem.PersistentOriginsCount"; | 36 const char kPersistentOriginsCountLabel[] = "FileSystem.PersistentOriginsCount"; |
37 | 37 |
38 const char kOpenFileSystemLabel[] = "FileSystem.OpenFileSystem"; | 38 const char kOpenFileSystemLabel[] = "FileSystem.OpenFileSystem"; |
39 const char kOpenFileSystemDetailLabel[] = "FileSystem.OpenFileSystemDetail"; | 39 const char kOpenFileSystemDetailLabel[] = "FileSystem.OpenFileSystemDetail"; |
40 const char kOpenFileSystemDetailNonThrottledLabel[] = | 40 const char kOpenFileSystemDetailNonThrottledLabel[] = |
41 "FileSystem.OpenFileSystemDetailNonthrottled"; | 41 "FileSystem.OpenFileSystemDetailNonthrottled"; |
42 int64 kMinimumStatsCollectionIntervalHours = 1; | 42 int64 kMinimumStatsCollectionIntervalHours = 1; |
43 | 43 |
44 // For type directory names in ObfuscatedFileUtil. | 44 // For type directory names in ObfuscatedFileUtil. |
45 // TODO(kinuko,nhiroki): Each type string registration should be done | 45 // TODO(kinuko,nhiroki): Each type string registration should be done |
46 // via its own backend. | 46 // via its own backend. |
47 const char kTemporaryDirectoryName[] = "t"; | 47 const char kTemporaryDirectoryName[] = "t"; |
48 const char kPersistentDirectoryName[] = "p"; | 48 const char kPersistentDirectoryName[] = "p"; |
49 const char kSyncableDirectoryName[] = "s"; | 49 const char kSyncableDirectoryName[] = "s"; |
50 | 50 |
51 const char* kPrepopulateTypes[] = { | 51 const char* kPrepopulateTypes[] = {kPersistentDirectoryName, |
52 kPersistentDirectoryName, | 52 kTemporaryDirectoryName}; |
53 kTemporaryDirectoryName | |
54 }; | |
55 | 53 |
56 enum FileSystemError { | 54 enum FileSystemError { |
57 kOK = 0, | 55 kOK = 0, |
58 kIncognito, | 56 kIncognito, |
59 kInvalidSchemeError, | 57 kInvalidSchemeError, |
60 kCreateDirectoryError, | 58 kCreateDirectoryError, |
61 kNotFound, | 59 kNotFound, |
62 kUnknownError, | 60 kUnknownError, |
63 kFileSystemErrorMax, | 61 kFileSystemErrorMax, |
64 }; | 62 }; |
65 | 63 |
66 // Restricted names. | 64 // Restricted names. |
67 // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions | 65 // http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#naming-restrictions |
68 const base::FilePath::CharType* const kRestrictedNames[] = { | 66 const base::FilePath::CharType* const kRestrictedNames[] = { |
69 FILE_PATH_LITERAL("."), FILE_PATH_LITERAL(".."), | 67 FILE_PATH_LITERAL("."), FILE_PATH_LITERAL(".."), |
70 }; | 68 }; |
71 | 69 |
72 // Restricted chars. | 70 // Restricted chars. |
73 const base::FilePath::CharType kRestrictedChars[] = { | 71 const base::FilePath::CharType kRestrictedChars[] = { |
74 FILE_PATH_LITERAL('/'), FILE_PATH_LITERAL('\\'), | 72 FILE_PATH_LITERAL('/'), FILE_PATH_LITERAL('\\'), |
75 }; | 73 }; |
76 | 74 |
77 std::string GetTypeStringForURL(const FileSystemURL& url) { | 75 std::string GetTypeStringForURL(const FileSystemURL& url) { |
78 return SandboxFileSystemBackendDelegate::GetTypeString(url.type()); | 76 return SandboxFileSystemBackendDelegate::GetTypeString(url.type()); |
79 } | 77 } |
80 | 78 |
81 std::set<std::string> GetKnownTypeStrings() { | 79 std::set<std::string> GetKnownTypeStrings() { |
82 std::set<std::string> known_type_strings; | 80 std::set<std::string> known_type_strings; |
83 known_type_strings.insert(kTemporaryDirectoryName); | 81 known_type_strings.insert(kTemporaryDirectoryName); |
84 known_type_strings.insert(kPersistentDirectoryName); | 82 known_type_strings.insert(kPersistentDirectoryName); |
85 known_type_strings.insert(kSyncableDirectoryName); | 83 known_type_strings.insert(kSyncableDirectoryName); |
86 return known_type_strings; | 84 return known_type_strings; |
87 } | 85 } |
88 | 86 |
89 class ObfuscatedOriginEnumerator | 87 class ObfuscatedOriginEnumerator |
90 : public SandboxFileSystemBackendDelegate::OriginEnumerator { | 88 : public SandboxFileSystemBackendDelegate::OriginEnumerator { |
91 public: | 89 public: |
92 explicit ObfuscatedOriginEnumerator(ObfuscatedFileUtil* file_util) { | 90 explicit ObfuscatedOriginEnumerator(ObfuscatedFileUtil* file_util) { |
93 enum_.reset(file_util->CreateOriginEnumerator()); | 91 enum_.reset(file_util->CreateOriginEnumerator()); |
94 } | 92 } |
95 virtual ~ObfuscatedOriginEnumerator() {} | 93 virtual ~ObfuscatedOriginEnumerator() {} |
96 | 94 |
97 virtual GURL Next() OVERRIDE { | 95 virtual GURL Next() OVERRIDE { return enum_->Next(); } |
98 return enum_->Next(); | |
99 } | |
100 | 96 |
101 virtual bool HasFileSystemType(FileSystemType type) const OVERRIDE { | 97 virtual bool HasFileSystemType(FileSystemType type) const OVERRIDE { |
102 return enum_->HasTypeDirectory( | 98 return enum_->HasTypeDirectory( |
103 SandboxFileSystemBackendDelegate::GetTypeString(type)); | 99 SandboxFileSystemBackendDelegate::GetTypeString(type)); |
104 } | 100 } |
105 | 101 |
106 private: | 102 private: |
107 scoped_ptr<ObfuscatedFileUtil::AbstractOriginEnumerator> enum_; | 103 scoped_ptr<ObfuscatedFileUtil::AbstractOriginEnumerator> enum_; |
108 }; | 104 }; |
109 | 105 |
110 void OpenFileSystemOnFileTaskRunner( | 106 void OpenFileSystemOnFileTaskRunner(ObfuscatedFileUtil* file_util, |
111 ObfuscatedFileUtil* file_util, | 107 const GURL& origin_url, |
112 const GURL& origin_url, | 108 FileSystemType type, |
113 FileSystemType type, | 109 OpenFileSystemMode mode, |
114 OpenFileSystemMode mode, | 110 base::File::Error* error_ptr) { |
115 base::File::Error* error_ptr) { | |
116 DCHECK(error_ptr); | 111 DCHECK(error_ptr); |
117 const bool create = (mode == OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT); | 112 const bool create = (mode == OPEN_FILE_SYSTEM_CREATE_IF_NONEXISTENT); |
118 file_util->GetDirectoryForOriginAndType( | 113 file_util->GetDirectoryForOriginAndType( |
119 origin_url, SandboxFileSystemBackendDelegate::GetTypeString(type), | 114 origin_url, |
120 create, error_ptr); | 115 SandboxFileSystemBackendDelegate::GetTypeString(type), |
| 116 create, |
| 117 error_ptr); |
121 if (*error_ptr != base::File::FILE_OK) { | 118 if (*error_ptr != base::File::FILE_OK) { |
122 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel, | 119 UMA_HISTOGRAM_ENUMERATION( |
123 kCreateDirectoryError, | 120 kOpenFileSystemLabel, kCreateDirectoryError, kFileSystemErrorMax); |
124 kFileSystemErrorMax); | |
125 } else { | 121 } else { |
126 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel, kOK, kFileSystemErrorMax); | 122 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel, kOK, kFileSystemErrorMax); |
127 } | 123 } |
128 // The reference of file_util will be derefed on the FILE thread | 124 // The reference of file_util will be derefed on the FILE thread |
129 // when the storage of this callback gets deleted regardless of whether | 125 // when the storage of this callback gets deleted regardless of whether |
130 // this method is called or not. | 126 // this method is called or not. |
131 } | 127 } |
132 | 128 |
133 void DidOpenFileSystem( | 129 void DidOpenFileSystem( |
134 base::WeakPtr<SandboxFileSystemBackendDelegate> delegate, | 130 base::WeakPtr<SandboxFileSystemBackendDelegate> delegate, |
135 const base::Callback<void(base::File::Error error)>& callback, | 131 const base::Callback<void(base::File::Error error)>& callback, |
136 base::File::Error* error) { | 132 base::File::Error* error) { |
137 if (delegate.get()) | 133 if (delegate.get()) |
138 delegate.get()->CollectOpenFileSystemMetrics(*error); | 134 delegate.get()->CollectOpenFileSystemMetrics(*error); |
139 callback.Run(*error); | 135 callback.Run(*error); |
140 } | 136 } |
141 | 137 |
142 template <typename T> | 138 template <typename T> |
143 void DeleteSoon(base::SequencedTaskRunner* runner, T* ptr) { | 139 void DeleteSoon(base::SequencedTaskRunner* runner, T* ptr) { |
144 if (!runner->DeleteSoon(FROM_HERE, ptr)) | 140 if (!runner->DeleteSoon(FROM_HERE, ptr)) |
145 delete ptr; | 141 delete ptr; |
146 } | 142 } |
147 | 143 |
148 } // namespace | 144 } // namespace |
149 | 145 |
150 const base::FilePath::CharType | 146 const base::FilePath::CharType |
151 SandboxFileSystemBackendDelegate::kFileSystemDirectory[] = | 147 SandboxFileSystemBackendDelegate::kFileSystemDirectory[] = |
152 FILE_PATH_LITERAL("File System"); | 148 FILE_PATH_LITERAL("File System"); |
153 | 149 |
154 // static | 150 // static |
155 std::string SandboxFileSystemBackendDelegate::GetTypeString( | 151 std::string SandboxFileSystemBackendDelegate::GetTypeString( |
156 FileSystemType type) { | 152 FileSystemType type) { |
157 switch (type) { | 153 switch (type) { |
158 case kFileSystemTypeTemporary: | 154 case kFileSystemTypeTemporary: |
159 return kTemporaryDirectoryName; | 155 return kTemporaryDirectoryName; |
160 case kFileSystemTypePersistent: | 156 case kFileSystemTypePersistent: |
161 return kPersistentDirectoryName; | 157 return kPersistentDirectoryName; |
162 case kFileSystemTypeSyncable: | 158 case kFileSystemTypeSyncable: |
163 case kFileSystemTypeSyncableForInternalSync: | 159 case kFileSystemTypeSyncableForInternalSync: |
164 return kSyncableDirectoryName; | 160 return kSyncableDirectoryName; |
165 case kFileSystemTypeUnknown: | 161 case kFileSystemTypeUnknown: |
166 default: | 162 default: |
167 NOTREACHED() << "Unknown filesystem type requested:" << type; | 163 NOTREACHED() << "Unknown filesystem type requested:" << type; |
168 return std::string(); | 164 return std::string(); |
169 } | 165 } |
170 } | 166 } |
171 | 167 |
172 SandboxFileSystemBackendDelegate::SandboxFileSystemBackendDelegate( | 168 SandboxFileSystemBackendDelegate::SandboxFileSystemBackendDelegate( |
173 quota::QuotaManagerProxy* quota_manager_proxy, | 169 quota::QuotaManagerProxy* quota_manager_proxy, |
174 base::SequencedTaskRunner* file_task_runner, | 170 base::SequencedTaskRunner* file_task_runner, |
175 const base::FilePath& profile_path, | 171 const base::FilePath& profile_path, |
176 quota::SpecialStoragePolicy* special_storage_policy, | 172 quota::SpecialStoragePolicy* special_storage_policy, |
177 const FileSystemOptions& file_system_options) | 173 const FileSystemOptions& file_system_options) |
178 : file_task_runner_(file_task_runner), | 174 : file_task_runner_(file_task_runner), |
179 sandbox_file_util_(new AsyncFileUtilAdapter( | 175 sandbox_file_util_(new AsyncFileUtilAdapter( |
180 new ObfuscatedFileUtil( | 176 new ObfuscatedFileUtil(special_storage_policy, |
181 special_storage_policy, | 177 profile_path.Append(kFileSystemDirectory), |
182 profile_path.Append(kFileSystemDirectory), | 178 file_system_options.env_override(), |
183 file_system_options.env_override(), | 179 file_task_runner, |
184 file_task_runner, | 180 base::Bind(&GetTypeStringForURL), |
185 base::Bind(&GetTypeStringForURL), | 181 GetKnownTypeStrings(), |
186 GetKnownTypeStrings(), | 182 this))), |
187 this))), | |
188 file_system_usage_cache_(new FileSystemUsageCache(file_task_runner)), | 183 file_system_usage_cache_(new FileSystemUsageCache(file_task_runner)), |
189 quota_observer_(new SandboxQuotaObserver( | 184 quota_observer_(new SandboxQuotaObserver(quota_manager_proxy, |
190 quota_manager_proxy, | 185 file_task_runner, |
191 file_task_runner, | 186 obfuscated_file_util(), |
192 obfuscated_file_util(), | 187 usage_cache())), |
193 usage_cache())), | |
194 quota_reservation_manager_(new QuotaReservationManager( | 188 quota_reservation_manager_(new QuotaReservationManager( |
195 scoped_ptr<QuotaReservationManager::QuotaBackend>( | 189 scoped_ptr<QuotaReservationManager::QuotaBackend>( |
196 new QuotaBackendImpl(file_task_runner_, | 190 new QuotaBackendImpl(file_task_runner_, |
197 obfuscated_file_util(), | 191 obfuscated_file_util(), |
198 usage_cache(), | 192 usage_cache(), |
199 quota_manager_proxy)))), | 193 quota_manager_proxy)))), |
200 special_storage_policy_(special_storage_policy), | 194 special_storage_policy_(special_storage_policy), |
201 file_system_options_(file_system_options), | 195 file_system_options_(file_system_options), |
202 is_filesystem_opened_(false), | 196 is_filesystem_opened_(false), |
203 weak_factory_(this) { | 197 weak_factory_(this) { |
204 // Prepopulate database only if it can run asynchronously (i.e. the current | 198 // Prepopulate database only if it can run asynchronously (i.e. the current |
205 // thread is not file_task_runner). Usually this is the case but may not | 199 // thread is not file_task_runner). Usually this is the case but may not |
206 // in test code. | 200 // in test code. |
207 if (!file_system_options.is_incognito() && | 201 if (!file_system_options.is_incognito() && |
208 !file_task_runner_->RunsTasksOnCurrentThread()) { | 202 !file_task_runner_->RunsTasksOnCurrentThread()) { |
209 std::vector<std::string> types_to_prepopulate( | 203 std::vector<std::string> types_to_prepopulate( |
210 &kPrepopulateTypes[0], | 204 &kPrepopulateTypes[0], |
211 &kPrepopulateTypes[arraysize(kPrepopulateTypes)]); | 205 &kPrepopulateTypes[arraysize(kPrepopulateTypes)]); |
212 file_task_runner_->PostTask( | 206 file_task_runner_->PostTask( |
213 FROM_HERE, | 207 FROM_HERE, |
214 base::Bind(&ObfuscatedFileUtil::MaybePrepopulateDatabase, | 208 base::Bind(&ObfuscatedFileUtil::MaybePrepopulateDatabase, |
215 base::Unretained(obfuscated_file_util()), | 209 base::Unretained(obfuscated_file_util()), |
216 types_to_prepopulate)); | 210 types_to_prepopulate)); |
217 } | 211 } |
218 } | 212 } |
219 | 213 |
220 SandboxFileSystemBackendDelegate::~SandboxFileSystemBackendDelegate() { | 214 SandboxFileSystemBackendDelegate::~SandboxFileSystemBackendDelegate() { |
221 io_thread_checker_.DetachFromThread(); | 215 io_thread_checker_.DetachFromThread(); |
222 | 216 |
223 if (!file_task_runner_->RunsTasksOnCurrentThread()) { | 217 if (!file_task_runner_->RunsTasksOnCurrentThread()) { |
224 DeleteSoon(file_task_runner_.get(), quota_reservation_manager_.release()); | 218 DeleteSoon(file_task_runner_.get(), quota_reservation_manager_.release()); |
225 DeleteSoon(file_task_runner_.get(), sandbox_file_util_.release()); | 219 DeleteSoon(file_task_runner_.get(), sandbox_file_util_.release()); |
226 DeleteSoon(file_task_runner_.get(), quota_observer_.release()); | 220 DeleteSoon(file_task_runner_.get(), quota_observer_.release()); |
(...skipping 29 matching lines...) Expand all Loading... |
256 callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); | 250 callback.Run(GURL(), std::string(), base::File::FILE_ERROR_SECURITY); |
257 return; | 251 return; |
258 } | 252 } |
259 | 253 |
260 std::string name = GetFileSystemName(origin_url, type); | 254 std::string name = GetFileSystemName(origin_url, type); |
261 | 255 |
262 base::File::Error* error_ptr = new base::File::Error; | 256 base::File::Error* error_ptr = new base::File::Error; |
263 file_task_runner_->PostTaskAndReply( | 257 file_task_runner_->PostTaskAndReply( |
264 FROM_HERE, | 258 FROM_HERE, |
265 base::Bind(&OpenFileSystemOnFileTaskRunner, | 259 base::Bind(&OpenFileSystemOnFileTaskRunner, |
266 obfuscated_file_util(), origin_url, type, mode, | 260 obfuscated_file_util(), |
| 261 origin_url, |
| 262 type, |
| 263 mode, |
267 base::Unretained(error_ptr)), | 264 base::Unretained(error_ptr)), |
268 base::Bind(&DidOpenFileSystem, | 265 base::Bind(&DidOpenFileSystem, |
269 weak_factory_.GetWeakPtr(), | 266 weak_factory_.GetWeakPtr(), |
270 base::Bind(callback, root_url, name), | 267 base::Bind(callback, root_url, name), |
271 base::Owned(error_ptr))); | 268 base::Owned(error_ptr))); |
272 | 269 |
273 io_thread_checker_.DetachFromThread(); | 270 io_thread_checker_.DetachFromThread(); |
274 is_filesystem_opened_ = true; | 271 is_filesystem_opened_ = true; |
275 } | 272 } |
276 | 273 |
(...skipping 13 matching lines...) Expand all Loading... |
290 | 287 |
291 scoped_ptr<FileSystemOperationContext> operation_context( | 288 scoped_ptr<FileSystemOperationContext> operation_context( |
292 new FileSystemOperationContext(context)); | 289 new FileSystemOperationContext(context)); |
293 operation_context->set_update_observers(*update_observers); | 290 operation_context->set_update_observers(*update_observers); |
294 operation_context->set_change_observers( | 291 operation_context->set_change_observers( |
295 change_observers ? *change_observers : ChangeObserverList()); | 292 change_observers ? *change_observers : ChangeObserverList()); |
296 | 293 |
297 return operation_context.Pass(); | 294 return operation_context.Pass(); |
298 } | 295 } |
299 | 296 |
300 scoped_ptr<webkit_blob::FileStreamReader> | 297 scoped_ptr<storage::FileStreamReader> |
301 SandboxFileSystemBackendDelegate::CreateFileStreamReader( | 298 SandboxFileSystemBackendDelegate::CreateFileStreamReader( |
302 const FileSystemURL& url, | 299 const FileSystemURL& url, |
303 int64 offset, | 300 int64 offset, |
304 const base::Time& expected_modification_time, | 301 const base::Time& expected_modification_time, |
305 FileSystemContext* context) const { | 302 FileSystemContext* context) const { |
306 if (!IsAccessValid(url)) | 303 if (!IsAccessValid(url)) |
307 return scoped_ptr<webkit_blob::FileStreamReader>(); | 304 return scoped_ptr<storage::FileStreamReader>(); |
308 return scoped_ptr<webkit_blob::FileStreamReader>( | 305 return scoped_ptr<storage::FileStreamReader>( |
309 webkit_blob::FileStreamReader::CreateForFileSystemFile( | 306 storage::FileStreamReader::CreateForFileSystemFile( |
310 context, url, offset, expected_modification_time)); | 307 context, url, offset, expected_modification_time)); |
311 } | 308 } |
312 | 309 |
313 scoped_ptr<FileStreamWriter> | 310 scoped_ptr<FileStreamWriter> |
314 SandboxFileSystemBackendDelegate::CreateFileStreamWriter( | 311 SandboxFileSystemBackendDelegate::CreateFileStreamWriter( |
315 const FileSystemURL& url, | 312 const FileSystemURL& url, |
316 int64 offset, | 313 int64 offset, |
317 FileSystemContext* context, | 314 FileSystemContext* context, |
318 FileSystemType type) const { | 315 FileSystemType type) const { |
319 if (!IsAccessValid(url)) | 316 if (!IsAccessValid(url)) |
320 return scoped_ptr<FileStreamWriter>(); | 317 return scoped_ptr<FileStreamWriter>(); |
321 const UpdateObserverList* observers = GetUpdateObservers(type); | 318 const UpdateObserverList* observers = GetUpdateObservers(type); |
322 DCHECK(observers); | 319 DCHECK(observers); |
323 return scoped_ptr<FileStreamWriter>( | 320 return scoped_ptr<FileStreamWriter>( |
324 new SandboxFileStreamWriter(context, url, offset, *observers)); | 321 new SandboxFileStreamWriter(context, url, offset, *observers)); |
325 } | 322 } |
326 | 323 |
327 base::File::Error | 324 base::File::Error |
328 SandboxFileSystemBackendDelegate::DeleteOriginDataOnFileTaskRunner( | 325 SandboxFileSystemBackendDelegate::DeleteOriginDataOnFileTaskRunner( |
329 FileSystemContext* file_system_context, | 326 FileSystemContext* file_system_context, |
330 quota::QuotaManagerProxy* proxy, | 327 quota::QuotaManagerProxy* proxy, |
331 const GURL& origin_url, | 328 const GURL& origin_url, |
332 FileSystemType type) { | 329 FileSystemType type) { |
333 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); | 330 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
334 int64 usage = GetOriginUsageOnFileTaskRunner( | 331 int64 usage = |
335 file_system_context, origin_url, type); | 332 GetOriginUsageOnFileTaskRunner(file_system_context, origin_url, type); |
336 usage_cache()->CloseCacheFiles(); | 333 usage_cache()->CloseCacheFiles(); |
337 bool result = obfuscated_file_util()->DeleteDirectoryForOriginAndType( | 334 bool result = obfuscated_file_util()->DeleteDirectoryForOriginAndType( |
338 origin_url, GetTypeString(type)); | 335 origin_url, GetTypeString(type)); |
339 if (result && proxy) { | 336 if (result && proxy) { |
340 proxy->NotifyStorageModified( | 337 proxy->NotifyStorageModified(quota::QuotaClient::kFileSystem, |
341 quota::QuotaClient::kFileSystem, | 338 origin_url, |
342 origin_url, | 339 FileSystemTypeToQuotaStorageType(type), |
343 FileSystemTypeToQuotaStorageType(type), | 340 -usage); |
344 -usage); | |
345 } | 341 } |
346 | 342 |
347 if (result) | 343 if (result) |
348 return base::File::FILE_OK; | 344 return base::File::FILE_OK; |
349 return base::File::FILE_ERROR_FAILED; | 345 return base::File::FILE_ERROR_FAILED; |
350 } | 346 } |
351 | 347 |
352 void SandboxFileSystemBackendDelegate::GetOriginsForTypeOnFileTaskRunner( | 348 void SandboxFileSystemBackendDelegate::GetOriginsForTypeOnFileTaskRunner( |
353 FileSystemType type, std::set<GURL>* origins) { | 349 FileSystemType type, |
| 350 std::set<GURL>* origins) { |
354 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); | 351 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
355 DCHECK(origins); | 352 DCHECK(origins); |
356 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); | 353 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); |
357 GURL origin; | 354 GURL origin; |
358 while (!(origin = enumerator->Next()).is_empty()) { | 355 while (!(origin = enumerator->Next()).is_empty()) { |
359 if (enumerator->HasFileSystemType(type)) | 356 if (enumerator->HasFileSystemType(type)) |
360 origins->insert(origin); | 357 origins->insert(origin); |
361 } | 358 } |
362 switch (type) { | 359 switch (type) { |
363 case kFileSystemTypeTemporary: | 360 case kFileSystemTypeTemporary: |
364 UMA_HISTOGRAM_COUNTS(kTemporaryOriginsCountLabel, origins->size()); | 361 UMA_HISTOGRAM_COUNTS(kTemporaryOriginsCountLabel, origins->size()); |
365 break; | 362 break; |
366 case kFileSystemTypePersistent: | 363 case kFileSystemTypePersistent: |
367 UMA_HISTOGRAM_COUNTS(kPersistentOriginsCountLabel, origins->size()); | 364 UMA_HISTOGRAM_COUNTS(kPersistentOriginsCountLabel, origins->size()); |
368 break; | 365 break; |
369 default: | 366 default: |
370 break; | 367 break; |
371 } | 368 } |
372 } | 369 } |
373 | 370 |
374 void SandboxFileSystemBackendDelegate::GetOriginsForHostOnFileTaskRunner( | 371 void SandboxFileSystemBackendDelegate::GetOriginsForHostOnFileTaskRunner( |
375 FileSystemType type, const std::string& host, | 372 FileSystemType type, |
| 373 const std::string& host, |
376 std::set<GURL>* origins) { | 374 std::set<GURL>* origins) { |
377 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); | 375 DCHECK(file_task_runner_->RunsTasksOnCurrentThread()); |
378 DCHECK(origins); | 376 DCHECK(origins); |
379 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); | 377 scoped_ptr<OriginEnumerator> enumerator(CreateOriginEnumerator()); |
380 GURL origin; | 378 GURL origin; |
381 while (!(origin = enumerator->Next()).is_empty()) { | 379 while (!(origin = enumerator->Next()).is_empty()) { |
382 if (host == net::GetHostOrSpecFromURL(origin) && | 380 if (host == net::GetHostOrSpecFromURL(origin) && |
383 enumerator->HasFileSystemType(type)) | 381 enumerator->HasFileSystemType(type)) |
384 origins->insert(origin); | 382 origins->insert(origin); |
385 } | 383 } |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
592 if (*error_out != base::File::FILE_OK) | 590 if (*error_out != base::File::FILE_OK) |
593 return base::FilePath(); | 591 return base::FilePath(); |
594 return base_path.Append(FileSystemUsageCache::kUsageFileName); | 592 return base_path.Append(FileSystemUsageCache::kUsageFileName); |
595 } | 593 } |
596 | 594 |
597 int64 SandboxFileSystemBackendDelegate::RecalculateUsage( | 595 int64 SandboxFileSystemBackendDelegate::RecalculateUsage( |
598 FileSystemContext* context, | 596 FileSystemContext* context, |
599 const GURL& origin, | 597 const GURL& origin, |
600 FileSystemType type) { | 598 FileSystemType type) { |
601 FileSystemOperationContext operation_context(context); | 599 FileSystemOperationContext operation_context(context); |
602 FileSystemURL url = context->CreateCrackedFileSystemURL( | 600 FileSystemURL url = |
603 origin, type, base::FilePath()); | 601 context->CreateCrackedFileSystemURL(origin, type, base::FilePath()); |
604 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> enumerator( | 602 scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> enumerator( |
605 obfuscated_file_util()->CreateFileEnumerator( | 603 obfuscated_file_util()->CreateFileEnumerator( |
606 &operation_context, url, true)); | 604 &operation_context, url, true)); |
607 | 605 |
608 base::FilePath file_path_each; | 606 base::FilePath file_path_each; |
609 int64 usage = 0; | 607 int64 usage = 0; |
610 | 608 |
611 while (!(file_path_each = enumerator->Next()).empty()) { | 609 while (!(file_path_each = enumerator->Next()).empty()) { |
612 usage += enumerator->Size(); | 610 usage += enumerator->Size(); |
613 usage += ObfuscatedFileUtil::ComputeFilePathCost(file_path_each); | 611 usage += ObfuscatedFileUtil::ComputeFilePathCost(file_path_each); |
614 } | 612 } |
615 | 613 |
616 return usage; | 614 return usage; |
617 } | 615 } |
618 | 616 |
619 void SandboxFileSystemBackendDelegate::CollectOpenFileSystemMetrics( | 617 void SandboxFileSystemBackendDelegate::CollectOpenFileSystemMetrics( |
620 base::File::Error error_code) { | 618 base::File::Error error_code) { |
621 base::Time now = base::Time::Now(); | 619 base::Time now = base::Time::Now(); |
622 bool throttled = now < next_release_time_for_open_filesystem_stat_; | 620 bool throttled = now < next_release_time_for_open_filesystem_stat_; |
623 if (!throttled) { | 621 if (!throttled) { |
624 next_release_time_for_open_filesystem_stat_ = | 622 next_release_time_for_open_filesystem_stat_ = |
625 now + base::TimeDelta::FromHours(kMinimumStatsCollectionIntervalHours); | 623 now + base::TimeDelta::FromHours(kMinimumStatsCollectionIntervalHours); |
626 } | 624 } |
627 | 625 |
628 #define REPORT(report_value) \ | 626 #define REPORT(report_value) \ |
629 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemDetailLabel, \ | 627 UMA_HISTOGRAM_ENUMERATION( \ |
630 (report_value), \ | 628 kOpenFileSystemDetailLabel, (report_value), kFileSystemErrorMax); \ |
631 kFileSystemErrorMax); \ | |
632 if (!throttled) { \ | 629 if (!throttled) { \ |
633 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemDetailNonThrottledLabel, \ | 630 UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemDetailNonThrottledLabel, \ |
634 (report_value), \ | 631 (report_value), \ |
635 kFileSystemErrorMax); \ | 632 kFileSystemErrorMax); \ |
636 } | 633 } |
637 | 634 |
638 switch (error_code) { | 635 switch (error_code) { |
639 case base::File::FILE_OK: | 636 case base::File::FILE_OK: |
640 REPORT(kOK); | 637 REPORT(kOK); |
641 break; | 638 break; |
(...skipping 24 matching lines...) Expand all Loading... |
666 base::SequencedTaskRunner* file_task_runner) { | 663 base::SequencedTaskRunner* file_task_runner) { |
667 return new ObfuscatedFileUtil(special_storage_policy, | 664 return new ObfuscatedFileUtil(special_storage_policy, |
668 file_system_directory, | 665 file_system_directory, |
669 env_override, | 666 env_override, |
670 file_task_runner, | 667 file_task_runner, |
671 base::Bind(&GetTypeStringForURL), | 668 base::Bind(&GetTypeStringForURL), |
672 GetKnownTypeStrings(), | 669 GetKnownTypeStrings(), |
673 NULL); | 670 NULL); |
674 } | 671 } |
675 | 672 |
676 } // namespace fileapi | 673 } // namespace storage |
OLD | NEW |