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" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/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/browser_thread.h" 177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "content/public/browser/storage_partition.h" 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "net/base/escape.h" 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_file_info.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_instance.h" 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ppapi/c/pp_resource.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" 367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation.h" 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_operation_runner.h" 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/browser/fileapi/file_system_url.h" 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "webkit/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, 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const std::string& path) : host_(host), 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) render_process_id_(render_process_id), 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fs_host_(fs_host), 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) fs_type_(fs_host->GetType()), 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) path_(path), 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) weak_factory_(this) { 567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::NormalizeInternalPath(&path_); 577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)PepperInternalFileRefBackend::~PepperInternalFileRefBackend() { 607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)fileapi::FileSystemURL PepperInternalFileRefBackend::GetFileSystemURL() const { 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!fs_url_.is_valid() && fs_host_.get() && fs_host_->IsOpened()) { 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GURL fs_path = fs_host_->GetRootUrl().Resolve( 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) net::EscapePath(path_.substr(1))); 66424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) scoped_refptr<fileapi::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) 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)scoped_refptr<fileapi::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, 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::PlatformFileError error) { 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) context.params.set_result(ppapi::PlatformFileErrorToPepperError(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, 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool make_ancestors) { 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(), 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) false, 1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) make_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) 149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch fileapi::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, 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) fileapi::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, 1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::PlatformFileError error, 1827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::PlatformFileInfo& file_info) { 1837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) reply_context.params.set_result(ppapi::PlatformFileErrorToPepperError(error)); 1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PP_FileInfo pp_file_info; 1867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (error == base::PLATFORM_FILE_OK) 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::PlatformFileInfoToPepperFileInfo(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) 2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemContext()->operation_runner()->ReadDirectory( 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetFileSystemURL(), 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::Bind(&PepperInternalFileRefBackend::ReadDirectoryComplete, 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) weak_factory_.GetWeakPtr(), 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) reply_context)); 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void PepperInternalFileRefBackend::ReadDirectoryComplete( 2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext context, 2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::PlatformFileError error, 2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const fileapi::FileSystemOperation::FileEntryList& file_list, 2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool has_more) { 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // The current filesystem backend always returns false. 2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(!has_more); 2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) context.params.set_result(ppapi::PlatformFileErrorToPepperError(error)); 2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 218d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) std::vector<ppapi::FileRefCreateInfo> infos; 2197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<PP_FileType> file_types; 2207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (error == base::PLATFORM_FILE_OK && fs_host_.get()) { 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string dir_path = path_; 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (dir_path.empty() || dir_path[dir_path.size() - 1] != '/') 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dir_path += '/'; 2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (fileapi::FileSystemOperation::FileEntryList::const_iterator it = 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) file_list.begin(); it != file_list.end(); ++it) { 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (it->is_directory) 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) file_types.push_back(PP_FILETYPE_DIRECTORY); 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) file_types.push_back(PP_FILETYPE_REGULAR); 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 232d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) ppapi::FileRefCreateInfo info; 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.file_system_type = fs_type_; 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.file_system_plugin_resource = fs_host_->pp_resource(); 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::string path = 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) dir_path + fileapi::FilePathToString(base::FilePath(it->name)); 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.internal_path = path; 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) info.display_name = ppapi::GetNameForInternalFilePath(path); 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) infos.push_back(info); 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host_->SendReply(context, 2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiPluginMsg_FileRef_ReadDirectoryEntriesReply(infos, file_types)); 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)int32_t PepperInternalFileRefBackend::GetAbsolutePath( 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ppapi::host::ReplyMessageContext reply_context) { 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) host_->SendReply(reply_context, 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) PpapiPluginMsg_FileRef_GetAbsolutePathReply(path_)); 2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return PP_OK_COMPLETIONPENDING; 2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 254558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanRead() const { 255558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch fileapi::FileSystemURL url = GetFileSystemURL(); 256558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FileSystemURLIsValid(GetFileSystemContext().get(), url)) 257558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 258558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!ChildProcessSecurityPolicyImpl::GetInstance()-> 259558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CanReadFileSystemFile(render_process_id_, url)) { 260558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_NOACCESS; 261558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 262558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_OK; 263558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 264558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 265558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanWrite() const { 266558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch fileapi::FileSystemURL url = GetFileSystemURL(); 267558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FileSystemURLIsValid(GetFileSystemContext().get(), url)) 268558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 269558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!ChildProcessSecurityPolicyImpl::GetInstance()-> 270558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CanWriteFileSystemFile(render_process_id_, url)) { 271558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_NOACCESS; 272558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 273558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_OK; 274558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 275558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 276558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanCreate() const { 277558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch fileapi::FileSystemURL url = GetFileSystemURL(); 278558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FileSystemURLIsValid(GetFileSystemContext().get(), url)) 279558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 280558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!ChildProcessSecurityPolicyImpl::GetInstance()-> 281558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch CanCreateFileSystemFile(render_process_id_, url)) { 282558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_NOACCESS; 283558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 284558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_OK; 285558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch} 286558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 287558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdochint32_t PepperInternalFileRefBackend::CanReadWrite() const { 288558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch fileapi::FileSystemURL url = GetFileSystemURL(); 289558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!FileSystemURLIsValid(GetFileSystemContext().get(), url)) 290558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_FAILED; 291558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ChildProcessSecurityPolicyImpl* policy = 292558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch ChildProcessSecurityPolicyImpl::GetInstance(); 293558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch if (!policy->CanReadFileSystemFile(render_process_id_, url) || 294558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch !policy->CanWriteFileSystemFile(render_process_id_, url)) { 295558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_ERROR_NOACCESS; 296558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch } 297558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return PP_OK; 2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace content 301