Commit 1d7a446a authored by Marijn Kruisselbrink's avatar Marijn Kruisselbrink Committed by Commit Bot

[FileSystem] Expose sandboxed filesystem through new API.

Implements an initial version of getSystemDirectory, with the sandboxed
filesystem being the currently only supported option.

Tbr: jbroman@chromium.org
Bug: 879265
Change-Id: Ic044b00bc650e6e6d8b4aa618dd893ed9c3190ae
Reviewed-on: https://chromium-review.googlesource.com/1197403
Commit-Queue: Marijn Kruisselbrink <mek@chromium.org>
Reviewed-by: default avatarVictor Costan <pwnall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#588106}
parent 1667a355
......@@ -265,6 +265,21 @@ void FileSystemCallbacks::OnDidOpenFileSystemV8Impl::OnSuccess(
callback_->InvokeAndReportException(nullptr, file_system);
}
FileSystemCallbacks::OnDidOpenFileSystemPromiseImpl::
OnDidOpenFileSystemPromiseImpl(ScriptPromiseResolver* resolver)
: resolver_(resolver) {}
void FileSystemCallbacks::OnDidOpenFileSystemPromiseImpl::Trace(
Visitor* visitor) {
OnDidOpenFileSystemCallback::Trace(visitor);
visitor->Trace(resolver_);
}
void FileSystemCallbacks::OnDidOpenFileSystemPromiseImpl::OnSuccess(
DOMFileSystem* file_system) {
resolver_->Resolve(file_system->root()->asFileSystemHandle());
}
std::unique_ptr<AsyncFileSystemCallbacks> FileSystemCallbacks::Create(
OnDidOpenFileSystemCallback* success_callback,
ErrorCallbackBase* error_callback,
......
......@@ -249,6 +249,16 @@ class FileSystemCallbacks final : public FileSystemCallbacksBase {
Member<V8PersistentCallbackInterface<V8FileSystemCallback>> callback_;
};
class OnDidOpenFileSystemPromiseImpl : public OnDidOpenFileSystemCallback {
public:
explicit OnDidOpenFileSystemPromiseImpl(ScriptPromiseResolver*);
void Trace(Visitor*) override;
void OnSuccess(DOMFileSystem*) override;
private:
Member<ScriptPromiseResolver> resolver_;
};
static std::unique_ptr<AsyncFileSystemCallbacks> Create(
OnDidOpenFileSystemCallback*,
ErrorCallbackBase*,
......
......@@ -7,6 +7,7 @@
#include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
#include "third_party/blink/renderer/modules/filesystem/dom_file_system_base.h"
#include "third_party/blink/renderer/modules/filesystem/file_system_callbacks.h"
#include "third_party/blink/renderer/modules/filesystem/local_file_system.h"
namespace blink {
......@@ -36,4 +37,22 @@ ScriptPromise FileSystemDirectoryHandle::getDirectory(ScriptState* script_state,
return result;
}
// static
ScriptPromise FileSystemDirectoryHandle::getSystemDirectory(
ScriptState* script_state,
const GetSystemDirectoryOptions& options) {
auto* context = ExecutionContext::From(script_state);
auto* resolver = ScriptPromiseResolver::Create(script_state);
ScriptPromise result = resolver->Promise();
LocalFileSystem::From(*context)->RequestFileSystem(
context, mojom::blink::FileSystemType::kTemporary, /*size=*/0,
FileSystemCallbacks::Create(
new FileSystemCallbacks::OnDidOpenFileSystemPromiseImpl(resolver),
new PromiseErrorCallback(resolver), context,
mojom::blink::FileSystemType::kTemporary));
return result;
}
} // namespace blink
......@@ -6,6 +6,7 @@
#define THIRD_PARTY_BLINK_RENDERER_MODULES_FILESYSTEM_FILE_SYSTEM_DIRECTORY_HANDLE_H_
#include "third_party/blink/renderer/modules/filesystem/file_system_base_handle.h"
#include "third_party/blink/renderer/modules/filesystem/get_system_directory_options.h"
namespace blink {
......@@ -18,6 +19,10 @@ class FileSystemDirectoryHandle : public FileSystemBaseHandle {
bool isDirectory() const override { return true; }
ScriptPromise getFile(ScriptState*, const String& name);
ScriptPromise getDirectory(ScriptState*, const String& name);
static ScriptPromise getSystemDirectory(
ScriptState*,
const GetSystemDirectoryOptions& options);
};
} // namespace blink
......
......@@ -9,4 +9,7 @@
[CallWith=ScriptState] Promise<FileSystemFileHandle> getFile(USVString name);
[CallWith=ScriptState] Promise<FileSystemDirectoryHandle> getDirectory(USVString name);
// TODO(mek): Other methods such as getEntries etc.
[CallWith=ScriptState]
static Promise<FileSystemDirectoryHandle> getSystemDirectory(GetSystemDirectoryOptions options);
};
// Copyright 2018 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.
// https://github.com/WICG/writable-files/blob/master/EXPLAINER.md
enum SystemDirectoryType {
"sandbox"
};
dictionary GetSystemDirectoryOptions {
required SystemDirectoryType type;
};
......@@ -518,6 +518,7 @@ modules_dictionary_idl_files =
"encryptedmedia/media_key_system_media_capability.idl",
"eventsource/event_source_init.idl",
"filesystem/file_system_flags.idl",
"filesystem/get_system_directory_options.idl",
"gamepad/gamepad_effect_parameters.idl",
"gamepad/gamepad_event_init.idl",
"geolocation/position_options.idl",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment