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

Side by Side Diff: chrome/browser/extensions/api/file_system/file_system_api.cc

Issue 12319138: Make chrome.filesystem API fully work with the Chrome OS Google Drive folder. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 7 years, 9 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 | « chrome/browser/extensions/api/file_system/file_system_api.h ('k') | no next file » | 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 "chrome/browser/extensions/api/file_system/file_system_api.h" 5 #include "chrome/browser/extensions/api/file_system/file_system_api.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/file_util.h" 8 #include "base/file_util.h"
9 #include "base/files/file_path.h" 9 #include "base/files/file_path.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
(...skipping 21 matching lines...) Expand all
32 #include "webkit/fileapi/external_mount_points.h" 32 #include "webkit/fileapi/external_mount_points.h"
33 #include "webkit/fileapi/file_system_types.h" 33 #include "webkit/fileapi/file_system_types.h"
34 #include "webkit/fileapi/file_system_util.h" 34 #include "webkit/fileapi/file_system_util.h"
35 #include "webkit/fileapi/isolated_context.h" 35 #include "webkit/fileapi/isolated_context.h"
36 36
37 #if defined(OS_MACOSX) 37 #if defined(OS_MACOSX)
38 #include <CoreFoundation/CoreFoundation.h> 38 #include <CoreFoundation/CoreFoundation.h>
39 #include "base/mac/foundation_util.h" 39 #include "base/mac/foundation_util.h"
40 #endif 40 #endif
41 41
42 #if defined(OS_CHROMEOS)
43 #include "chrome/browser/chromeos/drive/drive_file_system_util.h"
44 #endif
45
42 using fileapi::IsolatedContext; 46 using fileapi::IsolatedContext;
43 47
44 const char kInvalidParameters[] = "Invalid parameters"; 48 const char kInvalidParameters[] = "Invalid parameters";
45 const char kSecurityError[] = "Security error"; 49 const char kSecurityError[] = "Security error";
46 const char kInvalidCallingPage[] = "Invalid calling page. This function can't " 50 const char kInvalidCallingPage[] = "Invalid calling page. This function can't "
47 "be called from a background page."; 51 "be called from a background page.";
48 const char kUserCancelled[] = "User cancelled"; 52 const char kUserCancelled[] = "User cancelled";
49 const char kWritableFileError[] = "Invalid file for writing"; 53 const char kWritableFileError[] = "Invalid file for writing";
50 const char kRequiresFileSystemWriteError[] = 54 const char kRequiresFileSystemWriteError[] =
51 "Operation requires fileSystem.write permission"; 55 "Operation requires fileSystem.write permission";
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
185 base::PLATFORM_FILE_WRITE; 189 base::PLATFORM_FILE_WRITE;
186 base::PlatformFile file = base::CreatePlatformFile(path, creation_flags, 190 base::PlatformFile file = base::CreatePlatformFile(path, creation_flags,
187 NULL, &error); 191 NULL, &error);
188 // Close the file so we don't keep a lock open. 192 // Close the file so we don't keep a lock open.
189 if (file != base::kInvalidPlatformFileValue) 193 if (file != base::kInvalidPlatformFileValue)
190 base::ClosePlatformFile(file); 194 base::ClosePlatformFile(file);
191 return error == base::PLATFORM_FILE_OK || 195 return error == base::PLATFORM_FILE_OK ||
192 error == base::PLATFORM_FILE_ERROR_EXISTS; 196 error == base::PLATFORM_FILE_ERROR_EXISTS;
193 } 197 }
194 198
199 void CheckLocalWritableFile(const base::FilePath& path,
200 const base::Closure& on_success,
201 const base::Closure& on_failure) {
202 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE));
203 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
204 DoCheckWritableFile(path) ? on_success : on_failure);
205 }
206
207 #if defined(OS_CHROMEOS)
208 void CheckRemoteWritableFile(const base::Closure& on_success,
209 const base::Closure& on_failure,
210 drive::DriveFileError error,
211 const base::FilePath& path) {
212 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE,
213 error == drive::DRIVE_FILE_OK ? on_success : on_failure);
214 }
215 #endif
216
195 // Expand the mime-types and extensions provided in an AcceptOption, returning 217 // Expand the mime-types and extensions provided in an AcceptOption, returning
196 // them within the passed extension vector. Returns false if no valid types 218 // them within the passed extension vector. Returns false if no valid types
197 // were found. 219 // were found.
198 bool GetFileTypesFromAcceptOption( 220 bool GetFileTypesFromAcceptOption(
199 const file_system::AcceptOption& accept_option, 221 const file_system::AcceptOption& accept_option,
200 std::vector<base::FilePath::StringType>* extensions, 222 std::vector<base::FilePath::StringType>* extensions,
201 string16* description) { 223 string16* description) {
202 std::set<base::FilePath::StringType> extension_set; 224 std::set<base::FilePath::StringType> extension_set;
203 int description_id = 0; 225 int description_id = 0;
204 226
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 299
278 bool FileSystemEntryFunction::HasFileSystemWritePermission() { 300 bool FileSystemEntryFunction::HasFileSystemWritePermission() {
279 const extensions::Extension* extension = GetExtension(); 301 const extensions::Extension* extension = GetExtension();
280 if (!extension) 302 if (!extension)
281 return false; 303 return false;
282 304
283 return extension->HasAPIPermission(APIPermission::kFileSystemWrite); 305 return extension->HasAPIPermission(APIPermission::kFileSystemWrite);
284 } 306 }
285 307
286 void FileSystemEntryFunction::CheckWritableFile(const base::FilePath& path) { 308 void FileSystemEntryFunction::CheckWritableFile(const base::FilePath& path) {
287 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::FILE)); 309 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
288 if (DoCheckWritableFile(path)) { 310 base::Closure on_success =
289 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, 311 base::Bind(&FileSystemEntryFunction::RegisterFileSystemAndSendResponse,
290 base::Bind(&FileSystemEntryFunction::RegisterFileSystemAndSendResponse, 312 this, path, WRITABLE);
291 this, path, WRITABLE)); 313 base::Closure on_failure =
314 base::Bind(&FileSystemEntryFunction::HandleWritableFileError, this);
315
316 #if defined(OS_CHROMEOS)
317 if (drive::util::IsUnderDriveMountPoint(path)) {
318 drive::util::PrepareWritableFileAndRun(profile_, path,
319 base::Bind(&CheckRemoteWritableFile, on_success, on_failure));
292 return; 320 return;
293 } 321 }
294 322 #endif
295 content::BrowserThread::PostTask(content::BrowserThread::UI, FROM_HERE, 323 content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE,
296 base::Bind(&FileSystemEntryFunction::HandleWritableFileError, this)); 324 base::Bind(&CheckLocalWritableFile, path, on_success, on_failure));
297 } 325 }
298 326
299 void FileSystemEntryFunction::RegisterFileSystemAndSendResponse( 327 void FileSystemEntryFunction::RegisterFileSystemAndSendResponse(
300 const base::FilePath& path, EntryType entry_type) { 328 const base::FilePath& path, EntryType entry_type) {
301 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 329 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
302 330
303 fileapi::IsolatedContext* isolated_context = 331 fileapi::IsolatedContext* isolated_context =
304 fileapi::IsolatedContext::GetInstance(); 332 fileapi::IsolatedContext::GetInstance();
305 DCHECK(isolated_context); 333 DCHECK(isolated_context);
306 334
(...skipping 27 matching lines...) Expand all
334 if (!HasFileSystemWritePermission()) { 362 if (!HasFileSystemWritePermission()) {
335 error_ = kRequiresFileSystemWriteError; 363 error_ = kRequiresFileSystemWriteError;
336 return false; 364 return false;
337 } 365 }
338 366
339 base::FilePath path; 367 base::FilePath path;
340 if (!GetFilePathOfFileEntry(filesystem_name, filesystem_path, 368 if (!GetFilePathOfFileEntry(filesystem_name, filesystem_path,
341 render_view_host_, &path, &error_)) 369 render_view_host_, &path, &error_))
342 return false; 370 return false;
343 371
344 content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, 372 CheckWritableFile(path);
345 base::Bind(&FileSystemGetWritableEntryFunction::CheckWritableFile,
346 this, path));
347 return true; 373 return true;
348 } 374 }
349 375
350 bool FileSystemIsWritableEntryFunction::RunImpl() { 376 bool FileSystemIsWritableEntryFunction::RunImpl() {
351 std::string filesystem_name; 377 std::string filesystem_name;
352 std::string filesystem_path; 378 std::string filesystem_path;
353 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &filesystem_name)); 379 EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &filesystem_name));
354 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &filesystem_path)); 380 EXTENSION_FUNCTION_VALIDATE(args_->GetString(1, &filesystem_path));
355 381
356 std::string filesystem_id; 382 std::string filesystem_id;
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 // For testing on Chrome OS, where to deal with remote and local paths 530 // For testing on Chrome OS, where to deal with remote and local paths
505 // smoothly, all accessed paths need to be registered in the list of 531 // smoothly, all accessed paths need to be registered in the list of
506 // external mount points. 532 // external mount points.
507 fileapi::ExternalMountPoints::GetSystemInstance()->RegisterFileSystem( 533 fileapi::ExternalMountPoints::GetSystemInstance()->RegisterFileSystem(
508 name, fileapi::kFileSystemTypeNativeLocal, path); 534 name, fileapi::kFileSystemTypeNativeLocal, path);
509 } 535 }
510 536
511 void FileSystemChooseEntryFunction::FileSelected(const base::FilePath& path, 537 void FileSystemChooseEntryFunction::FileSelected(const base::FilePath& path,
512 EntryType entry_type) { 538 EntryType entry_type) {
513 if (entry_type == WRITABLE) { 539 if (entry_type == WRITABLE) {
514 content::BrowserThread::PostTask(content::BrowserThread::FILE, FROM_HERE, 540 CheckWritableFile(path);
515 base::Bind(&FileSystemChooseEntryFunction::CheckWritableFile,
516 this, path));
517 return; 541 return;
518 } 542 }
519 543
520 // Don't need to check the file, it's for reading. 544 // Don't need to check the file, it's for reading.
521 RegisterFileSystemAndSendResponse(path, READ_ONLY); 545 RegisterFileSystemAndSendResponse(path, READ_ONLY);
522 } 546 }
523 547
524 void FileSystemChooseEntryFunction::FileSelectionCanceled() { 548 void FileSystemChooseEntryFunction::FileSelectionCanceled() {
525 error_ = kUserCancelled; 549 error_ = kUserCancelled;
526 SendResponse(false); 550 SendResponse(false);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 640
617 BuildFileTypeInfo(&file_type_info, suggested_extension, 641 BuildFileTypeInfo(&file_type_info, suggested_extension,
618 options->accepts.get(), options->accepts_all_types.get()); 642 options->accepts.get(), options->accepts_all_types.get());
619 } 643 }
620 644
621 if (entry_type == WRITABLE && !HasFileSystemWritePermission()) { 645 if (entry_type == WRITABLE && !HasFileSystemWritePermission()) {
622 error_ = kRequiresFileSystemWriteError; 646 error_ = kRequiresFileSystemWriteError;
623 return false; 647 return false;
624 } 648 }
625 649
626 if (entry_type != WRITABLE) 650 file_type_info.support_drive = true;
627 file_type_info.support_drive = true;
628
629 return ShowPicker(suggested_name, file_type_info, picker_type, entry_type); 651 return ShowPicker(suggested_name, file_type_info, picker_type, entry_type);
630 } 652 }
631 653
632 } // namespace extensions 654 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/api/file_system/file_system_api.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698