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

Side by Side Diff: webkit/fileapi/isolated_context.cc

Issue 11787028: New FileSystemURL cracking (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix test on Win Created 7 years, 11 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
« no previous file with comments | « webkit/fileapi/isolated_context.h ('k') | webkit/fileapi/isolated_context_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/fileapi/isolated_context.h" 5 #include "webkit/fileapi/isolated_context.h"
6 6
7 #include "base/file_path.h" 7 #include "base/file_path.h"
8 #include "base/basictypes.h" 8 #include "base/basictypes.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/string_number_conversions.h" 12 #include "base/string_number_conversions.h"
13 #include "base/string_util.h" 13 #include "base/string_util.h"
14 #include "base/stringprintf.h" 14 #include "base/stringprintf.h"
15 #include "webkit/fileapi/file_system_url.h"
15 16
16 namespace fileapi { 17 namespace fileapi {
17 18
18 namespace { 19 namespace {
19 20
20 FilePath::StringType GetRegisterNameForPath(const FilePath& path) { 21 FilePath::StringType GetRegisterNameForPath(const FilePath& path) {
21 // 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.
22 if (path.DirName() != path) 23 if (path.DirName() != path)
23 return path.BaseName().value(); 24 return path.BaseName().value();
24 25
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 register_name->assign(name); 219 register_name->assign(name);
219 } 220 }
220 221
221 base::AutoLock locker(lock_); 222 base::AutoLock locker(lock_);
222 std::string filesystem_id = GetNewFileSystemId(); 223 std::string filesystem_id = GetNewFileSystemId();
223 instance_map_[filesystem_id] = new Instance(type, MountPointInfo(name, path)); 224 instance_map_[filesystem_id] = new Instance(type, MountPointInfo(name, path));
224 path_to_id_map_[path].insert(filesystem_id); 225 path_to_id_map_[path].insert(filesystem_id);
225 return filesystem_id; 226 return filesystem_id;
226 } 227 }
227 228
229 bool IsolatedContext::HandlesFileSystemMountType(FileSystemType type) const {
230 return type == kFileSystemTypeIsolated;
231 }
232
228 bool IsolatedContext::RevokeFileSystem(const std::string& filesystem_id) { 233 bool IsolatedContext::RevokeFileSystem(const std::string& filesystem_id) {
229 base::AutoLock locker(lock_); 234 base::AutoLock locker(lock_);
230 return UnregisterFileSystem(filesystem_id); 235 return UnregisterFileSystem(filesystem_id);
231 } 236 }
232 237
233 bool IsolatedContext::GetRegisteredPath( 238 bool IsolatedContext::GetRegisteredPath(
234 const std::string& filesystem_id, FilePath* path) const { 239 const std::string& filesystem_id, FilePath* path) const {
235 DCHECK(path); 240 DCHECK(path);
236 base::AutoLock locker(lock_); 241 base::AutoLock locker(lock_);
237 IDToInstance::const_iterator found = instance_map_.find(filesystem_id); 242 IDToInstance::const_iterator found = instance_map_.find(filesystem_id);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 if (!instance->ResolvePathForName(name, &cracked_path)) 290 if (!instance->ResolvePathForName(name, &cracked_path))
286 return false; 291 return false;
287 } 292 }
288 293
289 for (; component_iter != components.end(); ++component_iter) 294 for (; component_iter != components.end(); ++component_iter)
290 cracked_path = cracked_path.Append(*component_iter); 295 cracked_path = cracked_path.Append(*component_iter);
291 *path = cracked_path; 296 *path = cracked_path;
292 return true; 297 return true;
293 } 298 }
294 299
300 FileSystemURL IsolatedContext::CrackURL(const GURL& url) const {
301 FileSystemURL filesystem_url = FileSystemURL(url);
302 if (!filesystem_url.is_valid())
303 return FileSystemURL();
304 return CreateCrackedFileSystemURL(filesystem_url.origin(),
305 filesystem_url.mount_type(),
306 filesystem_url.path());
307 }
308
309 FileSystemURL IsolatedContext::CreateCrackedFileSystemURL(
310 const GURL& origin,
311 FileSystemType type,
312 const FilePath& path) const {
313 if (!HandlesFileSystemMountType(type))
314 return FileSystemURL();
315
316 std::string mount_name;
317 FileSystemType cracked_type;
318 FilePath cracked_path;
319 if (!CrackVirtualPath(path, &mount_name, &cracked_type, &cracked_path))
320 return FileSystemURL();
321
322 return FileSystemURL(origin, type, path,
323 mount_name, cracked_type, cracked_path);
324 }
325
295 void IsolatedContext::RevokeFileSystemByPath(const FilePath& path_in) { 326 void IsolatedContext::RevokeFileSystemByPath(const FilePath& path_in) {
296 base::AutoLock locker(lock_); 327 base::AutoLock locker(lock_);
297 FilePath path(path_in.NormalizePathSeparators()); 328 FilePath path(path_in.NormalizePathSeparators());
298 PathToID::iterator ids_iter = path_to_id_map_.find(path); 329 PathToID::iterator ids_iter = path_to_id_map_.find(path);
299 if (ids_iter == path_to_id_map_.end()) 330 if (ids_iter == path_to_id_map_.end())
300 return; 331 return;
301 std::set<std::string>& ids = ids_iter->second; 332 std::set<std::string>& ids = ids_iter->second;
302 for (std::set<std::string>::iterator iter = ids.begin(); 333 for (std::set<std::string>::iterator iter = ids.begin();
303 iter != ids.end(); ++iter) { 334 iter != ids.end(); ++iter) {
304 IDToInstance::iterator found = instance_map_.find(*iter); 335 IDToInstance::iterator found = instance_map_.find(*iter);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 uint32 random_data[4]; 415 uint32 random_data[4];
385 std::string id; 416 std::string id;
386 do { 417 do {
387 base::RandBytes(random_data, sizeof(random_data)); 418 base::RandBytes(random_data, sizeof(random_data));
388 id = base::HexEncode(random_data, sizeof(random_data)); 419 id = base::HexEncode(random_data, sizeof(random_data));
389 } while (instance_map_.find(id) != instance_map_.end()); 420 } while (instance_map_.find(id) != instance_map_.end());
390 return id; 421 return id;
391 } 422 }
392 423
393 } // namespace fileapi 424 } // namespace fileapi
OLDNEW
« no previous file with comments | « webkit/fileapi/isolated_context.h ('k') | webkit/fileapi/isolated_context_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698