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

Side by Side Diff: storage/browser/fileapi/sandbox_file_system_backend_delegate.cc

Issue 442383002: Move storage-related files from webkit/ to new top-level directory storage/ (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698