17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_internal_file_ref_backend.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string> 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/callback.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/files/file_util.h" 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/files/file_util_proxy.h" 12558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch#include "content/browser/child_process_security_policy_impl.h" 137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/fileapi/browser_file_system_helper.h" 147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/browser/renderer_host/pepper/pepper_file_system_browser_host.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/browser_context.h" 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/base/escape.h" 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_file_info.h" 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_instance.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_resource.h" 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ppapi/c/ppb_file_ref.h" 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/dispatch_host_message.h" 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/host/ppapi_host.h" 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/proxy/ppapi_messages.h" 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/file_ref_create_info.h" 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/file_ref_util.h" 297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/file_type_conversion.h" 307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/scoped_pp_var.h" 317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/time_conversion.h" 327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/shared_impl/var.h" 337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/thunk/enter.h" 347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/thunk/ppb_file_ref_api.h" 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/thunk/ppb_file_system_api.h" 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation.h" 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_operation_runner.h" 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/browser/fileapi/file_system_url.h" 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "storage/common/fileapi/file_system_util.h" 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ppapi::host::PpapiHost; 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)using ppapi::host::ResourceHost; 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace content { 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperInternalFileRefBackend::PepperInternalFileRefBackend( 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiHost* host, 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int render_process_id, 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::WeakPtr<PepperFileSystemBrowserHost> fs_host, 50a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch const std::string& path) 51a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch : host_(host), 52a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_process_id_(render_process_id), 53a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch fs_host_(fs_host), 54a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch fs_type_(fs_host->GetType()), 55a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch path_(path), 56a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch weak_factory_(this) { 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::NormalizeInternalPath(&path_); 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 60a02191e04bc25c4935f804f2c080ae28663d096dBen MurdochPepperInternalFileRefBackend::~PepperInternalFileRefBackend() {} 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 6203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)storage::FileSystemURL PepperInternalFileRefBackend::GetFileSystemURL() const { 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!fs_url_.is_valid() && fs_host_.get() && fs_host_->IsOpened()) { 64a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GURL fs_path = 65a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch fs_host_->GetRootUrl().Resolve(net::EscapePath(path_.substr(1))); 6603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_refptr<storage::FileSystemContext> fs_context = 67424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) GetFileSystemContext(); 68424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if (fs_context.get()) 69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) fs_url_ = fs_context->CrackURL(fs_path); 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return fs_url_; 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)base::FilePath PepperInternalFileRefBackend::GetExternalFilePath() const { 758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return base::FilePath(); 768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)} 778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 7803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)scoped_refptr<storage::FileSystemContext> 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperInternalFileRefBackend::GetFileSystemContext() const { 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!fs_host_.get()) 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return NULL; 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return fs_host_->GetFileSystemContext(); 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PepperInternalFileRefBackend::DidFinish( 867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext context, 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const IPC::Message& msg, 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error) { 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context.params.set_result(ppapi::FileErrorToPepperError(error)); 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host_->SendReply(context, msg); 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::MakeDirectory( 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int32_t make_directory_flags) { 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!GetFileSystemURL().is_valid()) 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemContext()->operation_runner()->CreateDirectory( 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemURL(), 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !!(make_directory_flags & PP_MAKEDIRECTORYFLAG_EXCLUSIVE), 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !!(make_directory_flags & PP_MAKEDIRECTORYFLAG_WITH_ANCESTORS), 1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&PepperInternalFileRefBackend::DidFinish, 1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) weak_factory_.GetWeakPtr(), 1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) reply_context, 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiPluginMsg_FileRef_MakeDirectoryReply())); 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::Touch( 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Time last_access_time, 1137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_Time last_modified_time) { 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!GetFileSystemURL().is_valid()) 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemContext()->operation_runner()->TouchFile( 1187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemURL(), 1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::PPTimeToTime(last_access_time), 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::PPTimeToTime(last_modified_time), 1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&PepperInternalFileRefBackend::DidFinish, 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) weak_factory_.GetWeakPtr(), 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) reply_context, 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiPluginMsg_FileRef_TouchReply())); 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::Delete( 1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context) { 1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!GetFileSystemURL().is_valid()) 1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemContext()->operation_runner()->Remove( 1347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemURL(), 1357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false, 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&PepperInternalFileRefBackend::DidFinish, 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) weak_factory_.GetWeakPtr(), 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) reply_context, 1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiPluginMsg_FileRef_DeleteReply())); 1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::Rename( 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch PepperFileRefHost* new_file_ref) { 1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!GetFileSystemURL().is_valid()) 1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 14903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemURL new_url = new_file_ref->GetFileSystemURL(); 1507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!new_url.is_valid()) 1517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!new_url.IsInSameFileSystem(GetFileSystemURL())) 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemContext()->operation_runner()->Move( 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemURL(), 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) new_url, 15803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemOperation::OPTION_NONE, 1597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&PepperInternalFileRefBackend::DidFinish, 1607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) weak_factory_.GetWeakPtr(), 1617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) reply_context, 1627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiPluginMsg_FileRef_RenameReply())); 1637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::Query( 1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context) { 1687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!GetFileSystemURL().is_valid()) 1697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemContext()->operation_runner()->GetMetadata( 1727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemURL(), 1737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&PepperInternalFileRefBackend::GetMetadataComplete, 1747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) weak_factory_.GetWeakPtr(), 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) reply_context)); 1767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 1777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PepperInternalFileRefBackend::GetMetadataComplete( 1807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context, 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error, 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::File::Info& file_info) { 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) reply_context.params.set_result(ppapi::FileErrorToPepperError(error)); 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_FileInfo pp_file_info; 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error == base::File::FILE_OK) 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ppapi::FileInfoToPepperFileInfo(file_info, fs_type_, &pp_file_info); 1887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 1897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) memset(&pp_file_info, 0, sizeof(pp_file_info)); 1907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host_->SendReply(reply_context, 1927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiPluginMsg_FileRef_QueryReply(pp_file_info)); 1937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::ReadDirectoryEntries( 1967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context) { 1977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!GetFileSystemURL().is_valid()) 1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_ERROR_FAILED; 1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 20003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemOperation::FileEntryList* accumulated_file_list = 20103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) new storage::FileSystemOperation::FileEntryList; 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemContext()->operation_runner()->ReadDirectory( 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemURL(), 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&PepperInternalFileRefBackend::ReadDirectoryComplete, 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) weak_factory_.GetWeakPtr(), 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) reply_context, 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Owned(accumulated_file_list))); 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PepperInternalFileRefBackend::ReadDirectoryComplete( 2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext context, 21303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemOperation::FileEntryList* accumulated_file_list, 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::File::Error error, 21503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) const storage::FileSystemOperation::FileEntryList& file_list, 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool has_more) { 217a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch accumulated_file_list->insert( 218a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch accumulated_file_list->end(), file_list.begin(), file_list.end()); 219a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (has_more) 220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return; 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) context.params.set_result(ppapi::FileErrorToPepperError(error)); 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 224d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<ppapi::FileRefCreateInfo> infos; 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<PP_FileType> file_types; 2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (error == base::File::FILE_OK && fs_host_.get()) { 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string dir_path = path_; 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (dir_path.empty() || dir_path[dir_path.size() - 1] != '/') 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dir_path += '/'; 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 23103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) for (storage::FileSystemOperation::FileEntryList::const_iterator it = 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) accumulated_file_list->begin(); 233a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch it != accumulated_file_list->end(); 234a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch ++it) { 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (it->is_directory) 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) file_types.push_back(PP_FILETYPE_DIRECTORY); 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) file_types.push_back(PP_FILETYPE_REGULAR); 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 240d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ppapi::FileRefCreateInfo info; 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.file_system_type = fs_type_; 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.file_system_plugin_resource = fs_host_->pp_resource(); 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string path = 24403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) dir_path + storage::FilePathToString(base::FilePath(it->name)); 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.internal_path = path; 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.display_name = ppapi::GetNameForInternalFilePath(path); 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) infos.push_back(info); 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 251a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch host_->SendReply( 252a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch context, 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiPluginMsg_FileRef_ReadDirectoryEntriesReply(infos, file_types)); 2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::GetAbsolutePath( 2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context) { 2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host_->SendReply(reply_context, 259a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch PpapiPluginMsg_FileRef_GetAbsolutePathReply(path_)); 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 263558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanRead() const { 26403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemURL url = GetFileSystemURL(); 265558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FileSystemURLIsValid(GetFileSystemContext().get(), url)) 266558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 267a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanReadFileSystemFile( 268a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_process_id_, url)) { 269558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_NOACCESS; 270558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 271558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_OK; 272558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 273558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 274558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanWrite() const { 27503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemURL url = GetFileSystemURL(); 276558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FileSystemURLIsValid(GetFileSystemContext().get(), url)) 277558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 278a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanWriteFileSystemFile( 279a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_process_id_, url)) { 280558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_NOACCESS; 281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 282558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_OK; 283558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 285558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanCreate() const { 28603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemURL url = GetFileSystemURL(); 287558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FileSystemURLIsValid(GetFileSystemContext().get(), url)) 288558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 289a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!ChildProcessSecurityPolicyImpl::GetInstance()->CanCreateFileSystemFile( 290a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch render_process_id_, url)) { 291558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_NOACCESS; 292558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 293558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_OK; 294558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 295558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 296558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanReadWrite() const { 29703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) storage::FileSystemURL url = GetFileSystemURL(); 298558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FileSystemURLIsValid(GetFileSystemContext().get(), url)) 299558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 300558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ChildProcessSecurityPolicyImpl* policy = 301558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ChildProcessSecurityPolicyImpl::GetInstance(); 302558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!policy->CanReadFileSystemFile(render_process_id_, url) || 303558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch !policy->CanWriteFileSystemFile(render_process_id_, url)) { 304558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_NOACCESS; 305558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 306558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_OK; 3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace content 310