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

Side by Side Diff: chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc

Issue 985533004: Implement chrome.fileSystem.requestFileSystem(). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed kiosk mode. Created 5 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
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 "chrome/browser/chromeos/extensions/file_manager/private_api_file_syste m.h" 5 #include "chrome/browser/chromeos/extensions/file_manager/private_api_file_syste m.h"
6 6
7 #include <sys/statvfs.h> 7 #include <sys/statvfs.h>
8 #include <set> 8 #include <set>
9 9
10 #include "base/posix/eintr_wrapper.h" 10 #include "base/posix/eintr_wrapper.h"
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 const storage::FileSystemOperation::GetMetadataCallback& callback, 233 const storage::FileSystemOperation::GetMetadataCallback& callback,
234 base::File::Error result, 234 base::File::Error result,
235 const base::File::Info& file_info) { 235 const base::File::Info& file_info) {
236 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 236 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
237 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 237 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
238 base::Bind(callback, result, file_info)); 238 base::Bind(callback, result, file_info));
239 } 239 }
240 240
241 } // namespace 241 } // namespace
242 242
243 void FileManagerPrivateRequestFileSystemFunction::DidFail(
244 base::File::Error error_code) {
245 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
246
247 SetError(base::StringPrintf("File error %d", static_cast<int>(error_code)));
248 SendResponse(false);
249 }
250
251 bool FileManagerPrivateRequestFileSystemFunction::
252 SetupFileSystemAccessPermissions(
253 scoped_refptr<storage::FileSystemContext> file_system_context,
254 int child_id,
255 Profile* profile,
256 scoped_refptr<const extensions::Extension> extension,
257 const base::FilePath& mount_path,
258 const base::FilePath& virtual_path) {
259 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
260
261 if (!extension.get())
262 return false;
263
264 storage::ExternalFileSystemBackend* const backend =
265 file_system_context->external_backend();
266 if (!backend)
267 return false;
268
269 backend->GrantFileAccessToExtension(extension_->id(), virtual_path);
270
271 // Grant R/W file permissions to the renderer hosting component
272 // extension to the mount path of the volume.
273 ChildProcessSecurityPolicy::GetInstance()->GrantCreateReadWriteFile(
274 child_id, mount_path);
275
276 return true;
277 }
278
279 bool FileManagerPrivateRequestFileSystemFunction::RunAsync() {
280 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
281 using extensions::api::file_manager_private::RequestFileSystem::Params;
282 const scoped_ptr<Params> params(Params::Create(*args_));
283 EXTENSION_FUNCTION_VALIDATE(params);
284
285 if (!dispatcher() || !render_view_host() || !render_view_host()->GetProcess())
286 return false;
287
288 set_log_on_completion(true);
289
290 using file_manager::VolumeManager;
291 using file_manager::VolumeInfo;
292 VolumeManager* const volume_manager = VolumeManager::Get(GetProfile());
293 if (!volume_manager)
294 return false;
295
296 VolumeInfo volume_info;
297 if (!volume_manager->FindVolumeInfoById(params->volume_id, &volume_info)) {
298 DidFail(base::File::FILE_ERROR_NOT_FOUND);
299 return false;
300 }
301
302 scoped_refptr<storage::FileSystemContext> file_system_context =
303 file_manager::util::GetFileSystemContextForRenderViewHost(
304 GetProfile(), render_view_host());
305
306 FileDefinition file_definition;
307 if (!file_manager::util::ConvertAbsoluteFilePathToRelativeFileSystemPath(
308 GetProfile(),
309 extension_id(),
310 volume_info.mount_path,
311 &file_definition.virtual_path)) {
312 DidFail(base::File::FILE_ERROR_INVALID_OPERATION);
313 return false;
314 }
315 file_definition.is_directory = true;
316
317 // Set up file permission access.
318 const int child_id = render_view_host()->GetProcess()->GetID();
319 if (!SetupFileSystemAccessPermissions(
320 file_system_context, child_id, GetProfile(), extension(),
321 volume_info.mount_path, file_definition.virtual_path)) {
322 DidFail(base::File::FILE_ERROR_SECURITY);
323 return false;
324 }
325
326 file_manager::util::ConvertFileDefinitionToEntryDefinition(
327 GetProfile(),
328 extension_id(),
329 file_definition,
330 base::Bind(
331 &FileManagerPrivateRequestFileSystemFunction::OnEntryDefinition,
332 this));
333 return true;
334 }
335
336 void FileManagerPrivateRequestFileSystemFunction::OnEntryDefinition(
337 const EntryDefinition& entry_definition) {
338 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
339
340 if (entry_definition.error != base::File::FILE_OK) {
341 DidFail(entry_definition.error);
342 return;
343 }
344
345 if (!entry_definition.is_directory) {
346 DidFail(base::File::FILE_ERROR_NOT_A_DIRECTORY);
347 return;
348 }
349
350 base::DictionaryValue* dict = new base::DictionaryValue();
351 SetResult(dict);
352 dict->SetString("name", entry_definition.file_system_name);
353 dict->SetString("root_url", entry_definition.file_system_root_url);
354 dict->SetInteger("error", drive::FILE_ERROR_OK);
355 SendResponse(true);
356 }
357
358 ExtensionFunction::ResponseAction 243 ExtensionFunction::ResponseAction
359 FileManagerPrivateEnableExternalFileSchemeFunction::Run() { 244 FileManagerPrivateEnableExternalFileSchemeFunction::Run() {
360 ChildProcessSecurityPolicy::GetInstance()->GrantScheme( 245 ChildProcessSecurityPolicy::GetInstance()->GrantScheme(
361 render_view_host()->GetProcess()->GetID(), content::kExternalFileScheme); 246 render_view_host()->GetProcess()->GetID(), content::kExternalFileScheme);
362 return RespondNow(NoArguments()); 247 return RespondNow(NoArguments());
363 } 248 }
364 249
365 FileManagerPrivateGrantAccessFunction::FileManagerPrivateGrantAccessFunction() 250 FileManagerPrivateGrantAccessFunction::FileManagerPrivateGrantAccessFunction()
366 : chrome_details_(this) { 251 : chrome_details_(this) {
367 } 252 }
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 file_manager::util::GetFileSystemContextForRenderViewHost( 676 file_manager::util::GetFileSystemContextForRenderViewHost(
792 GetProfile(), render_view_host()); 677 GetProfile(), render_view_host());
793 DCHECK(file_system_context.get()); 678 DCHECK(file_system_context.get());
794 679
795 const storage::ExternalFileSystemBackend* external_backend = 680 const storage::ExternalFileSystemBackend* external_backend =
796 file_system_context->external_backend(); 681 file_system_context->external_backend();
797 DCHECK(external_backend); 682 DCHECK(external_backend);
798 683
799 file_manager::util::FileDefinitionList file_definition_list; 684 file_manager::util::FileDefinitionList file_definition_list;
800 for (size_t i = 0; i < params->urls.size(); ++i) { 685 for (size_t i = 0; i < params->urls.size(); ++i) {
801 FileSystemURL fileSystemUrl = 686 const FileSystemURL file_system_url =
802 file_system_context->CrackURL(GURL(params->urls[i])); 687 file_system_context->CrackURL(GURL(params->urls[i]));
803 DCHECK(external_backend->CanHandleType(fileSystemUrl.type())); 688 DCHECK(external_backend->CanHandleType(file_system_url.type()));
804
805 FileDefinition file_definition; 689 FileDefinition file_definition;
806 const bool result = 690 const bool result =
807 file_manager::util::ConvertAbsoluteFilePathToRelativeFileSystemPath( 691 file_manager::util::ConvertAbsoluteFilePathToRelativeFileSystemPath(
808 GetProfile(), 692 GetProfile(), extension_->id(), file_system_url.path(),
809 extension_->id(),
810 fileSystemUrl.path(),
811 &file_definition.virtual_path); 693 &file_definition.virtual_path);
812 if (!result) 694 if (!result)
813 continue; 695 continue;
814 // The API only supports isolated files. 696 // The API only supports isolated files. It still works for directories,
697 // as the value is ignored for existing entries.
815 file_definition.is_directory = false; 698 file_definition.is_directory = false;
816 file_definition_list.push_back(file_definition); 699 file_definition_list.push_back(file_definition);
817 } 700 }
818 701
819 file_manager::util::ConvertFileDefinitionListToEntryDefinitionList( 702 file_manager::util::ConvertFileDefinitionListToEntryDefinitionList(
820 GetProfile(), 703 GetProfile(),
821 extension_->id(), 704 extension_->id(),
822 file_definition_list, // Safe, since copied internally. 705 file_definition_list, // Safe, since copied internally.
823 base::Bind( 706 base::Bind(
824 &FileManagerPrivateInternalResolveIsolatedEntriesFunction:: 707 &FileManagerPrivateInternalResolveIsolatedEntriesFunction::
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1014 return RespondLater(); 897 return RespondLater();
1015 } 898 }
1016 899
1017 void FileManagerPrivateSetEntryTagFunction::OnSetEntryPropertyCompleted( 900 void FileManagerPrivateSetEntryTagFunction::OnSetEntryPropertyCompleted(
1018 drive::FileError result) { 901 drive::FileError result) {
1019 Respond(result == drive::FILE_ERROR_OK ? NoArguments() 902 Respond(result == drive::FILE_ERROR_OK ? NoArguments()
1020 : Error("Failed to set a tag.")); 903 : Error("Failed to set a tag."));
1021 } 904 }
1022 905
1023 } // namespace extensions 906 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698