diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-07-16 11:45:35 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2020-07-17 08:59:23 +0000 |
commit | 552906b0f222c5d5dd11b9fd73829d510980461a (patch) | |
tree | 3a11e6ed0538a81dd83b20cf3a4783e297f26d91 /chromium/third_party/blink/renderer/core/fileapi | |
parent | 1b05827804eaf047779b597718c03e7d38344261 (diff) | |
download | qtwebengine-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')
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: |