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

Side by Side Diff: storage/browser/fileapi/isolated_context.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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/isolated_context.h" 5 #include "storage/browser/fileapi/isolated_context.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/files/file_path.h" 8 #include "base/files/file_path.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/rand_util.h" 10 #include "base/rand_util.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 #include "base/strings/string_number_conversions.h" 12 #include "base/strings/string_number_conversions.h"
13 #include "base/strings/string_util.h" 13 #include "base/strings/string_util.h"
14 #include "base/strings/stringprintf.h" 14 #include "base/strings/stringprintf.h"
15 #include "webkit/browser/fileapi/file_system_url.h" 15 #include "storage/browser/fileapi/file_system_url.h"
16 16
17 namespace fileapi { 17 namespace storage {
18 18
19 namespace { 19 namespace {
20 20
21 base::FilePath::StringType GetRegisterNameForPath(const base::FilePath& path) { 21 base::FilePath::StringType GetRegisterNameForPath(const base::FilePath& path) {
22 // If it's not a root path simply return a base name. 22 // If it's not a root path simply return a base name.
23 if (path.DirName() != path) 23 if (path.DirName() != path)
24 return path.BaseName().value(); 24 return path.BaseName().value();
25 25
26 #if defined(FILE_PATH_USES_DRIVE_LETTERS) 26 #if defined(FILE_PATH_USES_DRIVE_LETTERS)
27 base::FilePath::StringType name; 27 base::FilePath::StringType name;
(...skipping 17 matching lines...) Expand all
45 // As of writing dragged file system is the only filesystem which could have 45 // As of writing dragged file system is the only filesystem which could have
46 // multiple top-level paths. 46 // multiple top-level paths.
47 return type != kFileSystemTypeDragged; 47 return type != kFileSystemTypeDragged;
48 } 48 }
49 49
50 static base::LazyInstance<IsolatedContext>::Leaky g_isolated_context = 50 static base::LazyInstance<IsolatedContext>::Leaky g_isolated_context =
51 LAZY_INSTANCE_INITIALIZER; 51 LAZY_INSTANCE_INITIALIZER;
52 52
53 } // namespace 53 } // namespace
54 54
55 IsolatedContext::FileInfoSet::FileInfoSet() {} 55 IsolatedContext::FileInfoSet::FileInfoSet() {
56 IsolatedContext::FileInfoSet::~FileInfoSet() {} 56 }
57 IsolatedContext::FileInfoSet::~FileInfoSet() {
58 }
57 59
58 bool IsolatedContext::FileInfoSet::AddPath( 60 bool IsolatedContext::FileInfoSet::AddPath(const base::FilePath& path,
59 const base::FilePath& path, std::string* registered_name) { 61 std::string* registered_name) {
60 // The given path should not contain any '..' and should be absolute. 62 // The given path should not contain any '..' and should be absolute.
61 if (path.ReferencesParent() || !path.IsAbsolute()) 63 if (path.ReferencesParent() || !path.IsAbsolute())
62 return false; 64 return false;
63 base::FilePath::StringType name = GetRegisterNameForPath(path); 65 base::FilePath::StringType name = GetRegisterNameForPath(path);
64 std::string utf8name = base::FilePath(name).AsUTF8Unsafe(); 66 std::string utf8name = base::FilePath(name).AsUTF8Unsafe();
65 base::FilePath normalized_path = path.NormalizePathSeparators(); 67 base::FilePath normalized_path = path.NormalizePathSeparators();
66 bool inserted = 68 bool inserted =
67 fileset_.insert(MountPointInfo(utf8name, normalized_path)).second; 69 fileset_.insert(MountPointInfo(utf8name, normalized_path)).second;
68 if (!inserted) { 70 if (!inserted) {
69 int suffix = 1; 71 int suffix = 1;
70 std::string basepart = 72 std::string basepart =
71 base::FilePath(name).RemoveExtension().AsUTF8Unsafe(); 73 base::FilePath(name).RemoveExtension().AsUTF8Unsafe();
72 std::string ext = 74 std::string ext =
73 base::FilePath(base::FilePath(name).Extension()).AsUTF8Unsafe(); 75 base::FilePath(base::FilePath(name).Extension()).AsUTF8Unsafe();
74 while (!inserted) { 76 while (!inserted) {
75 utf8name = base::StringPrintf("%s (%d)", basepart.c_str(), suffix++); 77 utf8name = base::StringPrintf("%s (%d)", basepart.c_str(), suffix++);
76 if (!ext.empty()) 78 if (!ext.empty())
77 utf8name.append(ext); 79 utf8name.append(ext);
78 inserted = 80 inserted =
79 fileset_.insert(MountPointInfo(utf8name, normalized_path)).second; 81 fileset_.insert(MountPointInfo(utf8name, normalized_path)).second;
80 } 82 }
81 } 83 }
82 if (registered_name) 84 if (registered_name)
83 *registered_name = utf8name; 85 *registered_name = utf8name;
84 return true; 86 return true;
85 } 87 }
86 88
87 bool IsolatedContext::FileInfoSet::AddPathWithName( 89 bool IsolatedContext::FileInfoSet::AddPathWithName(const base::FilePath& path,
88 const base::FilePath& path, const std::string& name) { 90 const std::string& name) {
89 // The given path should not contain any '..' and should be absolute. 91 // The given path should not contain any '..' and should be absolute.
90 if (path.ReferencesParent() || !path.IsAbsolute()) 92 if (path.ReferencesParent() || !path.IsAbsolute())
91 return false; 93 return false;
92 return fileset_.insert( 94 return fileset_.insert(MountPointInfo(name, path.NormalizePathSeparators()))
93 MountPointInfo(name, path.NormalizePathSeparators())).second; 95 .second;
94 } 96 }
95 97
96 //-------------------------------------------------------------------------- 98 //--------------------------------------------------------------------------
97 99
98 class IsolatedContext::Instance { 100 class IsolatedContext::Instance {
99 public: 101 public:
100 enum PathType { 102 enum PathType { PLATFORM_PATH, VIRTUAL_PATH };
101 PLATFORM_PATH,
102 VIRTUAL_PATH
103 };
104 103
105 // For a single-path isolated file system, which could be registered by 104 // For a single-path isolated file system, which could be registered by
106 // IsolatedContext::RegisterFileSystemForPath() or 105 // IsolatedContext::RegisterFileSystemForPath() or
107 // IsolatedContext::RegisterFileSystemForVirtualPath(). 106 // IsolatedContext::RegisterFileSystemForVirtualPath().
108 // Most of isolated file system contexts should be of this type. 107 // Most of isolated file system contexts should be of this type.
109 Instance(FileSystemType type, 108 Instance(FileSystemType type,
110 const std::string& filesystem_id, 109 const std::string& filesystem_id,
111 const MountPointInfo& file_info, 110 const MountPointInfo& file_info,
112 PathType path_type); 111 PathType path_type);
113 112
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 : type_(type), 156 : type_(type),
158 filesystem_id_(filesystem_id), 157 filesystem_id_(filesystem_id),
159 file_info_(file_info), 158 file_info_(file_info),
160 path_type_(path_type), 159 path_type_(path_type),
161 ref_counts_(0) { 160 ref_counts_(0) {
162 DCHECK(IsSinglePathIsolatedFileSystem(type_)); 161 DCHECK(IsSinglePathIsolatedFileSystem(type_));
163 } 162 }
164 163
165 IsolatedContext::Instance::Instance(FileSystemType type, 164 IsolatedContext::Instance::Instance(FileSystemType type,
166 const std::set<MountPointInfo>& files) 165 const std::set<MountPointInfo>& files)
167 : type_(type), 166 : type_(type), path_type_(PLATFORM_PATH), files_(files), ref_counts_(0) {
168 path_type_(PLATFORM_PATH),
169 files_(files),
170 ref_counts_(0) {
171 DCHECK(!IsSinglePathIsolatedFileSystem(type_)); 167 DCHECK(!IsSinglePathIsolatedFileSystem(type_));
172 } 168 }
173 169
174 IsolatedContext::Instance::~Instance() {} 170 IsolatedContext::Instance::~Instance() {
171 }
175 172
176 bool IsolatedContext::Instance::ResolvePathForName(const std::string& name, 173 bool IsolatedContext::Instance::ResolvePathForName(const std::string& name,
177 base::FilePath* path) const { 174 base::FilePath* path) const {
178 if (IsSinglePathIsolatedFileSystem(type_)) { 175 if (IsSinglePathIsolatedFileSystem(type_)) {
179 switch (path_type_) { 176 switch (path_type_) {
180 case PLATFORM_PATH: 177 case PLATFORM_PATH:
181 *path = file_info_.path; 178 *path = file_info_.path;
182 break; 179 break;
183 case VIRTUAL_PATH: 180 case VIRTUAL_PATH:
184 *path = base::FilePath(); 181 *path = base::FilePath();
185 break; 182 break;
186 default: 183 default:
187 NOTREACHED(); 184 NOTREACHED();
188 } 185 }
189 186
190 return file_info_.name == name; 187 return file_info_.name == name;
191 } 188 }
192 std::set<MountPointInfo>::const_iterator found = files_.find( 189 std::set<MountPointInfo>::const_iterator found =
193 MountPointInfo(name, base::FilePath())); 190 files_.find(MountPointInfo(name, base::FilePath()));
194 if (found == files_.end()) 191 if (found == files_.end())
195 return false; 192 return false;
196 *path = found->path; 193 *path = found->path;
197 return true; 194 return true;
198 } 195 }
199 196
200 bool IsolatedContext::Instance::IsSinglePathInstance() const { 197 bool IsolatedContext::Instance::IsSinglePathInstance() const {
201 return IsSinglePathIsolatedFileSystem(type_); 198 return IsSinglePathIsolatedFileSystem(type_);
202 } 199 }
203 200
204 //-------------------------------------------------------------------------- 201 //--------------------------------------------------------------------------
205 202
206 // static 203 // static
207 IsolatedContext* IsolatedContext::GetInstance() { 204 IsolatedContext* IsolatedContext::GetInstance() {
208 return g_isolated_context.Pointer(); 205 return g_isolated_context.Pointer();
209 } 206 }
210 207
211 // static 208 // static
212 bool IsolatedContext::IsIsolatedType(FileSystemType type) { 209 bool IsolatedContext::IsIsolatedType(FileSystemType type) {
213 return type == kFileSystemTypeIsolated || type == kFileSystemTypeExternal; 210 return type == kFileSystemTypeIsolated || type == kFileSystemTypeExternal;
214 } 211 }
215 212
216 std::string IsolatedContext::RegisterDraggedFileSystem( 213 std::string IsolatedContext::RegisterDraggedFileSystem(
217 const FileInfoSet& files) { 214 const FileInfoSet& files) {
218 base::AutoLock locker(lock_); 215 base::AutoLock locker(lock_);
219 std::string filesystem_id = GetNewFileSystemId(); 216 std::string filesystem_id = GetNewFileSystemId();
220 instance_map_[filesystem_id] = new Instance( 217 instance_map_[filesystem_id] =
221 kFileSystemTypeDragged, files.fileset()); 218 new Instance(kFileSystemTypeDragged, files.fileset());
222 return filesystem_id; 219 return filesystem_id;
223 } 220 }
224 221
225 std::string IsolatedContext::RegisterFileSystemForPath( 222 std::string IsolatedContext::RegisterFileSystemForPath(
226 FileSystemType type, 223 FileSystemType type,
227 const std::string& filesystem_id, 224 const std::string& filesystem_id,
228 const base::FilePath& path_in, 225 const base::FilePath& path_in,
229 std::string* register_name) { 226 std::string* register_name) {
230 base::FilePath path(path_in.NormalizePathSeparators()); 227 base::FilePath path(path_in.NormalizePathSeparators());
231 if (path.ReferencesParent() || !path.IsAbsolute()) 228 if (path.ReferencesParent() || !path.IsAbsolute())
232 return std::string(); 229 return std::string();
233 std::string name; 230 std::string name;
234 if (register_name && !register_name->empty()) { 231 if (register_name && !register_name->empty()) {
235 name = *register_name; 232 name = *register_name;
236 } else { 233 } else {
237 name = base::FilePath(GetRegisterNameForPath(path)).AsUTF8Unsafe(); 234 name = base::FilePath(GetRegisterNameForPath(path)).AsUTF8Unsafe();
238 if (register_name) 235 if (register_name)
239 register_name->assign(name); 236 register_name->assign(name);
240 } 237 }
241 238
242 base::AutoLock locker(lock_); 239 base::AutoLock locker(lock_);
243 std::string new_id = GetNewFileSystemId(); 240 std::string new_id = GetNewFileSystemId();
244 instance_map_[new_id] = new Instance(type, filesystem_id, 241 instance_map_[new_id] = new Instance(
245 MountPointInfo(name, path), 242 type, filesystem_id, MountPointInfo(name, path), Instance::PLATFORM_PATH);
246 Instance::PLATFORM_PATH);
247 path_to_id_map_[path].insert(new_id); 243 path_to_id_map_[path].insert(new_id);
248 return new_id; 244 return new_id;
249 } 245 }
250 246
251 std::string IsolatedContext::RegisterFileSystemForVirtualPath( 247 std::string IsolatedContext::RegisterFileSystemForVirtualPath(
252 FileSystemType type, 248 FileSystemType type,
253 const std::string& register_name, 249 const std::string& register_name,
254 const base::FilePath& cracked_path_prefix) { 250 const base::FilePath& cracked_path_prefix) {
255 base::AutoLock locker(lock_); 251 base::AutoLock locker(lock_);
256 base::FilePath path(cracked_path_prefix.NormalizePathSeparators()); 252 base::FilePath path(cracked_path_prefix.NormalizePathSeparators());
257 if (path.ReferencesParent()) 253 if (path.ReferencesParent())
258 return std::string(); 254 return std::string();
259 std::string filesystem_id = GetNewFileSystemId(); 255 std::string filesystem_id = GetNewFileSystemId();
260 instance_map_[filesystem_id] = new Instance( 256 instance_map_[filesystem_id] =
261 type, 257 new Instance(type,
262 std::string(), // filesystem_id 258 std::string(), // filesystem_id
263 MountPointInfo(register_name, cracked_path_prefix), 259 MountPointInfo(register_name, cracked_path_prefix),
264 Instance::VIRTUAL_PATH); 260 Instance::VIRTUAL_PATH);
265 path_to_id_map_[path].insert(filesystem_id); 261 path_to_id_map_[path].insert(filesystem_id);
266 return filesystem_id; 262 return filesystem_id;
267 } 263 }
268 264
269 bool IsolatedContext::HandlesFileSystemMountType(FileSystemType type) const { 265 bool IsolatedContext::HandlesFileSystemMountType(FileSystemType type) const {
270 return type == kFileSystemTypeIsolated; 266 return type == kFileSystemTypeIsolated;
271 } 267 }
272 268
273 bool IsolatedContext::RevokeFileSystem(const std::string& filesystem_id) { 269 bool IsolatedContext::RevokeFileSystem(const std::string& filesystem_id) {
274 base::AutoLock locker(lock_); 270 base::AutoLock locker(lock_);
275 return UnregisterFileSystem(filesystem_id); 271 return UnregisterFileSystem(filesystem_id);
276 } 272 }
277 273
278 bool IsolatedContext::GetRegisteredPath( 274 bool IsolatedContext::GetRegisteredPath(const std::string& filesystem_id,
279 const std::string& filesystem_id, base::FilePath* path) const { 275 base::FilePath* path) const {
280 DCHECK(path); 276 DCHECK(path);
281 base::AutoLock locker(lock_); 277 base::AutoLock locker(lock_);
282 IDToInstance::const_iterator found = instance_map_.find(filesystem_id); 278 IDToInstance::const_iterator found = instance_map_.find(filesystem_id);
283 if (found == instance_map_.end() || !found->second->IsSinglePathInstance()) 279 if (found == instance_map_.end() || !found->second->IsSinglePathInstance())
284 return false; 280 return false;
285 *path = found->second->file_info().path; 281 *path = found->second->file_info().path;
286 return true; 282 return true;
287 } 283 }
288 284
289 bool IsolatedContext::CrackVirtualPath( 285 bool IsolatedContext::CrackVirtualPath(
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 return CrackFileSystemURL(FileSystemURL(origin, type, path)); 355 return CrackFileSystemURL(FileSystemURL(origin, type, path));
360 } 356 }
361 357
362 void IsolatedContext::RevokeFileSystemByPath(const base::FilePath& path_in) { 358 void IsolatedContext::RevokeFileSystemByPath(const base::FilePath& path_in) {
363 base::AutoLock locker(lock_); 359 base::AutoLock locker(lock_);
364 base::FilePath path(path_in.NormalizePathSeparators()); 360 base::FilePath path(path_in.NormalizePathSeparators());
365 PathToID::iterator ids_iter = path_to_id_map_.find(path); 361 PathToID::iterator ids_iter = path_to_id_map_.find(path);
366 if (ids_iter == path_to_id_map_.end()) 362 if (ids_iter == path_to_id_map_.end())
367 return; 363 return;
368 std::set<std::string>& ids = ids_iter->second; 364 std::set<std::string>& ids = ids_iter->second;
369 for (std::set<std::string>::iterator iter = ids.begin(); 365 for (std::set<std::string>::iterator iter = ids.begin(); iter != ids.end();
370 iter != ids.end(); ++iter) { 366 ++iter) {
371 IDToInstance::iterator found = instance_map_.find(*iter); 367 IDToInstance::iterator found = instance_map_.find(*iter);
372 if (found != instance_map_.end()) { 368 if (found != instance_map_.end()) {
373 delete found->second; 369 delete found->second;
374 instance_map_.erase(found); 370 instance_map_.erase(found);
375 } 371 }
376 } 372 }
377 path_to_id_map_.erase(ids_iter); 373 path_to_id_map_.erase(ids_iter);
378 } 374 }
379 375
380 void IsolatedContext::AddReference(const std::string& filesystem_id) { 376 void IsolatedContext::AddReference(const std::string& filesystem_id) {
(...skipping 20 matching lines...) Expand all
401 397
402 bool IsolatedContext::GetDraggedFileInfo( 398 bool IsolatedContext::GetDraggedFileInfo(
403 const std::string& filesystem_id, 399 const std::string& filesystem_id,
404 std::vector<MountPointInfo>* files) const { 400 std::vector<MountPointInfo>* files) const {
405 DCHECK(files); 401 DCHECK(files);
406 base::AutoLock locker(lock_); 402 base::AutoLock locker(lock_);
407 IDToInstance::const_iterator found = instance_map_.find(filesystem_id); 403 IDToInstance::const_iterator found = instance_map_.find(filesystem_id);
408 if (found == instance_map_.end() || 404 if (found == instance_map_.end() ||
409 found->second->type() != kFileSystemTypeDragged) 405 found->second->type() != kFileSystemTypeDragged)
410 return false; 406 return false;
411 files->assign(found->second->files().begin(), 407 files->assign(found->second->files().begin(), found->second->files().end());
412 found->second->files().end());
413 return true; 408 return true;
414 } 409 }
415 410
416 base::FilePath IsolatedContext::CreateVirtualRootPath( 411 base::FilePath IsolatedContext::CreateVirtualRootPath(
417 const std::string& filesystem_id) const { 412 const std::string& filesystem_id) const {
418 return base::FilePath().AppendASCII(filesystem_id); 413 return base::FilePath().AppendASCII(filesystem_id);
419 } 414 }
420 415
421 IsolatedContext::IsolatedContext() { 416 IsolatedContext::IsolatedContext() {
422 } 417 }
423 418
424 IsolatedContext::~IsolatedContext() { 419 IsolatedContext::~IsolatedContext() {
425 STLDeleteContainerPairSecondPointers(instance_map_.begin(), 420 STLDeleteContainerPairSecondPointers(instance_map_.begin(),
426 instance_map_.end()); 421 instance_map_.end());
427 } 422 }
428 423
429 FileSystemURL IsolatedContext::CrackFileSystemURL( 424 FileSystemURL IsolatedContext::CrackFileSystemURL(
430 const FileSystemURL& url) const { 425 const FileSystemURL& url) const {
431 if (!HandlesFileSystemMountType(url.type())) 426 if (!HandlesFileSystemMountType(url.type()))
432 return FileSystemURL(); 427 return FileSystemURL();
433 428
434 std::string mount_name; 429 std::string mount_name;
435 std::string cracked_mount_name; 430 std::string cracked_mount_name;
436 FileSystemType cracked_type; 431 FileSystemType cracked_type;
437 base::FilePath cracked_path; 432 base::FilePath cracked_path;
438 FileSystemMountOption cracked_mount_option; 433 FileSystemMountOption cracked_mount_option;
439 if (!CrackVirtualPath(url.path(), &mount_name, &cracked_type, 434 if (!CrackVirtualPath(url.path(),
440 &cracked_mount_name, &cracked_path, 435 &mount_name,
436 &cracked_type,
437 &cracked_mount_name,
438 &cracked_path,
441 &cracked_mount_option)) { 439 &cracked_mount_option)) {
442 return FileSystemURL(); 440 return FileSystemURL();
443 } 441 }
444 442
445 return FileSystemURL( 443 return FileSystemURL(
446 url.origin(), url.mount_type(), url.virtual_path(), 444 url.origin(),
445 url.mount_type(),
446 url.virtual_path(),
447 !url.filesystem_id().empty() ? url.filesystem_id() : mount_name, 447 !url.filesystem_id().empty() ? url.filesystem_id() : mount_name,
448 cracked_type, cracked_path, 448 cracked_type,
449 cracked_path,
449 cracked_mount_name.empty() ? mount_name : cracked_mount_name, 450 cracked_mount_name.empty() ? mount_name : cracked_mount_name,
450 cracked_mount_option); 451 cracked_mount_option);
451 } 452 }
452 453
453 bool IsolatedContext::UnregisterFileSystem(const std::string& filesystem_id) { 454 bool IsolatedContext::UnregisterFileSystem(const std::string& filesystem_id) {
454 lock_.AssertAcquired(); 455 lock_.AssertAcquired();
455 IDToInstance::iterator found = instance_map_.find(filesystem_id); 456 IDToInstance::iterator found = instance_map_.find(filesystem_id);
456 if (found == instance_map_.end()) 457 if (found == instance_map_.end())
457 return false; 458 return false;
458 Instance* instance = found->second; 459 Instance* instance = found->second;
459 if (instance->IsSinglePathInstance()) { 460 if (instance->IsSinglePathInstance()) {
460 PathToID::iterator ids_iter = path_to_id_map_.find( 461 PathToID::iterator ids_iter =
461 instance->file_info().path); 462 path_to_id_map_.find(instance->file_info().path);
462 DCHECK(ids_iter != path_to_id_map_.end()); 463 DCHECK(ids_iter != path_to_id_map_.end());
463 ids_iter->second.erase(filesystem_id); 464 ids_iter->second.erase(filesystem_id);
464 if (ids_iter->second.empty()) 465 if (ids_iter->second.empty())
465 path_to_id_map_.erase(ids_iter); 466 path_to_id_map_.erase(ids_iter);
466 } 467 }
467 delete found->second; 468 delete found->second;
468 instance_map_.erase(found); 469 instance_map_.erase(found);
469 return true; 470 return true;
470 } 471 }
471 472
472 std::string IsolatedContext::GetNewFileSystemId() const { 473 std::string IsolatedContext::GetNewFileSystemId() const {
473 // Returns an arbitrary random string which must be unique in the map. 474 // Returns an arbitrary random string which must be unique in the map.
474 lock_.AssertAcquired(); 475 lock_.AssertAcquired();
475 uint32 random_data[4]; 476 uint32 random_data[4];
476 std::string id; 477 std::string id;
477 do { 478 do {
478 base::RandBytes(random_data, sizeof(random_data)); 479 base::RandBytes(random_data, sizeof(random_data));
479 id = base::HexEncode(random_data, sizeof(random_data)); 480 id = base::HexEncode(random_data, sizeof(random_data));
480 } while (instance_map_.find(id) != instance_map_.end()); 481 } while (instance_map_.find(id) != instance_map_.end());
481 return id; 482 return id;
482 } 483 }
483 484
484 } // namespace fileapi 485 } // namespace storage
OLDNEW
« no previous file with comments | « storage/browser/fileapi/isolated_context.h ('k') | storage/browser/fileapi/isolated_file_system_backend.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698