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

Side by Side Diff: chrome/browser/chromeos/extensions/file_browser_private_api.cc

Issue 11787028: New FileSystemURL cracking (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . 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
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 "chrome/browser/chromeos/extensions/file_browser_private_api.h" 5 #include "chrome/browser/chromeos/extensions/file_browser_private_api.h"
6 6
7 #include <sys/stat.h> 7 #include <sys/stat.h>
8 #include <sys/statvfs.h> 8 #include <sys/statvfs.h>
9 #include <sys/types.h> 9 #include <sys/types.h>
10 #include <utime.h> 10 #include <utime.h>
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 using extensions::app_file_handler_util::FindFileHandlersForMimeTypes; 86 using extensions::app_file_handler_util::FindFileHandlersForMimeTypes;
87 using chromeos::disks::DiskMountManager; 87 using chromeos::disks::DiskMountManager;
88 using content::BrowserContext; 88 using content::BrowserContext;
89 using content::BrowserThread; 89 using content::BrowserThread;
90 using content::ChildProcessSecurityPolicy; 90 using content::ChildProcessSecurityPolicy;
91 using content::SiteInstance; 91 using content::SiteInstance;
92 using content::WebContents; 92 using content::WebContents;
93 using extensions::Extension; 93 using extensions::Extension;
94 using extensions::ZipFileCreator; 94 using extensions::ZipFileCreator;
95 using file_handler_util::FileTaskExecutor; 95 using file_handler_util::FileTaskExecutor;
96 using fileapi::FileSystemURL;
96 using google_apis::InstalledApp; 97 using google_apis::InstalledApp;
97 98
98 namespace { 99 namespace {
99 100
100 // Default icon path for drive docs. 101 // Default icon path for drive docs.
101 const char kDefaultIcon[] = "images/filetype_generic.png"; 102 const char kDefaultIcon[] = "images/filetype_generic.png";
102 const int kPreferredIconSize = 16; 103 const int kPreferredIconSize = 16;
103 104
104 // Error messages. 105 // Error messages.
105 const char kFileError[] = "File error %d"; 106 const char kFileError[] = "File error %d";
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 static_cast<uint64_t>(stat.f_bfree) * stat.f_frsize; 319 static_cast<uint64_t>(stat.f_bfree) * stat.f_frsize;
319 } 320 }
320 *total_size_kb = static_cast<size_t>(total_size_in_bytes / 1024); 321 *total_size_kb = static_cast<size_t>(total_size_in_bytes / 1024);
321 *remaining_size_kb = static_cast<size_t>(remaining_size_in_bytes / 1024); 322 *remaining_size_kb = static_cast<size_t>(remaining_size_in_bytes / 1024);
322 } 323 }
323 324
324 // Given a |url|, return the virtual FilePath associated with it. If the file 325 // Given a |url|, return the virtual FilePath associated with it. If the file
325 // isn't of the type CrosMountPointProvider handles, return an empty FilePath. 326 // isn't of the type CrosMountPointProvider handles, return an empty FilePath.
326 // 327 //
327 // Virtual paths will look like "Downloads/foo/bar.txt" or "drive/foo/bar.txt". 328 // Virtual paths will look like "Downloads/foo/bar.txt" or "drive/foo/bar.txt".
328 FilePath GetVirtualPathFromURL(const GURL& url) { 329 FilePath GetVirtualPathFromURL(fileapi::FileSystemContext* context,
329 fileapi::FileSystemURL filesystem_url(url); 330 const GURL& url) {
331 fileapi::FileSystemURL filesystem_url(context->CrackURL(url));
330 if (!chromeos::CrosMountPointProvider::CanHandleURL(filesystem_url)) 332 if (!chromeos::CrosMountPointProvider::CanHandleURL(filesystem_url))
331 return FilePath(); 333 return FilePath();
332 return filesystem_url.virtual_path(); 334 return filesystem_url.virtual_path();
333 } 335 }
334 336
335 // Given a |url|, return the local FilePath associated with it. If the file 337 // Given a |url|, return the local FilePath associated with it. If the file
336 // isn't of the type CrosMountPointProvider handles, return an empty FilePath. 338 // isn't of the type CrosMountPointProvider handles, return an empty FilePath.
337 // 339 //
338 // Local paths will look like "/home/chronos/user/Downloads/foo/bar.txt" or 340 // Local paths will look like "/home/chronos/user/Downloads/foo/bar.txt" or
339 // "/special/drive/foo/bar.txt". 341 // "/special/drive/foo/bar.txt".
340 FilePath GetLocalPathFromURL(const GURL& url) { 342 FilePath GetLocalPathFromURL(fileapi::FileSystemContext* context,
341 fileapi::FileSystemURL filesystem_url(url); 343 const GURL& url) {
344 fileapi::FileSystemURL filesystem_url(context->CrackURL(url));
342 if (!chromeos::CrosMountPointProvider::CanHandleURL(filesystem_url)) 345 if (!chromeos::CrosMountPointProvider::CanHandleURL(filesystem_url))
343 return FilePath(); 346 return FilePath();
344 return filesystem_url.path(); 347 return filesystem_url.path();
345 } 348 }
346 349
347 // Make a set of unique filename suffixes out of the list of file URLs. 350 // Make a set of unique filename suffixes out of the list of file URLs.
348 std::set<std::string> GetUniqueSuffixes(base::ListValue* file_url_list) { 351 std::set<std::string> GetUniqueSuffixes(base::ListValue* file_url_list) {
349 std::set<std::string> suffixes; 352 std::set<std::string> suffixes;
350 for (size_t i = 0; i < file_url_list->GetSize(); ++i) { 353 for (size_t i = 0; i < file_url_list->GetSize(); ++i) {
351 std::string url; 354 std::string url;
352 if (!file_url_list->GetString(i, &url)) 355 if (!file_url_list->GetString(i, &url))
353 return std::set<std::string>(); 356 return std::set<std::string>();
354 FilePath path = GetVirtualPathFromURL(GURL(url)); 357 FileSystemURL non_cracked = FileSystemURL(GURL(url));
358 FilePath path = non_cracked.path();
355 if (path.empty()) 359 if (path.empty())
356 return std::set<std::string>(); 360 return std::set<std::string>();
357 // We'll skip empty suffixes. 361 // We'll skip empty suffixes.
358 if (!path.Extension().empty()) 362 if (!path.Extension().empty())
359 suffixes.insert(path.Extension()); 363 suffixes.insert(path.Extension());
360 } 364 }
361 return suffixes; 365 return suffixes;
362 } 366 }
363 367
364 // Make a set of unique MIME types out of the list of MIME types. 368 // Make a set of unique MIME types out of the list of MIME types.
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 if (!entry_proto.content_url().empty()) 436 if (!entry_proto.content_url().empty())
433 property_dict->SetString("contentUrl", entry_proto.content_url()); 437 property_dict->SetString("contentUrl", entry_proto.content_url());
434 438
435 property_dict->SetBoolean("isHosted", 439 property_dict->SetBoolean("isHosted",
436 file_specific_info.is_hosted_document()); 440 file_specific_info.is_hosted_document());
437 441
438 property_dict->SetString("contentMimeType", 442 property_dict->SetString("contentMimeType",
439 file_specific_info.content_mime_type()); 443 file_specific_info.content_mime_type());
440 } 444 }
441 445
446 // TODO(tbarzic): Pass set of file extensions instead of file urls to the
447 // function.
448 void GetMimeTypesForFileURLs(const std::vector<GURL>& file_urls,
449 std::set<std::string>* mime_types) {
450 for (std::vector<GURL>::const_iterator iter = file_urls.begin();
451 iter != file_urls.end(); ++iter) {
452 FileSystemURL non_cracked_url(*iter);
453 if (!non_cracked_url.is_valid())
454 continue;
455
456 const FilePath::StringType file_extension =
457 StringToLowerASCII(non_cracked_url.path().Extension());
458
459 // TODO(thorogood): Rearchitect this call so it can run on the File thread;
460 // GetMimeTypeFromFile requires this on Linux. Right now, we use
461 // Chrome-level knowledge only.
462 std::string mime_type;
463 if (file_extension.empty() ||
464 !net::GetWellKnownMimeTypeFromExtension(file_extension.substr(1),
465 &mime_type)) {
466 // If the file doesn't have an extension or its mime-type cannot be
467 // determined, then indicate that it has the empty mime-type. This will
468 // only be matched if the Web Intents accepts "*" or "*/*".
469 mime_types->insert("");
470 } else {
471 mime_types->insert(mime_type);
472 }
473 }
474 }
475
442 } // namespace 476 } // namespace
443 477
444 class RequestLocalFileSystemFunction::LocalFileSystemCallbackDispatcher { 478 class RequestLocalFileSystemFunction::LocalFileSystemCallbackDispatcher {
445 public: 479 public:
446 static fileapi::FileSystemContext::OpenFileSystemCallback CreateCallback( 480 static fileapi::FileSystemContext::OpenFileSystemCallback CreateCallback(
447 RequestLocalFileSystemFunction* function, 481 RequestLocalFileSystemFunction* function,
448 scoped_refptr<fileapi::FileSystemContext> file_system_context, 482 scoped_refptr<fileapi::FileSystemContext> file_system_context,
449 int child_id, 483 int child_id,
450 scoped_refptr<const Extension> extension) { 484 scoped_refptr<const Extension> extension) {
451 return base::Bind( 485 return base::Bind(
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 699
666 bool FileWatchBrowserFunctionBase::RunImpl() { 700 bool FileWatchBrowserFunctionBase::RunImpl() {
667 if (!render_view_host() || !render_view_host()->GetProcess()) 701 if (!render_view_host() || !render_view_host()->GetProcess())
668 return false; 702 return false;
669 703
670 // First param is url of a file to watch. 704 // First param is url of a file to watch.
671 std::string url; 705 std::string url;
672 if (!args_->GetString(0, &url) || url.empty()) 706 if (!args_->GetString(0, &url) || url.empty())
673 return false; 707 return false;
674 708
675 GURL file_watch_url(url); 709 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
710 scoped_refptr<fileapi::FileSystemContext> file_system_context =
711 BrowserContext::GetStoragePartition(profile(), site_instance)->
712 GetFileSystemContext();
713
714 FileSystemURL file_watch_url = file_system_context->CrackURL(GURL(url));
676 BrowserThread::PostTask( 715 BrowserThread::PostTask(
677 BrowserThread::FILE, FROM_HERE, 716 BrowserThread::FILE, FROM_HERE,
678 base::Bind( 717 base::Bind(
679 &FileWatchBrowserFunctionBase::RunFileWatchOperationOnFileThread, 718 &FileWatchBrowserFunctionBase::RunFileWatchOperationOnFileThread,
680 this, 719 this,
681 FileBrowserPrivateAPI::Get(profile_)->event_router(), 720 FileBrowserPrivateAPI::Get(profile_)->event_router(),
682 file_watch_url, 721 file_watch_url,
683 extension_id())); 722 extension_id()));
684 723
685 return true; 724 return true;
686 } 725 }
687 726
688 void FileWatchBrowserFunctionBase::RunFileWatchOperationOnFileThread( 727 void FileWatchBrowserFunctionBase::RunFileWatchOperationOnFileThread(
689 scoped_refptr<FileBrowserEventRouter> event_router, 728 scoped_refptr<FileBrowserEventRouter> event_router,
690 const GURL& file_url, const std::string& extension_id) { 729 const FileSystemURL& file_url, const std::string& extension_id) {
691 FilePath local_path = GetLocalPathFromURL(file_url); 730 FilePath local_path = file_url.path();
692 FilePath virtual_path = GetVirtualPathFromURL(file_url); 731 FilePath virtual_path = file_url.virtual_path();
693 bool result = !local_path.empty() && PerformFileWatchOperation( 732 bool result = !local_path.empty() && PerformFileWatchOperation(
694 event_router, local_path, virtual_path, extension_id); 733 event_router, local_path, virtual_path, extension_id);
695 734
696 BrowserThread::PostTask( 735 BrowserThread::PostTask(
697 BrowserThread::UI, FROM_HERE, 736 BrowserThread::UI, FROM_HERE,
698 base::Bind( 737 base::Bind(
699 &FileWatchBrowserFunctionBase::RespondOnUIThread, this, result)); 738 &FileWatchBrowserFunctionBase::RespondOnUIThread, this, result));
700 } 739 }
701 740
702 bool AddFileWatchBrowserFunction::PerformFileWatchOperation( 741 bool AddFileWatchBrowserFunction::PerformFileWatchOperation(
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
867 std::set<std::string> default_tasks; 906 std::set<std::string> default_tasks;
868 FindDefaultDriveTasks(file_info_list, available_tasks, &default_tasks); 907 FindDefaultDriveTasks(file_info_list, available_tasks, &default_tasks);
869 CreateDriveTasks(registry, app_info, available_tasks, default_tasks, 908 CreateDriveTasks(registry, app_info, available_tasks, default_tasks,
870 result_list, default_already_set); 909 result_list, default_already_set);
871 910
872 // We own the pointers in |app_info|, so we need to delete them. 911 // We own the pointers in |app_info|, so we need to delete them.
873 STLDeleteContainerPairSecondPointers(app_info.begin(), app_info.end()); 912 STLDeleteContainerPairSecondPointers(app_info.begin(), app_info.end());
874 return true; 913 return true;
875 } 914 }
876 915
877 static void GetMimeTypesForFileURLs(const std::vector<GURL>& file_urls,
878 std::set<std::string>* mime_types) {
879 for (std::vector<GURL>::const_iterator iter = file_urls.begin();
880 iter != file_urls.end(); ++iter) {
881 const FilePath file = FilePath(GURL(iter->spec()).ExtractFileName());
882 const FilePath::StringType file_extension =
883 StringToLowerASCII(file.Extension());
884
885 // TODO(thorogood): Rearchitect this call so it can run on the File thread;
886 // GetMimeTypeFromFile requires this on Linux. Right now, we use
887 // Chrome-level knowledge only.
888 std::string mime_type;
889 if (file_extension.empty() || !net::GetWellKnownMimeTypeFromExtension(
890 file_extension.substr(1), &mime_type)) {
891 // If the file doesn't have an extension or its mime-type cannot be
892 // determined, then indicate that it has the empty mime-type. This will
893 // only be matched if the Web Intents accepts "*" or "*/*".
894 mime_types->insert("");
895 } else {
896 mime_types->insert(mime_type);
897 }
898 }
899 }
900
901 bool GetFileTasksFileBrowserFunction::FindAppTasks( 916 bool GetFileTasksFileBrowserFunction::FindAppTasks(
902 const std::vector<GURL>& file_urls, 917 const std::vector<GURL>& file_urls,
903 ListValue* result_list) { 918 ListValue* result_list) {
904 DCHECK(!file_urls.empty()); 919 DCHECK(!file_urls.empty());
905 ExtensionService* service = profile_->GetExtensionService(); 920 ExtensionService* service = profile_->GetExtensionService();
906 if (!service) 921 if (!service)
907 return false; 922 return false;
908 923
909 std::set<std::string> mime_types; 924 std::set<std::string> mime_types;
910 GetMimeTypesForFileURLs(file_urls, &mime_types); 925 GetMimeTypesForFileURLs(file_urls, &mime_types);
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 // Second argument is the list of mime types of each of the files in the list. 1029 // Second argument is the list of mime types of each of the files in the list.
1015 ListValue* mime_types_list = NULL; 1030 ListValue* mime_types_list = NULL;
1016 if (!args_->GetList(1, &mime_types_list)) 1031 if (!args_->GetList(1, &mime_types_list))
1017 return false; 1032 return false;
1018 1033
1019 // MIME types can either be empty, or there needs to be one for each file. 1034 // MIME types can either be empty, or there needs to be one for each file.
1020 if (mime_types_list->GetSize() != files_list->GetSize() && 1035 if (mime_types_list->GetSize() != files_list->GetSize() &&
1021 mime_types_list->GetSize() != 0) 1036 mime_types_list->GetSize() != 0)
1022 return false; 1037 return false;
1023 1038
1039 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
1040 scoped_refptr<fileapi::FileSystemContext> file_system_context =
1041 BrowserContext::GetStoragePartition(profile(), site_instance)->
1042 GetFileSystemContext();
1043
1024 // Collect all the URLs, convert them to GURLs, and crack all the urls into 1044 // Collect all the URLs, convert them to GURLs, and crack all the urls into
1025 // file paths. 1045 // file paths.
1026 FileInfoList info_list; 1046 FileInfoList info_list;
1027 std::vector<GURL> file_urls; 1047 std::vector<GURL> file_urls;
1028 for (size_t i = 0; i < files_list->GetSize(); ++i) { 1048 for (size_t i = 0; i < files_list->GetSize(); ++i) {
1029 FileInfo info; 1049 FileInfo info;
1030 std::string file_url; 1050 std::string file_url_str;
1031 if (!files_list->GetString(i, &file_url)) 1051 if (!files_list->GetString(i, &file_url_str))
1032 return false; 1052 return false;
1033 info.file_url = GURL(file_url); 1053
1034 file_urls.push_back(info.file_url);
1035 if (mime_types_list->GetSize() != 0 && 1054 if (mime_types_list->GetSize() != 0 &&
1036 !mime_types_list->GetString(i, &info.mime_type)) 1055 !mime_types_list->GetString(i, &info.mime_type))
1037 return false; 1056 return false;
1038 fileapi::FileSystemURL file_system_url(info.file_url); 1057
1039 if (chromeos::CrosMountPointProvider::CanHandleURL(file_system_url)) { 1058 GURL file_url(file_url_str);
1040 info.file_path = file_system_url.path(); 1059 fileapi::FileSystemURL file_system_url(
1041 } 1060 file_system_context->CrackURL(file_url));
1061 if (!chromeos::CrosMountPointProvider::CanHandleURL(file_system_url))
1062 continue;
1063
1064 file_urls.push_back(file_url);
1065
1066 info.file_url = file_url;
1067 info.file_path = file_system_url.path();
1042 info_list.push_back(info); 1068 info_list.push_back(info);
1043 } 1069 }
1044 1070
1045 ListValue* result_list = new ListValue(); 1071 ListValue* result_list = new ListValue();
1046 SetResult(result_list); 1072 SetResult(result_list);
1047 1073
1048 // Find the Drive apps first, because we want them to take precedence 1074 // Find the Drive apps first, because we want them to take precedence
1049 // when setting the default app. 1075 // when setting the default app.
1050 bool default_already_set = false; 1076 bool default_already_set = false;
1051 if (!FindDriveAppTasks(info_list, result_list, &default_already_set)) 1077 if (!FindDriveAppTasks(info_list, result_list, &default_already_set))
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 std::string action_id; 1180 std::string action_id;
1155 if (!file_handler_util::CrackTaskID( 1181 if (!file_handler_util::CrackTaskID(
1156 task_id, &extension_id, &task_type, &action_id)) { 1182 task_id, &extension_id, &task_type, &action_id)) {
1157 LOG(WARNING) << "Invalid task " << task_id; 1183 LOG(WARNING) << "Invalid task " << task_id;
1158 return false; 1184 return false;
1159 } 1185 }
1160 1186
1161 if (!files_list->GetSize()) 1187 if (!files_list->GetSize())
1162 return true; 1188 return true;
1163 1189
1164 std::vector<GURL> file_urls; 1190 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
1191 scoped_refptr<fileapi::FileSystemContext> file_system_context =
1192 BrowserContext::GetStoragePartition(profile(), site_instance)->
1193 GetFileSystemContext();
1194
1195 std::vector<FileSystemURL> file_urls;
1165 for (size_t i = 0; i < files_list->GetSize(); i++) { 1196 for (size_t i = 0; i < files_list->GetSize(); i++) {
1166 std::string origin_file_url; 1197 std::string file_url_str;
1167 if (!files_list->GetString(i, &origin_file_url)) { 1198 if (!files_list->GetString(i, &file_url_str)) {
1168 error_ = kInvalidFileUrl; 1199 error_ = kInvalidFileUrl;
1169 return false; 1200 return false;
1170 } 1201 }
1171 file_urls.push_back(GURL(origin_file_url)); 1202 FileSystemURL url = file_system_context->CrackURL(GURL(file_url_str));
1203 if (!chromeos::CrosMountPointProvider::CanHandleURL(url)) {
1204 error_ = kInvalidFileUrl;
1205 return false;
1206 }
1207 file_urls.push_back(url);
1172 } 1208 }
1173 1209
1174 WebContents* web_contents = 1210 WebContents* web_contents =
1175 dispatcher()->delegate()->GetAssociatedWebContents(); 1211 dispatcher()->delegate()->GetAssociatedWebContents();
1176 int32 tab_id = 0; 1212 int32 tab_id = 0;
1177 if (web_contents) 1213 if (web_contents)
1178 tab_id = ExtensionTabUtil::GetTabId(web_contents); 1214 tab_id = ExtensionTabUtil::GetTabId(web_contents);
1179 1215
1180 scoped_refptr<FileTaskExecutor> executor( 1216 scoped_refptr<FileTaskExecutor> executor(
1181 FileTaskExecutor::Create(profile(), 1217 FileTaskExecutor::Create(profile(),
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1322 net::UnescapeURLComponent(parameters[i].second, 1358 net::UnescapeURLComponent(parameters[i].second,
1323 kUnescapeRuleForQueryParameters); 1359 kUnescapeRuleForQueryParameters);
1324 local_path = FilePath::FromUTF8Unsafe(unescaped_value); 1360 local_path = FilePath::FromUTF8Unsafe(unescaped_value);
1325 break; 1361 break;
1326 } 1362 }
1327 } 1363 }
1328 } 1364 }
1329 } 1365 }
1330 1366
1331 // Extract the path from |file_url|. 1367 // Extract the path from |file_url|.
1332 fileapi::FileSystemURL url(file_url); 1368 fileapi::FileSystemURL url(file_system_context->CrackURL(file_url));
1333 if (!chromeos::CrosMountPointProvider::CanHandleURL(url)) 1369 if (!chromeos::CrosMountPointProvider::CanHandleURL(url))
1334 continue; 1370 continue;
1335 1371
1336 if (!url.path().empty()) { 1372 if (!url.path().empty()) {
1337 DVLOG(1) << "Selected: file path: " << url.path().value() 1373 DVLOG(1) << "Selected: file path: " << url.path().value()
1338 << " local path: " << local_path.value(); 1374 << " local path: " << local_path.value();
1339 selected_files.push_back( 1375 selected_files.push_back(
1340 ui::SelectedFileInfo(url.path(), local_path)); 1376 ui::SelectedFileInfo(url.path(), local_path));
1341 } 1377 }
1342 } 1378 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1386 return false; 1422 return false;
1387 } 1423 }
1388 1424
1389 ListValue* path_list = NULL; 1425 ListValue* path_list = NULL;
1390 args_->GetList(0, &path_list); 1426 args_->GetList(0, &path_list);
1391 DCHECK(path_list); 1427 DCHECK(path_list);
1392 1428
1393 std::string internal_task_id; 1429 std::string internal_task_id;
1394 args_->GetString(1, &internal_task_id); 1430 args_->GetString(1, &internal_task_id);
1395 1431
1432 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
1433 scoped_refptr<fileapi::FileSystemContext> file_system_context =
1434 BrowserContext::GetStoragePartition(profile(), site_instance)->
1435 GetFileSystemContext();
1436
1396 std::vector<FilePath> files; 1437 std::vector<FilePath> files;
1397 for (size_t i = 0; i < path_list->GetSize(); ++i) { 1438 for (size_t i = 0; i < path_list->GetSize(); ++i) {
1398 std::string url_as_string; 1439 std::string url_as_string;
1399 path_list->GetString(i, &url_as_string); 1440 path_list->GetString(i, &url_as_string);
1400 FilePath path = GetLocalPathFromURL(GURL(url_as_string)); 1441 FilePath path = GetLocalPathFromURL(file_system_context,
1442 GURL(url_as_string));
1401 if (path.empty()) 1443 if (path.empty())
1402 return false; 1444 return false;
1403 files.push_back(path); 1445 files.push_back(path);
1404 } 1446 }
1405 1447
1406 Browser* browser = GetCurrentBrowser(); 1448 Browser* browser = GetCurrentBrowser();
1407 bool success = browser; 1449 bool success = browser;
1408 1450
1409 if (browser) { 1451 if (browser) {
1410 for (size_t i = 0; i < files.size(); ++i) { 1452 for (size_t i = 0; i < files.size(); ++i) {
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
1663 file_url, 1705 file_url,
1664 strtoul(timestamp.c_str(), NULL, 0))); 1706 strtoul(timestamp.c_str(), NULL, 0)));
1665 1707
1666 return true; 1708 return true;
1667 } 1709 }
1668 1710
1669 void SetLastModifiedFunction::RunOperationOnFileThread(std::string file_url, 1711 void SetLastModifiedFunction::RunOperationOnFileThread(std::string file_url,
1670 time_t timestamp) { 1712 time_t timestamp) {
1671 bool succeeded = false; 1713 bool succeeded = false;
1672 1714
1673 FilePath local_path = GetLocalPathFromURL(GURL(file_url)); 1715 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
1716 scoped_refptr<fileapi::FileSystemContext> file_system_context =
1717 BrowserContext::GetStoragePartition(profile(), site_instance)->
1718 GetFileSystemContext();
1719
1720 FilePath local_path = GetLocalPathFromURL(file_system_context,
1721 GURL(file_url));
1674 if (!local_path.empty()) { 1722 if (!local_path.empty()) {
1675 struct stat sb; 1723 struct stat sb;
1676 if (stat(local_path.value().c_str(), &sb) == 0) { 1724 if (stat(local_path.value().c_str(), &sb) == 0) {
1677 struct utimbuf times; 1725 struct utimbuf times;
1678 times.actime = sb.st_atime; 1726 times.actime = sb.st_atime;
1679 times.modtime = timestamp; 1727 times.modtime = timestamp;
1680 1728
1681 if (utime(local_path.value().c_str(), &times) == 0) 1729 if (utime(local_path.value().c_str(), &times) == 0)
1682 succeeded = true; 1730 succeeded = true;
1683 } 1731 }
(...skipping 15 matching lines...) Expand all
1699 1747
1700 bool GetSizeStatsFunction::RunImpl() { 1748 bool GetSizeStatsFunction::RunImpl() {
1701 if (args_->GetSize() != 1) { 1749 if (args_->GetSize() != 1) {
1702 return false; 1750 return false;
1703 } 1751 }
1704 1752
1705 std::string mount_url; 1753 std::string mount_url;
1706 if (!args_->GetString(0, &mount_url)) 1754 if (!args_->GetString(0, &mount_url))
1707 return false; 1755 return false;
1708 1756
1709 FilePath file_path = GetLocalPathFromURL(GURL(mount_url)); 1757 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
1758 scoped_refptr<fileapi::FileSystemContext> file_system_context =
1759 BrowserContext::GetStoragePartition(profile(), site_instance)->
1760 GetFileSystemContext();
1761
1762 FilePath file_path = GetLocalPathFromURL(file_system_context,
1763 GURL(mount_url));
1710 if (file_path.empty()) 1764 if (file_path.empty())
1711 return false; 1765 return false;
1712 1766
1713 if (file_path == drive::util::GetDriveMountPointPath()) { 1767 if (file_path == drive::util::GetDriveMountPointPath()) {
1714 drive::DriveSystemService* system_service = 1768 drive::DriveSystemService* system_service =
1715 drive::DriveSystemServiceFactory::GetForProfile(profile_); 1769 drive::DriveSystemServiceFactory::GetForProfile(profile_);
1716 // |system_service| is NULL if Drive is disabled. 1770 // |system_service| is NULL if Drive is disabled.
1717 if (!system_service) { 1771 if (!system_service) {
1718 // If stats couldn't be gotten for drive, result should be left 1772 // If stats couldn't be gotten for drive, result should be left
1719 // undefined. See comments in GetDriveAvailableSpaceCallback(). 1773 // undefined. See comments in GetDriveAvailableSpaceCallback().
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1795 if (args_->GetSize() != 1) { 1849 if (args_->GetSize() != 1) {
1796 return false; 1850 return false;
1797 } 1851 }
1798 1852
1799 std::string volume_file_url; 1853 std::string volume_file_url;
1800 if (!args_->GetString(0, &volume_file_url)) { 1854 if (!args_->GetString(0, &volume_file_url)) {
1801 NOTREACHED(); 1855 NOTREACHED();
1802 return false; 1856 return false;
1803 } 1857 }
1804 1858
1805 FilePath file_path = GetLocalPathFromURL(GURL(volume_file_url)); 1859 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
1860 scoped_refptr<fileapi::FileSystemContext> file_system_context =
1861 BrowserContext::GetStoragePartition(profile(), site_instance)->
1862 GetFileSystemContext();
1863
1864 FilePath file_path = GetLocalPathFromURL(file_system_context,
1865 GURL(volume_file_url));
1806 if (file_path.empty()) 1866 if (file_path.empty())
1807 return false; 1867 return false;
1808 1868
1809 DiskMountManager::GetInstance()->FormatMountedDevice(file_path.value()); 1869 DiskMountManager::GetInstance()->FormatMountedDevice(file_path.value());
1810 SendResponse(true); 1870 SendResponse(true);
1811 return true; 1871 return true;
1812 } 1872 }
1813 1873
1814 GetVolumeMetadataFunction::GetVolumeMetadataFunction() { 1874 GetVolumeMetadataFunction::GetVolumeMetadataFunction() {
1815 } 1875 }
1816 1876
1817 GetVolumeMetadataFunction::~GetVolumeMetadataFunction() { 1877 GetVolumeMetadataFunction::~GetVolumeMetadataFunction() {
1818 } 1878 }
1819 1879
1820 bool GetVolumeMetadataFunction::RunImpl() { 1880 bool GetVolumeMetadataFunction::RunImpl() {
1821 if (args_->GetSize() != 1) { 1881 if (args_->GetSize() != 1) {
1822 error_ = "Invalid argument count"; 1882 error_ = "Invalid argument count";
1823 return false; 1883 return false;
1824 } 1884 }
1825 1885
1826 std::string volume_mount_url; 1886 std::string volume_mount_url;
1827 if (!args_->GetString(0, &volume_mount_url)) { 1887 if (!args_->GetString(0, &volume_mount_url)) {
1828 NOTREACHED(); 1888 NOTREACHED();
1829 return false; 1889 return false;
1830 } 1890 }
1831 1891
1832 FilePath file_path = GetLocalPathFromURL(GURL(volume_mount_url)); 1892 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
1893 scoped_refptr<fileapi::FileSystemContext> file_system_context =
1894 BrowserContext::GetStoragePartition(profile(), site_instance)->
1895 GetFileSystemContext();
1896
1897 FilePath file_path = GetLocalPathFromURL(file_system_context,
1898 GURL(volume_mount_url));
1833 if (file_path.empty()) { 1899 if (file_path.empty()) {
1834 error_ = "Invalid mount path."; 1900 error_ = "Invalid mount path.";
1835 return false; 1901 return false;
1836 } 1902 }
1837 1903
1838 results_.reset(); 1904 results_.reset();
1839 1905
1840 const DiskMountManager::Disk* volume = GetVolumeAsDisk(file_path.value()); 1906 const DiskMountManager::Disk* volume = GetVolumeAsDisk(file_path.value());
1841 if (volume) { 1907 if (volume) {
1842 DictionaryValue* volume_info = 1908 DictionaryValue* volume_info =
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
2269 } 2335 }
2270 2336
2271 void GetDriveFilePropertiesFunction::GetNextFileProperties() { 2337 void GetDriveFilePropertiesFunction::GetNextFileProperties() {
2272 if (current_index_ >= path_list_->GetSize()) { 2338 if (current_index_ >= path_list_->GetSize()) {
2273 // Exit of asynchronous look and return the result. 2339 // Exit of asynchronous look and return the result.
2274 SetResult(file_properties_.release()); 2340 SetResult(file_properties_.release());
2275 SendResponse(true); 2341 SendResponse(true);
2276 return; 2342 return;
2277 } 2343 }
2278 2344
2345 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
2346 scoped_refptr<fileapi::FileSystemContext> file_system_context =
2347 BrowserContext::GetStoragePartition(profile(), site_instance)->
2348 GetFileSystemContext();
2349
2279 std::string file_str; 2350 std::string file_str;
2280 path_list_->GetString(current_index_, &file_str); 2351 path_list_->GetString(current_index_, &file_str);
2281 GURL file_url = GURL(file_str); 2352 GURL file_url = GURL(file_str);
2282 FilePath file_path = GetVirtualPathFromURL(file_url); 2353 FilePath file_path = GetVirtualPathFromURL(file_system_context,
2354 file_url);
2283 2355
2284 base::DictionaryValue* property_dict = new base::DictionaryValue; 2356 base::DictionaryValue* property_dict = new base::DictionaryValue;
2285 property_dict->SetString("fileUrl", file_url.spec()); 2357 property_dict->SetString("fileUrl", file_url.spec());
2286 file_properties_->Append(property_dict); 2358 file_properties_->Append(property_dict);
2287 2359
2288 // Start getting the file info. 2360 // Start getting the file info.
2289 drive::DriveSystemService* system_service = 2361 drive::DriveSystemService* system_service =
2290 drive::DriveSystemServiceFactory::GetForProfile(profile_); 2362 drive::DriveSystemServiceFactory::GetForProfile(profile_);
2291 // |system_service| is NULL if Drive is disabled. 2363 // |system_service| is NULL if Drive is disabled.
2292 if (!system_service) { 2364 if (!system_service) {
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
2490 } 2562 }
2491 2563
2492 GetFileLocationsFunction::~GetFileLocationsFunction() { 2564 GetFileLocationsFunction::~GetFileLocationsFunction() {
2493 } 2565 }
2494 2566
2495 bool GetFileLocationsFunction::RunImpl() { 2567 bool GetFileLocationsFunction::RunImpl() {
2496 ListValue* file_urls_as_strings = NULL; 2568 ListValue* file_urls_as_strings = NULL;
2497 if (!args_->GetList(0, &file_urls_as_strings)) 2569 if (!args_->GetList(0, &file_urls_as_strings))
2498 return false; 2570 return false;
2499 2571
2572 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
2573 scoped_refptr<fileapi::FileSystemContext> file_system_context =
2574 BrowserContext::GetStoragePartition(profile(), site_instance)->
2575 GetFileSystemContext();
2576
2500 // Convert the list of strings to a list of GURLs. 2577 // Convert the list of strings to a list of GURLs.
2501 scoped_ptr<ListValue> locations(new ListValue); 2578 scoped_ptr<ListValue> locations(new ListValue);
2502 for (size_t i = 0; i < file_urls_as_strings->GetSize(); ++i) { 2579 for (size_t i = 0; i < file_urls_as_strings->GetSize(); ++i) {
2503 std::string file_url_as_string; 2580 std::string file_url_as_string;
2504 if (!file_urls_as_strings->GetString(i, &file_url_as_string)) 2581 if (!file_urls_as_strings->GetString(i, &file_url_as_string))
2505 return false; 2582 return false;
2506 2583
2507 fileapi::FileSystemURL url((GURL(file_url_as_string))); 2584 fileapi::FileSystemURL url(
2585 file_system_context->CrackURL(GURL(file_url_as_string)));
2508 if (url.type() == fileapi::kFileSystemTypeDrive) 2586 if (url.type() == fileapi::kFileSystemTypeDrive)
2509 locations->Append(new base::StringValue("drive")); 2587 locations->Append(new base::StringValue("drive"));
2510 else 2588 else
2511 locations->Append(new base::StringValue("local")); 2589 locations->Append(new base::StringValue("local"));
2512 } 2590 }
2513 2591
2514 SetResult(locations.release()); 2592 SetResult(locations.release());
2515 SendResponse(true); 2593 SendResponse(true);
2516 return true; 2594 return true;
2517 } 2595 }
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
2653 ListValue* url_list = NULL; 2731 ListValue* url_list = NULL;
2654 if (!args_->GetList(0, &url_list)) 2732 if (!args_->GetList(0, &url_list))
2655 return false; 2733 return false;
2656 2734
2657 drive::DriveSystemService* system_service = 2735 drive::DriveSystemService* system_service =
2658 drive::DriveSystemServiceFactory::GetForProfile(profile_); 2736 drive::DriveSystemServiceFactory::GetForProfile(profile_);
2659 // |system_service| is NULL if Drive is disabled. 2737 // |system_service| is NULL if Drive is disabled.
2660 if (!system_service) 2738 if (!system_service)
2661 return false; 2739 return false;
2662 2740
2741 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
2742 scoped_refptr<fileapi::FileSystemContext> file_system_context =
2743 BrowserContext::GetStoragePartition(profile(), site_instance)->
2744 GetFileSystemContext();
2745
2663 scoped_ptr<ListValue> responses(new ListValue()); 2746 scoped_ptr<ListValue> responses(new ListValue());
2664 for (size_t i = 0; i < url_list->GetSize(); ++i) { 2747 for (size_t i = 0; i < url_list->GetSize(); ++i) {
2665 std::string url_as_string; 2748 std::string url_as_string;
2666 url_list->GetString(i, &url_as_string); 2749 url_list->GetString(i, &url_as_string);
2667 2750
2668 FilePath file_path = GetLocalPathFromURL(GURL(url_as_string)); 2751 FilePath file_path = GetLocalPathFromURL(file_system_context,
2752 GURL(url_as_string));
2669 if (file_path.empty()) 2753 if (file_path.empty())
2670 continue; 2754 continue;
2671 2755
2672 DCHECK(drive::util::IsUnderDriveMountPoint(file_path)); 2756 DCHECK(drive::util::IsUnderDriveMountPoint(file_path));
2673 file_path = drive::util::ExtractDrivePath(file_path); 2757 file_path = drive::util::ExtractDrivePath(file_path);
2674 scoped_ptr<DictionaryValue> result(new DictionaryValue()); 2758 scoped_ptr<DictionaryValue> result(new DictionaryValue());
2675 result->SetBoolean( 2759 result->SetBoolean(
2676 "canceled", 2760 "canceled",
2677 system_service->drive_service()->CancelForFilePath(file_path)); 2761 system_service->drive_service()->CancelForFilePath(file_path));
2678 GURL file_url; 2762 GURL file_url;
(...skipping 21 matching lines...) Expand all
2700 !args_->GetString(1, &destination_file_url)) { 2784 !args_->GetString(1, &destination_file_url)) {
2701 return false; 2785 return false;
2702 } 2786 }
2703 2787
2704 drive::DriveSystemService* system_service = 2788 drive::DriveSystemService* system_service =
2705 drive::DriveSystemServiceFactory::GetForProfile(profile_); 2789 drive::DriveSystemServiceFactory::GetForProfile(profile_);
2706 // |system_service| is NULL if Drive is disabled. 2790 // |system_service| is NULL if Drive is disabled.
2707 if (!system_service) 2791 if (!system_service)
2708 return false; 2792 return false;
2709 2793
2710 FilePath source_file = GetLocalPathFromURL(GURL(source_file_url)); 2794 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
2711 FilePath destination_file = GetLocalPathFromURL(GURL(destination_file_url)); 2795 scoped_refptr<fileapi::FileSystemContext> file_system_context =
2796 BrowserContext::GetStoragePartition(profile(), site_instance)->
2797 GetFileSystemContext();
2798
2799 FilePath source_file = GetLocalPathFromURL(file_system_context,
2800 GURL(source_file_url));
2801 FilePath destination_file = GetLocalPathFromURL(file_system_context,
2802 GURL(destination_file_url));
2712 if (source_file.empty() || destination_file.empty()) 2803 if (source_file.empty() || destination_file.empty())
2713 return false; 2804 return false;
2714 2805
2715 bool source_file_under_drive = 2806 bool source_file_under_drive =
2716 drive::util::IsUnderDriveMountPoint(source_file); 2807 drive::util::IsUnderDriveMountPoint(source_file);
2717 bool destination_file_under_drive = 2808 bool destination_file_under_drive =
2718 drive::util::IsUnderDriveMountPoint(destination_file); 2809 drive::util::IsUnderDriveMountPoint(destination_file);
2719 2810
2720 if (source_file_under_drive && !destination_file_under_drive) { 2811 if (source_file_under_drive && !destination_file_under_drive) {
2721 // Transfer a file from gdata to local file system. 2812 // Transfer a file from gdata to local file system.
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
2949 std::string file_url_as_string; 3040 std::string file_url_as_string;
2950 if (!args_->GetString(0, &file_url_as_string)) 3041 if (!args_->GetString(0, &file_url_as_string))
2951 return false; 3042 return false;
2952 3043
2953 drive::DriveSystemService* system_service = 3044 drive::DriveSystemService* system_service =
2954 drive::DriveSystemServiceFactory::GetForProfile(profile_); 3045 drive::DriveSystemServiceFactory::GetForProfile(profile_);
2955 // |system_service| is NULL if Drive is disabled. 3046 // |system_service| is NULL if Drive is disabled.
2956 if (!system_service || !system_service->file_system()) 3047 if (!system_service || !system_service->file_system())
2957 return false; 3048 return false;
2958 3049
2959 FilePath directory_path = GetVirtualPathFromURL(GURL(file_url_as_string)); 3050 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
3051 scoped_refptr<fileapi::FileSystemContext> file_system_context =
3052 BrowserContext::GetStoragePartition(profile(), site_instance)->
3053 GetFileSystemContext();
3054
3055 FilePath directory_path = GetVirtualPathFromURL(file_system_context,
3056 GURL(file_url_as_string));
2960 system_service->file_system()->RequestDirectoryRefresh(directory_path); 3057 system_service->file_system()->RequestDirectoryRefresh(directory_path);
2961 3058
2962 return true; 3059 return true;
2963 } 3060 }
2964 3061
2965 ZipSelectionFunction::ZipSelectionFunction() { 3062 ZipSelectionFunction::ZipSelectionFunction() {
2966 } 3063 }
2967 3064
2968 ZipSelectionFunction::~ZipSelectionFunction() { 3065 ZipSelectionFunction::~ZipSelectionFunction() {
2969 } 3066 }
2970 3067
2971 bool ZipSelectionFunction::RunImpl() { 3068 bool ZipSelectionFunction::RunImpl() {
2972 if (args_->GetSize() < 3) { 3069 if (args_->GetSize() < 3) {
2973 return false; 3070 return false;
2974 } 3071 }
2975 3072
2976 // First param is the source directory URL. 3073 // First param is the source directory URL.
2977 std::string dir_url; 3074 std::string dir_url;
2978 if (!args_->GetString(0, &dir_url) || dir_url.empty()) 3075 if (!args_->GetString(0, &dir_url) || dir_url.empty())
2979 return false; 3076 return false;
2980 3077
2981 FilePath src_dir = GetLocalPathFromURL(GURL(dir_url)); 3078 content::SiteInstance* site_instance = render_view_host()->GetSiteInstance();
3079 scoped_refptr<fileapi::FileSystemContext> file_system_context =
3080 BrowserContext::GetStoragePartition(profile(), site_instance)->
3081 GetFileSystemContext();
3082
3083 FilePath src_dir = GetLocalPathFromURL(file_system_context,
3084 GURL(dir_url));
2982 if (src_dir.empty()) 3085 if (src_dir.empty())
2983 return false; 3086 return false;
2984 3087
2985 // Second param is the list of selected file URLs. 3088 // Second param is the list of selected file URLs.
2986 ListValue* selection_urls = NULL; 3089 ListValue* selection_urls = NULL;
2987 args_->GetList(1, &selection_urls); 3090 args_->GetList(1, &selection_urls);
2988 if (!selection_urls || !selection_urls->GetSize()) 3091 if (!selection_urls || !selection_urls->GetSize())
2989 return false; 3092 return false;
2990 3093
2991 std::vector<FilePath> files; 3094 std::vector<FilePath> files;
2992 for (size_t i = 0; i < selection_urls->GetSize(); ++i) { 3095 for (size_t i = 0; i < selection_urls->GetSize(); ++i) {
2993 std::string file_url; 3096 std::string file_url;
2994 selection_urls->GetString(i, &file_url); 3097 selection_urls->GetString(i, &file_url);
2995 FilePath path = GetLocalPathFromURL(GURL(file_url)); 3098 FilePath path = GetLocalPathFromURL(file_system_context, GURL(file_url));
2996 if (path.empty()) 3099 if (path.empty())
2997 return false; 3100 return false;
2998 files.push_back(path); 3101 files.push_back(path);
2999 } 3102 }
3000 3103
3001 // Third param is the name of the output zip file. 3104 // Third param is the name of the output zip file.
3002 std::string dest_name; 3105 std::string dest_name;
3003 if (!args_->GetString(2, &dest_name) || dest_name.empty()) 3106 if (!args_->GetString(2, &dest_name) || dest_name.empty())
3004 return false; 3107 return false;
3005 3108
(...skipping 24 matching lines...) Expand all
3030 // Keep the refcount until the zipping is complete on utility process. 3133 // Keep the refcount until the zipping is complete on utility process.
3031 AddRef(); 3134 AddRef();
3032 return true; 3135 return true;
3033 } 3136 }
3034 3137
3035 void ZipSelectionFunction::OnZipDone(bool success) { 3138 void ZipSelectionFunction::OnZipDone(bool success) {
3036 SetResult(new base::FundamentalValue(success)); 3139 SetResult(new base::FundamentalValue(success));
3037 SendResponse(true); 3140 SendResponse(true);
3038 Release(); 3141 Release();
3039 } 3142 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698