summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/modules/filesystem/file_system_directory_handle.cc
blob: 2afc8215e5f07cab04fde44ce5492bd8efee14d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
// 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.

#include "third_party/blink/renderer/modules/filesystem/file_system_directory_handle.h"

#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/file_system_directory_iterator.h"
#include "third_party/blink/renderer/modules/filesystem/local_file_system.h"

namespace blink {

FileSystemDirectoryHandle::FileSystemDirectoryHandle(
    DOMFileSystemBase* file_system,
    const String& full_path)
    : FileSystemBaseHandle(file_system, full_path) {}

ScriptPromise FileSystemDirectoryHandle::getFile(
    ScriptState* script_state,
    const String& name,
    const FileSystemGetFileOptions* options) {
  FileSystemFlags* flags = FileSystemFlags::Create();
  flags->setCreateFlag(options->create());
  auto* resolver = ScriptPromiseResolver::Create(script_state);
  ScriptPromise result = resolver->Promise();
  filesystem()->GetFile(
      this, name, flags,
      MakeGarbageCollected<EntryCallbacks::OnDidGetEntryPromiseImpl>(resolver),
      MakeGarbageCollected<PromiseErrorCallback>(resolver));
  return result;
}

ScriptPromise FileSystemDirectoryHandle::getDirectory(
    ScriptState* script_state,
    const String& name,
    const FileSystemGetDirectoryOptions* options) {
  FileSystemFlags* flags = FileSystemFlags::Create();
  flags->setCreateFlag(options->create());
  auto* resolver = ScriptPromiseResolver::Create(script_state);
  ScriptPromise result = resolver->Promise();
  filesystem()->GetDirectory(
      this, name, flags,
      MakeGarbageCollected<EntryCallbacks::OnDidGetEntryPromiseImpl>(resolver),
      MakeGarbageCollected<PromiseErrorCallback>(resolver));
  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),
          MakeGarbageCollected<PromiseErrorCallback>(resolver), context,
          mojom::blink::FileSystemType::kTemporary),
      LocalFileSystem::kAsynchronous);
  return result;
}

namespace {

void ReturnDataFunction(const v8::FunctionCallbackInfo<v8::Value>& info) {
  V8SetReturnValue(info, info.Data());
}

}  // namespace

ScriptValue FileSystemDirectoryHandle::getEntries(ScriptState* script_state) {
  auto* iterator = new FileSystemDirectoryIterator(filesystem(), fullPath());
  auto* isolate = script_state->GetIsolate();
  auto context = script_state->GetContext();
  v8::Local<v8::Object> result = v8::Object::New(isolate);
  if (!result
           ->Set(context, v8::Symbol::GetAsyncIterator(isolate),
                 v8::Function::New(context, &ReturnDataFunction,
                                   ToV8(iterator, script_state))
                     .ToLocalChecked())
           .ToChecked()) {
    return ScriptValue();
  }
  return ScriptValue(script_state, result);
}

ScriptPromise FileSystemDirectoryHandle::removeRecursively(
    ScriptState* script_state) {
  auto* resolver = ScriptPromiseResolver::Create(script_state);
  ScriptPromise result = resolver->Promise();
  filesystem()->RemoveRecursively(
      this, new VoidCallbacks::OnDidSucceedPromiseImpl(resolver),
      MakeGarbageCollected<PromiseErrorCallback>(resolver));
  return result;
}

}  // namespace blink