summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/fileapi
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-07-16 11:45:35 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-07-17 08:59:23 +0000
commit552906b0f222c5d5dd11b9fd73829d510980461a (patch)
tree3a11e6ed0538a81dd83b20cf3a4783e297f26d91 /chromium/third_party/blink/renderer/core/fileapi
parent1b05827804eaf047779b597718c03e7d38344261 (diff)
downloadqtwebengine-chromium-552906b0f222c5d5dd11b9fd73829d510980461a.tar.gz
BASELINE: Update Chromium to 83.0.4103.122
Change-Id: Ie3a82f5bb0076eec2a7c6a6162326b4301ee291e Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/third_party/blink/renderer/core/fileapi')
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/blob.cc4
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/blob.idl9
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file.cc75
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file.h29
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file.idl3
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_list.cc2
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_list.h2
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_list_test.cc12
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_reader.cc14
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_reader.h12
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_reader.idl3
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.cc16
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.h4
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_reader_sync.idl6
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/file_test.cc82
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/public_url_manager.cc9
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/public_url_manager.h10
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/public_url_manager_test.cc6
-rw-r--r--chromium/third_party/blink/renderer/core/fileapi/url_file_api.h3
19 files changed, 143 insertions, 158 deletions
diff --git a/chromium/third_party/blink/renderer/core/fileapi/blob.cc b/chromium/third_party/blink/renderer/core/fileapi/blob.cc
index 8d9fbf000a2..9ef29e6f396 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/blob.cc
+++ b/chromium/third_party/blink/renderer/core/fileapi/blob.cc
@@ -33,10 +33,10 @@
#include <memory>
#include <utility>
+#include "third_party/blink/renderer/bindings/core/v8/v8_blob_property_bag.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/fetch/blob_bytes_consumer.h"
#include "third_party/blink/renderer/core/fetch/body_stream_buffer.h"
-#include "third_party/blink/renderer/core/fileapi/blob_property_bag.h"
#include "third_party/blink/renderer/core/fileapi/file_reader_loader.h"
#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h"
#include "third_party/blink/renderer/core/frame/web_feature.h"
@@ -216,7 +216,7 @@ Blob* Blob::slice(int64_t start,
}
ReadableStream* Blob::stream(ScriptState* script_state) const {
- BodyStreamBuffer* body_buffer = MakeGarbageCollected<BodyStreamBuffer>(
+ BodyStreamBuffer* body_buffer = BodyStreamBuffer::Create(
script_state,
MakeGarbageCollected<BlobBytesConsumer>(
ExecutionContext::From(script_state), blob_data_handle_),
diff --git a/chromium/third_party/blink/renderer/core/fileapi/blob.idl b/chromium/third_party/blink/renderer/core/fileapi/blob.idl
index 3bc8654e922..404de753562 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/blob.idl
+++ b/chromium/third_party/blink/renderer/core/fileapi/blob.idl
@@ -32,17 +32,16 @@
typedef (ArrayBuffer or ArrayBufferView or Blob or USVString) BlobPart;
[
- Constructor(optional sequence<BlobPart> blobParts, optional BlobPropertyBag options),
- ConstructorCallWith=ExecutionContext,
Exposed=(Window,Worker),
Serializable
] interface Blob {
+ [CallWith=ExecutionContext] constructor(optional sequence<BlobPart> blobParts, optional BlobPropertyBag options = {});
readonly attribute unsigned long long size;
readonly attribute DOMString type;
// TODO(jsbell): start and end arguments should be [Clamp]
[RaisesException] Blob slice(optional long long start, optional long long end, optional DOMString contentType);
- [CallWith=ScriptState, RuntimeEnabled=BlobReadMethods] ReadableStream stream();
- [CallWith=ScriptState, RuntimeEnabled=BlobReadMethods] Promise<USVString> text();
- [CallWith=ScriptState, RuntimeEnabled=BlobReadMethods] Promise<ArrayBuffer> arrayBuffer();
+ [CallWith=ScriptState] ReadableStream stream();
+ [CallWith=ScriptState] Promise<USVString> text();
+ [CallWith=ScriptState] Promise<ArrayBuffer> arrayBuffer();
};
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file.cc b/chromium/third_party/blink/renderer/core/fileapi/file.cc
index b94b64e094c..bd08b09bfa6 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file.cc
+++ b/chromium/third_party/blink/renderer/core/fileapi/file.cc
@@ -29,7 +29,7 @@
#include "third_party/blink/public/platform/file_path_conversion.h"
#include "third_party/blink/public/platform/platform.h"
-#include "third_party/blink/renderer/core/fileapi/file_property_bag.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_file_property_bag.h"
#include "third_party/blink/renderer/core/frame/web_feature.h"
#include "third_party/blink/renderer/core/html/forms/form_controller.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h"
@@ -239,7 +239,6 @@ File::File(const String& name,
has_backing_file_(false),
user_visibility_(File::kIsNotUserVisible),
name_(name),
- snapshot_size_(Blob::size()),
snapshot_modification_time_(modification_time) {
uint64_t size = Blob::size();
if (size != std::numeric_limits<uint64_t>::max())
@@ -272,9 +271,9 @@ File::File(const KURL& file_system_url,
name_(DecodeURLEscapeSequences(file_system_url.LastPathComponent(),
DecodeURLMode::kUTF8OrIsomorphic)),
file_system_url_(file_system_url),
+ snapshot_size_(metadata.length),
snapshot_modification_time_(metadata.modification_time) {
- if (metadata.length >= 0)
- snapshot_size_ = metadata.length;
+ DCHECK_GE(metadata.length, 0);
}
File::File(const File& other)
@@ -296,14 +295,11 @@ File* File::Clone(const String& name) const {
}
base::Time File::LastModifiedTime() const {
+ CaptureSnapshotIfNeeded();
+
if (HasValidSnapshotMetadata() && snapshot_modification_time_)
return *snapshot_modification_time_;
- base::Optional<base::Time> modification_time;
- if (HasBackingFile() && GetFileModificationTime(path_, modification_time) &&
- modification_time)
- return *modification_time;
-
// lastModified / lastModifiedDate getters should return the current time
// when the last modification time isn't known.
return base::Time::Now();
@@ -322,16 +318,21 @@ ScriptValue File::lastModifiedDate(ScriptState* script_state) const {
ToV8(LastModifiedTime(), script_state));
}
+base::Optional<base::Time> File::LastModifiedTimeForSerialization() const {
+ CaptureSnapshotIfNeeded();
+
+ return snapshot_modification_time_;
+}
+
uint64_t File::size() const {
- if (HasValidSnapshotMetadata())
- return *snapshot_size_;
+ CaptureSnapshotIfNeeded();
// FIXME: JavaScript cannot represent sizes as large as uint64_t, we need
// to come up with an exception to throw if file size is not representable.
- int64_t size;
- if (!HasBackingFile() || !GetFileSize(path_, size))
- return 0;
- return static_cast<uint64_t>(size);
+ if (HasValidSnapshotMetadata())
+ return *snapshot_size_;
+
+ return 0;
}
Blob* File::slice(int64_t start,
@@ -341,44 +342,30 @@ Blob* File::slice(int64_t start,
if (!has_backing_file_)
return Blob::slice(start, end, content_type, exception_state);
- // FIXME: This involves synchronous file operation. We need to figure out how
- // to make it asynchronous.
- uint64_t size;
- base::Optional<base::Time> modification_time;
- CaptureSnapshot(size, modification_time);
- ClampSliceOffsets(size, start, end);
+ // FIXME: Calling size triggers capturing a snapshot, if we don't have one
+ // already. This involves synchronous file operation. We need to figure out
+ // how to make it asynchronous (or make sure snapshot state is always passed
+ // in when creating a File instance).
+ ClampSliceOffsets(size(), start, end);
uint64_t length = end - start;
auto blob_data = std::make_unique<BlobData>();
blob_data->SetContentType(NormalizeType(content_type));
DCHECK(!path_.IsEmpty());
- blob_data->AppendFile(path_, start, length, modification_time);
+ blob_data->AppendFile(path_, start, length, snapshot_modification_time_);
return MakeGarbageCollected<Blob>(
BlobDataHandle::Create(std::move(blob_data), length));
}
-void File::CaptureSnapshot(
- uint64_t& snapshot_size,
- base::Optional<base::Time>& snapshot_modification_time) const {
- if (HasValidSnapshotMetadata()) {
- snapshot_size = *snapshot_size_;
- snapshot_modification_time = snapshot_modification_time_;
+void File::CaptureSnapshotIfNeeded() const {
+ if (HasValidSnapshotMetadata() && snapshot_modification_time_)
return;
- }
- // Obtains a snapshot of the file by capturing its current size and
- // modification time. This is used when we slice a file for the first time.
- // If we fail to retrieve the size or modification time, probably due to that
- // the file has been deleted, 0 size is returned.
- FileMetadata metadata;
- if (!HasBackingFile() || !GetFileMetadata(path_, metadata)) {
- snapshot_size = 0;
- snapshot_modification_time = base::nullopt;
- return;
+ uint64_t snapshot_size;
+ if (GetBlobDataHandle()->CaptureSnapshot(&snapshot_size,
+ &snapshot_modification_time_)) {
+ snapshot_size_ = snapshot_size;
}
-
- snapshot_size = static_cast<uint64_t>(metadata.length);
- snapshot_modification_time = metadata.modification_time;
}
void File::AppendTo(BlobData& blob_data) const {
@@ -389,11 +376,9 @@ void File::AppendTo(BlobData& blob_data) const {
// FIXME: This involves synchronous file operation. We need to figure out how
// to make it asynchronous.
- uint64_t size;
- base::Optional<base::Time> modification_time;
- CaptureSnapshot(size, modification_time);
+ CaptureSnapshotIfNeeded();
DCHECK(!path_.IsEmpty());
- blob_data.AppendFile(path_, 0, size, modification_time);
+ blob_data.AppendFile(path_, 0, *snapshot_size_, snapshot_modification_time_);
}
bool File::HasSameSource(const File& other) const {
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file.h b/chromium/third_party/blink/renderer/core/fileapi/file.h
index 7ea8ad8fd16..e9707e037d0 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file.h
+++ b/chromium/third_party/blink/renderer/core/fileapi/file.h
@@ -83,14 +83,13 @@ class CORE_EXPORT File final : public Blob {
last_modified, std::move(blob_data_handle));
}
static File* CreateFromIndexedSerialization(
- const String& path,
const String& name,
uint64_t size,
const base::Optional<base::Time>& last_modified,
scoped_refptr<BlobDataHandle> blob_data_handle) {
- return MakeGarbageCollected<File>(path, name, String(), kIsNotUserVisible,
- true, size, last_modified,
- std::move(blob_data_handle));
+ return MakeGarbageCollected<File>(
+ String(), name, String(), kIsNotUserVisible, true, size, last_modified,
+ std::move(blob_data_handle));
}
// For session restore feature.
@@ -205,18 +204,20 @@ class CORE_EXPORT File final : public Blob {
// If the modification time isn't known, the current time is returned.
base::Time LastModifiedTime() const;
+ // Similar to |LastModifiedTime()|, except this returns base::nullopt rather
+ // than the current time if the modified time is unknown.
+ // This is used by SerializedScriptValue to serialize the last modified time
+ // of a File object.
+ // This method calls CaptureSnapshotIfNeeded, and thus can involve synchronous
+ // IPC and file operations.
+ base::Optional<base::Time> LastModifiedTimeForSerialization() const;
+
UserVisibility GetUserVisibility() const { return user_visibility_; }
// Returns the relative path of this file in the context of a directory
// selection.
const String& webkitRelativePath() const { return relative_path_; }
- // Note that this involves synchronous file operation. Think twice before
- // calling this function.
- void CaptureSnapshot(
- uint64_t& snapshot_size,
- base::Optional<base::Time>& snapshot_modification_time) const;
-
// Returns true if this has a valid snapshot metadata
// (i.e. snapshot_size_.has_value()).
bool HasValidSnapshotMetadata() const { return snapshot_size_.has_value(); }
@@ -229,7 +230,9 @@ class CORE_EXPORT File final : public Blob {
bool AppendToControlState(FormControlState& state);
private:
- void InvalidateSnapshotMetadata() { snapshot_size_.reset(); }
+ // Note that this involves synchronous file operation. Think twice before
+ // calling this function.
+ void CaptureSnapshotIfNeeded() const;
#if DCHECK_IS_ON()
// Instances backed by a file must have an empty file system URL.
@@ -251,8 +254,8 @@ class CORE_EXPORT File final : public Blob {
// we retrieve the latest metadata synchronously in size(),
// LastModifiedTime() and slice().
// Otherwise, the snapshot metadata are used directly in those methods.
- base::Optional<uint64_t> snapshot_size_;
- const base::Optional<base::Time> snapshot_modification_time_;
+ mutable base::Optional<uint64_t> snapshot_size_;
+ mutable base::Optional<base::Time> snapshot_modification_time_;
String relative_path_;
};
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file.idl b/chromium/third_party/blink/renderer/core/fileapi/file.idl
index e5cf6cc926f..4339a27e87c 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file.idl
+++ b/chromium/third_party/blink/renderer/core/fileapi/file.idl
@@ -26,11 +26,10 @@
// https://w3c.github.io/FileAPI/#file-section
[
- Constructor(sequence<BlobPart> fileBits, USVString fileName, optional FilePropertyBag options),
- ConstructorCallWith=ExecutionContext,
Exposed=(Window,Worker),
Serializable
] interface File : Blob {
+ [CallWith=ExecutionContext] constructor(sequence<BlobPart> fileBits, USVString fileName, optional FilePropertyBag options = {});
readonly attribute DOMString name;
readonly attribute long long lastModified;
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_list.cc b/chromium/third_party/blink/renderer/core/fileapi/file_list.cc
index 323cae340e2..4d9ef43b18a 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_list.cc
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_list.cc
@@ -51,7 +51,7 @@ Vector<base::FilePath> FileList::PathsForUserVisibleFiles() const {
return paths;
}
-void FileList::Trace(blink::Visitor* visitor) {
+void FileList::Trace(Visitor* visitor) {
visitor->Trace(files_);
ScriptWrappable::Trace(visitor);
}
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_list.h b/chromium/third_party/blink/renderer/core/fileapi/file_list.h
index 934bf5d8b28..b66623bfd8d 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_list.h
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_list.h
@@ -48,7 +48,7 @@ class CORE_EXPORT FileList final : public ScriptWrappable {
void Append(File* file) { files_.push_back(file); }
Vector<base::FilePath> PathsForUserVisibleFiles() const;
- void Trace(blink::Visitor*) override;
+ void Trace(Visitor*) override;
private:
HeapVector<Member<File>> files_;
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_list_test.cc b/chromium/third_party/blink/renderer/core/fileapi/file_list_test.cc
index 6190cc6dbc7..74b343813b5 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_list_test.cc
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_list_test.cc
@@ -42,8 +42,10 @@ TEST(FileListTest, pathsForUserVisibleFiles) {
{
KURL url(
"filesystem:http://example.com/isolated/hash/visible-non-native-file");
- file_list->Append(File::CreateForFileSystemFile(url, FileMetadata(),
- File::kIsUserVisible));
+ FileMetadata metadata;
+ metadata.length = 0;
+ file_list->Append(
+ File::CreateForFileSystemFile(url, metadata, File::kIsUserVisible));
}
// Not user visible file system URL file.
@@ -51,8 +53,10 @@ TEST(FileListTest, pathsForUserVisibleFiles) {
KURL url(
"filesystem:http://example.com/isolated/hash/"
"not-visible-non-native-file");
- file_list->Append(File::CreateForFileSystemFile(url, FileMetadata(),
- File::kIsNotUserVisible));
+ FileMetadata metadata;
+ metadata.length = 0;
+ file_list->Append(
+ File::CreateForFileSystemFile(url, metadata, File::kIsNotUserVisible));
}
Vector<base::FilePath> paths = file_list->PathsForUserVisibleFiles();
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_reader.cc b/chromium/third_party/blink/renderer/core/fileapi/file_reader.cc
index be64b8a7647..e556e849c64 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_reader.cc
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_reader.cc
@@ -125,7 +125,7 @@ class FileReader::ThrottlingController final
: Supplement<ExecutionContext>(context),
max_running_readers_(kMaxOutstandingRequestsPerThread) {}
- void Trace(blink::Visitor* visitor) override {
+ void Trace(Visitor* visitor) override {
visitor->Trace(pending_readers_);
visitor->Trace(running_readers_);
Supplement<ExecutionContext>::Trace(visitor);
@@ -198,7 +198,7 @@ FileReader* FileReader::Create(ExecutionContext* context) {
}
FileReader::FileReader(ExecutionContext* context)
- : ContextLifecycleObserver(context),
+ : ExecutionContextLifecycleObserver(context),
state_(kEmpty),
loading_state_(kLoadingStateNone),
still_firing_events_(false),
@@ -212,12 +212,13 @@ const AtomicString& FileReader::InterfaceName() const {
return event_target_names::kFileReader;
}
-void FileReader::ContextDestroyed(ExecutionContext* destroyed_context) {
+void FileReader::ContextDestroyed() {
// The delayed abort task tidies up and advances to the DONE state.
if (loading_state_ == kLoadingStateAborted)
return;
if (HasPendingActivity()) {
+ ExecutionContext* destroyed_context = GetExecutionContext();
ThrottlingController::FinishReader(
destroyed_context, this,
ThrottlingController::RemoveReader(destroyed_context, this));
@@ -292,7 +293,8 @@ void FileReader::ReadInternal(Blob* blob,
// A document loader will not load new resources once the Document has
// detached from its frame.
- if (IsA<Document>(context) && !To<Document>(context)->GetFrame()) {
+ Document* document = Document::DynamicFrom(context);
+ if (document && !document->GetFrame()) {
exception_state.ThrowDOMException(
DOMExceptionCode::kAbortError,
"Reading from a Document-detached FileReader is not supported.");
@@ -474,10 +476,10 @@ void FileReader::FireEvent(const AtomicString& type) {
}
}
-void FileReader::Trace(blink::Visitor* visitor) {
+void FileReader::Trace(Visitor* visitor) {
visitor->Trace(error_);
EventTargetWithInlineData::Trace(visitor);
- ContextLifecycleObserver::Trace(visitor);
+ ExecutionContextLifecycleObserver::Trace(visitor);
}
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_reader.h b/chromium/third_party/blink/renderer/core/fileapi/file_reader.h
index 1b45c604844..7e763d550e8 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_reader.h
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_reader.h
@@ -36,7 +36,7 @@
#include "third_party/blink/renderer/bindings/core/v8/active_script_wrappable.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/dom/events/event_target.h"
-#include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/core/fileapi/file_reader_loader.h"
#include "third_party/blink/renderer/core/fileapi/file_reader_loader_client.h"
#include "third_party/blink/renderer/core/probe/async_task_id.h"
@@ -53,7 +53,7 @@ class StringOrArrayBuffer;
class CORE_EXPORT FileReader final : public EventTargetWithInlineData,
public ActiveScriptWrappable<FileReader>,
- public ContextLifecycleObserver,
+ public ExecutionContextLifecycleObserver,
public FileReaderLoaderClient {
DEFINE_WRAPPERTYPEINFO();
USING_GARBAGE_COLLECTED_MIXIN(FileReader);
@@ -78,8 +78,8 @@ class CORE_EXPORT FileReader final : public EventTargetWithInlineData,
void result(ScriptState*, StringOrArrayBuffer& result_attribute) const;
probe::AsyncTaskId* async_task_id() { return &async_task_id_; }
- // ContextLifecycleObserver
- void ContextDestroyed(ExecutionContext*) override;
+ // ExecutionContextLifecycleObserver
+ void ContextDestroyed() override;
// ScriptWrappable
bool HasPendingActivity() const final;
@@ -87,7 +87,7 @@ class CORE_EXPORT FileReader final : public EventTargetWithInlineData,
// EventTarget
const AtomicString& InterfaceName() const override;
ExecutionContext* GetExecutionContext() const override {
- return ContextLifecycleObserver::GetExecutionContext();
+ return ExecutionContextLifecycleObserver::GetExecutionContext();
}
// FileReaderLoaderClient
@@ -103,7 +103,7 @@ class CORE_EXPORT FileReader final : public EventTargetWithInlineData,
DEFINE_ATTRIBUTE_EVENT_LISTENER(error, kError)
DEFINE_ATTRIBUTE_EVENT_LISTENER(loadend, kLoadend)
- void Trace(blink::Visitor*) override;
+ void Trace(Visitor*) override;
private:
class ThrottlingController;
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_reader.idl b/chromium/third_party/blink/renderer/core/fileapi/file_reader.idl
index ab2c692417e..06537670696 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_reader.idl
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_reader.idl
@@ -33,10 +33,9 @@
[
ActiveScriptWrappable,
- Constructor,
- ConstructorCallWith=ExecutionContext,
Exposed=(Window,Worker)
] interface FileReader : EventTarget {
+ [CallWith=ExecutionContext] constructor();
// async read methods
[RaisesException] void readAsArrayBuffer(Blob blob);
[RaisesException] void readAsBinaryString(Blob blob);
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.cc b/chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
index cfc1297a5bf..361e00b3a8a 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.cc
@@ -67,17 +67,11 @@ FileReaderLoader::FileReaderLoader(
scoped_refptr<base::SingleThreadTaskRunner> task_runner)
: read_type_(read_type),
client_(client),
- // TODO(https://crbug.com/957651): task_runner should never be null, but
- // if it is make sure SimpleWatcher doesn't crash and just use a default
- // task runner instead for now.
- handle_watcher_(
- FROM_HERE,
- mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC,
- task_runner ? task_runner : base::SequencedTaskRunnerHandle::Get()),
+ handle_watcher_(FROM_HERE,
+ mojo::SimpleWatcher::ArmingPolicy::AUTOMATIC,
+ task_runner),
task_runner_(std::move(task_runner)) {
- // TODO(https://crbug.com/957651): Change this into a DCHECK once we figured
- // out where code is passing in a null task runner,
- CHECK(task_runner_);
+ DCHECK(task_runner_);
}
FileReaderLoader::~FileReaderLoader() {
@@ -147,7 +141,7 @@ DOMArrayBuffer* FileReaderLoader::ArrayBufferResult() {
SafeCast<size_t>(bytes_loaded_));
}
- array_buffer_result_ = DOMArrayBuffer::Create(raw_data_);
+ array_buffer_result_ = DOMArrayBuffer::Create(std::move(raw_data_));
DCHECK_EQ(raw_data_.DataLength(), 0u);
raw_data_.Reset();
return array_buffer_result_;
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.h b/chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.h
index 2ac325d052c..31682e59302 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.h
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_reader_loader.h
@@ -38,7 +38,6 @@
#include "third_party/blink/public/mojom/blob/blob.mojom-blink.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/fileapi/file_error.h"
-#include "third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer.h"
#include "third_party/blink/renderer/core/typed_arrays/array_buffer/array_buffer_contents.h"
#include "third_party/blink/renderer/platform/heap/persistent.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"
@@ -174,6 +173,9 @@ class CORE_EXPORT FileReaderLoader : public mojom::blink::BlobReaderClient {
mojo::ScopedDataPipeConsumerHandle consumer_handle_;
mojo::SimpleWatcher handle_watcher_;
+ // TODO(crbug.com/937038, crbug.com/1049056): Make FileReaderLoaderClient
+ // GarbageCollected. It will then be possible to use the HeapMojoReceiver
+ // wrapper for receiver_.
mojo::Receiver<mojom::blink::BlobReaderClient> receiver_{this};
bool received_all_data_ = false;
bool received_on_complete_ = false;
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_reader_sync.idl b/chromium/third_party/blink/renderer/core/fileapi/file_reader_sync.idl
index 2f8ef263c0c..9f7d0281042 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_reader_sync.idl
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_reader_sync.idl
@@ -31,11 +31,9 @@
// https://w3c.github.io/FileAPI/#FileReaderSync
[
- Exposed=(DedicatedWorker,SharedWorker),
- Constructor,
- ConstructorCallWith=ExecutionContext,
- Measure
+ Exposed=(DedicatedWorker,SharedWorker)
] interface FileReaderSync {
+ [CallWith=ExecutionContext, Measure] constructor();
[RaisesException] ArrayBuffer readAsArrayBuffer(Blob blob);
[RaisesException] DOMString readAsBinaryString(Blob blob);
[RaisesException] DOMString readAsText(Blob blob, optional DOMString label);
diff --git a/chromium/third_party/blink/renderer/core/fileapi/file_test.cc b/chromium/third_party/blink/renderer/core/fileapi/file_test.cc
index 399d9aa9adc..53daeaf7560 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/file_test.cc
+++ b/chromium/third_party/blink/renderer/core/fileapi/file_test.cc
@@ -4,53 +4,58 @@
#include "third_party/blink/renderer/core/fileapi/file.h"
+#include "base/task/post_task.h"
+#include "base/task/thread_pool.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "mojo/public/cpp/bindings/self_owned_receiver.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/thread_safe_browser_interface_broker_proxy.h"
#include "third_party/blink/public/mojom/file/file_utilities.mojom-blink.h"
#include "third_party/blink/public/platform/platform.h"
+#include "third_party/blink/renderer/platform/blob/testing/fake_blob.h"
#include "third_party/blink/renderer/platform/file_metadata.h"
#include "third_party/blink/renderer/platform/heap/heap.h"
+#include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h"
+#include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h"
namespace blink {
namespace {
-class MockFileUtilitiesHost : public mojom::blink::FileUtilitiesHost {
+class MockBlob : public FakeBlob {
public:
- MockFileUtilitiesHost()
- : broker_(*Platform::Current()->GetBrowserInterfaceBroker()) {
- broker_.SetBinderForTesting(
- FileUtilitiesHost::Name_,
- WTF::BindRepeating(&MockFileUtilitiesHost::BindReceiver,
- WTF::Unretained(this)));
- RebindFileUtilitiesForTesting();
+ static void Create(File* file, base::Time modified_time) {
+ mojo::PendingRemote<mojom::blink::Blob> remote;
+ PostCrossThreadTask(
+ *base::ThreadPool::CreateSingleThreadTaskRunner({}), FROM_HERE,
+ CrossThreadBindOnce(
+ [](const String& uuid,
+ mojo::PendingReceiver<mojom::blink::Blob> receiver,
+ base::Time modified_time) {
+ mojo::MakeSelfOwnedReceiver(
+ std::make_unique<MockBlob>(uuid, modified_time),
+ std::move(receiver));
+ },
+ file->Uuid(), remote.InitWithNewPipeAndPassReceiver(),
+ modified_time));
+ file->GetBlobDataHandle()->SetBlobRemoteForTesting(std::move(remote));
}
- ~MockFileUtilitiesHost() override {
- broker_.SetBinderForTesting(FileUtilitiesHost::Name_, {});
- RebindFileUtilitiesForTesting();
- }
-
- void SetFileInfoToBeReturned(const base::File::Info info) {
- file_info_ = info;
- }
+ MockBlob(const String& uuid, base::Time modified_time)
+ : FakeBlob(uuid), modified_time_(modified_time) {}
- private:
- void BindReceiver(mojo::ScopedMessagePipeHandle handle) {
- receivers_.Add(this,
- mojo::PendingReceiver<FileUtilitiesHost>(std::move(handle)));
+ void Clone(mojo::PendingReceiver<mojom::blink::Blob> receiver) override {
+ mojo::MakeSelfOwnedReceiver(
+ std::make_unique<MockBlob>(uuid_, modified_time_), std::move(receiver));
}
- // FileUtilitiesHost function:
- void GetFileInfo(const base::FilePath& path,
- GetFileInfoCallback callback) override {
- std::move(callback).Run(file_info_);
+ void CaptureSnapshot(CaptureSnapshotCallback callback) override {
+ std::move(callback).Run(
+ /*size=*/0, NullableTimeToOptionalTime(modified_time_));
}
- ThreadSafeBrowserInterfaceBrokerProxy& broker_;
- mojo::ReceiverSet<FileUtilitiesHost> receivers_;
- base::File::Info file_info_;
+ private:
+ base::Time modified_time_;
};
void ExpectTimestampIsNow(const File& file) {
@@ -65,12 +70,9 @@ void ExpectTimestampIsNow(const File& file) {
} // namespace
TEST(FileTest, NativeFileWithoutTimestamp) {
- MockFileUtilitiesHost host;
- base::File::Info info;
- info.last_modified = base::Time();
- host.SetFileInfoToBeReturned(info);
-
auto* const file = MakeGarbageCollected<File>("/native/path");
+ MockBlob::Create(file, base::Time());
+
EXPECT_TRUE(file->HasBackingFile());
EXPECT_EQ("/native/path", file->GetPath());
EXPECT_TRUE(file->FileSystemURL().IsEmpty());
@@ -78,24 +80,18 @@ TEST(FileTest, NativeFileWithoutTimestamp) {
}
TEST(FileTest, NativeFileWithUnixEpochTimestamp) {
- MockFileUtilitiesHost host;
- base::File::Info info;
- info.last_modified = base::Time::UnixEpoch();
- host.SetFileInfoToBeReturned(info);
-
auto* const file = MakeGarbageCollected<File>("/native/path");
+ MockBlob::Create(file, base::Time::UnixEpoch());
+
EXPECT_TRUE(file->HasBackingFile());
EXPECT_EQ(0, file->lastModified());
EXPECT_EQ(base::Time::UnixEpoch(), file->LastModifiedTime());
}
TEST(FileTest, NativeFileWithApocalypseTimestamp) {
- MockFileUtilitiesHost host;
- base::File::Info info;
- info.last_modified = base::Time::Max();
- host.SetFileInfoToBeReturned(info);
-
auto* const file = MakeGarbageCollected<File>("/native/path");
+ MockBlob::Create(file, base::Time::Max());
+
EXPECT_TRUE(file->HasBackingFile());
EXPECT_EQ((base::Time::Max() - base::Time::UnixEpoch()).InMilliseconds(),
@@ -219,6 +215,7 @@ TEST(FileTest, FileSystemFileWithApocalypseTimestamp) {
TEST(FileTest, fileSystemFileWithoutNativeSnapshot) {
KURL url("filesystem:http://example.com/isolated/hash/non-native-file");
FileMetadata metadata;
+ metadata.length = 0;
File* const file =
File::CreateForFileSystemFile(url, metadata, File::kIsUserVisible);
EXPECT_FALSE(file->HasBackingFile());
@@ -244,6 +241,7 @@ TEST(FileTest, hsaSameSource) {
KURL url_a("filesystem:http://example.com/isolated/hash/non-native-file-A");
KURL url_b("filesystem:http://example.com/isolated/hash/non-native-file-B");
FileMetadata metadata;
+ metadata.length = 0;
File* const file_system_file_a1 =
File::CreateForFileSystemFile(url_a, metadata, File::kIsUserVisible);
File* const file_system_file_a2 =
diff --git a/chromium/third_party/blink/renderer/core/fileapi/public_url_manager.cc b/chromium/third_party/blink/renderer/core/fileapi/public_url_manager.cc
index 933ead60174..87bad05d26f 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/public_url_manager.cc
+++ b/chromium/third_party/blink/renderer/core/fileapi/public_url_manager.cc
@@ -30,6 +30,7 @@
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "third_party/blink/public/common/blob/blob_utils.h"
#include "third_party/blink/public/mojom/blob/blob_registry.mojom-blink.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context.h"
#include "third_party/blink/renderer/core/fileapi/url_registry.h"
#include "third_party/blink/renderer/platform/blob/blob_data.h"
#include "third_party/blink/renderer/platform/blob/blob_url.h"
@@ -52,7 +53,7 @@ static void RemoveFromNullOriginMapIfNecessary(const KURL& blob_url) {
} // namespace
PublicURLManager::PublicURLManager(ExecutionContext* context)
- : ContextLifecycleObserver(context), is_stopped_(false) {}
+ : ExecutionContextLifecycleObserver(context), is_stopped_(false) {}
String PublicURLManager::RegisterURL(URLRegistrable* registrable) {
if (is_stopped_)
@@ -146,7 +147,7 @@ void PublicURLManager::Resolve(
url_store_->ResolveForNavigation(url, std::move(token_receiver));
}
-void PublicURLManager::ContextDestroyed(ExecutionContext*) {
+void PublicURLManager::ContextDestroyed() {
if (is_stopped_)
return;
@@ -164,8 +165,8 @@ void PublicURLManager::ContextDestroyed(ExecutionContext*) {
url_store_.reset();
}
-void PublicURLManager::Trace(blink::Visitor* visitor) {
- ContextLifecycleObserver::Trace(visitor);
+void PublicURLManager::Trace(Visitor* visitor) {
+ ExecutionContextLifecycleObserver::Trace(visitor);
}
} // namespace blink
diff --git a/chromium/third_party/blink/renderer/core/fileapi/public_url_manager.h b/chromium/third_party/blink/renderer/core/fileapi/public_url_manager.h
index ed87d4567b7..3ba1a72ef63 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/public_url_manager.h
+++ b/chromium/third_party/blink/renderer/core/fileapi/public_url_manager.h
@@ -31,7 +31,7 @@
#include "services/network/public/mojom/url_loader_factory.mojom-blink-forward.h"
#include "third_party/blink/public/mojom/blob/blob_url_store.mojom-blink.h"
#include "third_party/blink/renderer/core/core_export.h"
-#include "third_party/blink/renderer/core/execution_context/context_lifecycle_observer.h"
+#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/hash_map.h"
#include "third_party/blink/renderer/platform/wtf/hash_set.h"
@@ -46,7 +46,7 @@ class URLRegistrable;
class CORE_EXPORT PublicURLManager final
: public GarbageCollected<PublicURLManager>,
- public ContextLifecycleObserver {
+ public ExecutionContextLifecycleObserver {
USING_GARBAGE_COLLECTED_MIXIN(PublicURLManager);
public:
@@ -68,10 +68,10 @@ class CORE_EXPORT PublicURLManager final
// If the URL fails to resolve the request will simply be disconnected.
void Resolve(const KURL&, mojo::PendingReceiver<mojom::blink::BlobURLToken>);
- // ContextLifecycleObserver interface.
- void ContextDestroyed(ExecutionContext*) override;
+ // ExecutionContextLifecycleObserver interface.
+ void ContextDestroyed() override;
- void Trace(blink::Visitor*) override;
+ void Trace(Visitor*) override;
void SetURLStoreForTesting(
mojo::AssociatedRemote<mojom::blink::BlobURLStore> url_store) {
diff --git a/chromium/third_party/blink/renderer/core/fileapi/public_url_manager_test.cc b/chromium/third_party/blink/renderer/core/fileapi/public_url_manager_test.cc
index ad715b0dcfe..5360c48ca5b 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/public_url_manager_test.cc
+++ b/chromium/third_party/blink/renderer/core/fileapi/public_url_manager_test.cc
@@ -73,7 +73,7 @@ class PublicURLManagerTest : public testing::Test {
execution_context_ = MakeGarbageCollected<NullExecutionContext>();
// By default this creates a unique origin, which is exactly what this test
// wants.
- execution_context_->SetUpSecurityContext();
+ execution_context_->SetUpSecurityContextForTesting();
mojo::AssociatedRemote<BlobURLStore> url_store_remote;
url_store_receiver_.Bind(
@@ -149,7 +149,7 @@ TEST_F(PublicURLManagerTest, RegisterMojoBlob) {
TEST_F(PublicURLManagerTest, RevokeValidNonRegisteredURL) {
execution_context_->SetURL(KURL("http://example.com/foo/bar"));
- execution_context_->SetUpSecurityContext();
+ execution_context_->SetUpSecurityContextForTesting();
KURL url = KURL("blob:http://example.com/id");
url_manager().Revoke(url);
@@ -160,7 +160,7 @@ TEST_F(PublicURLManagerTest, RevokeValidNonRegisteredURL) {
TEST_F(PublicURLManagerTest, RevokeInvalidURL) {
execution_context_->SetURL(KURL("http://example.com/foo/bar"));
- execution_context_->SetUpSecurityContext();
+ execution_context_->SetUpSecurityContextForTesting();
KURL invalid_scheme_url = KURL("blb:http://example.com/id");
KURL fragment_url = KURL("blob:http://example.com/id#fragment");
diff --git a/chromium/third_party/blink/renderer/core/fileapi/url_file_api.h b/chromium/third_party/blink/renderer/core/fileapi/url_file_api.h
index 692a648fbf0..9911859427d 100644
--- a/chromium/third_party/blink/renderer/core/fileapi/url_file_api.h
+++ b/chromium/third_party/blink/renderer/core/fileapi/url_file_api.h
@@ -5,6 +5,7 @@
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_URL_FILE_API_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_FILEAPI_URL_FILE_API_H_
+#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"
#include "third_party/blink/renderer/platform/wtf/forward.h"
@@ -15,7 +16,7 @@ class ExecutionContext;
class ScriptState;
class Blob;
-class URLFileAPI {
+class CORE_EXPORT URLFileAPI {
STATIC_ONLY(URLFileAPI);
public: