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