|  | // Copyright 2017 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "content/browser/renderer_host/file_utilities_host_impl.h" | 
|  |  | 
|  | #include <utility> | 
|  |  | 
|  | #include "base/files/file_util.h" | 
|  | #include "base/optional.h" | 
|  | #include "content/browser/child_process_security_policy_impl.h" | 
|  | #include "mojo/public/cpp/bindings/strong_binding.h" | 
|  |  | 
|  | namespace content { | 
|  |  | 
|  | FileUtilitiesHostImpl::FileUtilitiesHostImpl(int process_id) | 
|  | : process_id_(process_id) {} | 
|  |  | 
|  | FileUtilitiesHostImpl::~FileUtilitiesHostImpl() = default; | 
|  |  | 
|  | void FileUtilitiesHostImpl::Create( | 
|  | int process_id, | 
|  | blink::mojom::FileUtilitiesHostRequest request) { | 
|  | mojo::MakeStrongBinding(std::make_unique<FileUtilitiesHostImpl>(process_id), | 
|  | std::move(request)); | 
|  | } | 
|  |  | 
|  | void FileUtilitiesHostImpl::GetFileInfo(const base::FilePath& path, | 
|  | GetFileInfoCallback callback) { | 
|  | // Get file metadata only when the child process has been granted | 
|  | // permission to read the file. | 
|  | auto* security_policy = ChildProcessSecurityPolicyImpl::GetInstance(); | 
|  | if (!security_policy->CanReadFile(process_id_, path)) { | 
|  | std::move(callback).Run(base::nullopt); | 
|  | return; | 
|  | } | 
|  |  | 
|  | base::File::Info info; | 
|  | if (base::GetFileInfo(path, &info)) { | 
|  | std::move(callback).Run(info); | 
|  | } else { | 
|  | std::move(callback).Run(base::nullopt); | 
|  | } | 
|  | } | 
|  |  | 
|  | }  // namespace content |