Commit c8d74f84 authored by Yutaka Hirano's avatar Yutaka Hirano Committed by Commit Bot

Use TraceWrapperV8Reference in ReadableStreamBytesConsumer

ReadableStreamBytesConsumer::reader_ has been a weak reference. This CL
makes it a TraceWrapperV8Reference as it is easier to understand.

Bug: 872462
Change-Id: I669daa87f854a4eab89810b7bf030fc4796d696b
Reviewed-on: https://chromium-review.googlesource.com/1249281Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarKouhei Ueno <kouhei@chromium.org>
Reviewed-by: default avatarAdam Rice <ricea@chromium.org>
Commit-Queue: Yutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#595392}
parent b48a401f
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "third_party/blink/renderer/core/fetch/fetch_data_loader.h" #include "third_party/blink/renderer/core/fetch/fetch_data_loader.h"
#include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h"
#include "third_party/blink/renderer/platform/bindings/script_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h"
#include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h" #include "third_party/blink/renderer/platform/bindings/v8_per_isolate_data.h"
#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/handle.h"
...@@ -108,7 +109,7 @@ class FetchDataLoaderForWasmStreaming final : public FetchDataLoader, ...@@ -108,7 +109,7 @@ class FetchDataLoaderForWasmStreaming final : public FetchDataLoader,
streaming_->Abort(v8::Local<v8::Value>()); streaming_->Abort(v8::Local<v8::Value>());
} }
} }
Member<BytesConsumer> consumer_; TraceWrapperMember<BytesConsumer> consumer_;
Member<FetchDataLoader::Client> client_; Member<FetchDataLoader::Client> client_;
std::shared_ptr<v8::WasmStreaming> streaming_; std::shared_ptr<v8::WasmStreaming> streaming_;
const Member<ScriptState> script_state_; const Member<ScriptState> script_state_;
...@@ -205,7 +206,7 @@ class FetchDataLoaderAsWasmModule final : public FetchDataLoader, ...@@ -205,7 +206,7 @@ class FetchDataLoaderAsWasmModule final : public FetchDataLoader,
builder_.Abort(v8::Local<v8::Value>()); builder_.Abort(v8::Local<v8::Value>());
} }
} }
Member<BytesConsumer> consumer_; TraceWrapperMember<BytesConsumer> consumer_;
Member<FetchDataLoader::Client> client_; Member<FetchDataLoader::Client> client_;
v8::WasmModuleObjectBuilderStreaming builder_; v8::WasmModuleObjectBuilderStreaming builder_;
const Member<ScriptState> script_state_; const Member<ScriptState> script_state_;
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#include "base/memory/scoped_refptr.h" #include "base/memory/scoped_refptr.h"
#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/fetch/bytes_consumer.h" #include "third_party/blink/renderer/core/fetch/bytes_consumer.h"
#include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h"
#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/handle.h"
namespace blink { namespace blink {
...@@ -42,7 +43,7 @@ class CORE_EXPORT BlobBytesConsumer final : public BytesConsumer { ...@@ -42,7 +43,7 @@ class CORE_EXPORT BlobBytesConsumer final : public BytesConsumer {
private: private:
Member<ExecutionContext> execution_context_; Member<ExecutionContext> execution_context_;
scoped_refptr<BlobDataHandle> blob_data_handle_; scoped_refptr<BlobDataHandle> blob_data_handle_;
Member<BytesConsumer> nested_consumer_; TraceWrapperMember<BytesConsumer> nested_consumer_;
Member<BytesConsumer::Client> client_; Member<BytesConsumer::Client> client_;
}; };
......
...@@ -143,8 +143,9 @@ BodyStreamBuffer::BodyStreamBuffer(ScriptState* script_state, ...@@ -143,8 +143,9 @@ BodyStreamBuffer::BodyStreamBuffer(ScriptState* script_state,
script_state_(script_state), script_state_(script_state),
signal_(nullptr), signal_(nullptr),
made_from_readable_stream_(true) { made_from_readable_stream_(true) {
// TODO(ricea): Perhaps this is not needed since the caller must have a strong // This is needed because sometimes a BodyStreamBuffer can be detached from
// reference to |stream| anyway? // the owner object such as Request. We rely on the wrapper and
// HasPendingActivity in such a case.
RetainWrapperDuringConstruction(this, script_state); RetainWrapperDuringConstruction(this, script_state);
DCHECK(ReadableStreamOperations::IsReadableStreamForDCheck(script_state, DCHECK(ReadableStreamOperations::IsReadableStreamForDCheck(script_state,
stream)); stream));
......
...@@ -101,9 +101,9 @@ class CORE_EXPORT BodyStreamBuffer final : public UnderlyingSourceBase, ...@@ -101,9 +101,9 @@ class CORE_EXPORT BodyStreamBuffer final : public UnderlyingSourceBase,
Member<ScriptState> script_state_; Member<ScriptState> script_state_;
TraceWrapperV8Reference<v8::Object> stream_; TraceWrapperV8Reference<v8::Object> stream_;
Member<BytesConsumer> consumer_; TraceWrapperMember<BytesConsumer> consumer_;
// We need this member to keep it alive while loading. // We need this member to keep it alive while loading.
Member<FetchDataLoader> loader_; TraceWrapperMember<FetchDataLoader> loader_;
// We need this to ensure that we detect that abort has been signalled // We need this to ensure that we detect that abort has been signalled
// correctly. // correctly.
Member<AbortSignal> signal_; Member<AbortSignal> signal_;
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/public/platform/task_type.h"
#include "third_party/blink/renderer/core/execution_context/execution_context.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/blob_bytes_consumer.h"
#include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h"
#include "third_party/blink/renderer/platform/blob/blob_data.h" #include "third_party/blink/renderer/platform/blob/blob_data.h"
#include "third_party/blink/renderer/platform/heap/persistent.h" #include "third_party/blink/renderer/platform/heap/persistent.h"
#include "third_party/blink/renderer/platform/wtf/functional.h" #include "third_party/blink/renderer/platform/wtf/functional.h"
...@@ -301,7 +302,7 @@ class TeeHelper final : public GarbageCollectedFinalized<TeeHelper>, ...@@ -301,7 +302,7 @@ class TeeHelper final : public GarbageCollectedFinalized<TeeHelper>,
destination2_->Notify(); destination2_->Notify();
} }
Member<BytesConsumer> src_; TraceWrapperMember<BytesConsumer> src_;
Member<Destination> destination1_; Member<Destination> destination1_;
Member<Destination> destination2_; Member<Destination> destination2_;
}; };
......
...@@ -24,6 +24,8 @@ class ExecutionContext; ...@@ -24,6 +24,8 @@ class ExecutionContext;
// BytesConsumer has four states: waiting, readable, closed and errored. Once // BytesConsumer has four states: waiting, readable, closed and errored. Once
// the state becomes closed or errored, it will never change. |readable| means // the state becomes closed or errored, it will never change. |readable| means
// that the BytesConsumer is ready to read non-empty bytes synchronously. // that the BytesConsumer is ready to read non-empty bytes synchronously.
// A BytesConsumer should be retained by TraceWrapperMember, not Member, as
// a subclass has a reference to a v8::Value.
class CORE_EXPORT BytesConsumer class CORE_EXPORT BytesConsumer
: public GarbageCollectedFinalized<BytesConsumer> { : public GarbageCollectedFinalized<BytesConsumer> {
public: public:
......
...@@ -106,7 +106,7 @@ class FetchDataLoaderAsBlobHandle final : public FetchDataLoader, ...@@ -106,7 +106,7 @@ class FetchDataLoaderAsBlobHandle final : public FetchDataLoader,
} }
private: private:
Member<BytesConsumer> consumer_; TraceWrapperMember<BytesConsumer> consumer_;
Member<FetchDataLoader::Client> client_; Member<FetchDataLoader::Client> client_;
String mime_type_; String mime_type_;
...@@ -179,7 +179,7 @@ class FetchDataLoaderAsArrayBuffer final : public FetchDataLoader, ...@@ -179,7 +179,7 @@ class FetchDataLoaderAsArrayBuffer final : public FetchDataLoader,
} }
private: private:
Member<BytesConsumer> consumer_; TraceWrapperMember<BytesConsumer> consumer_;
Member<FetchDataLoader::Client> client_; Member<FetchDataLoader::Client> client_;
std::unique_ptr<ArrayBufferBuilder> raw_data_; std::unique_ptr<ArrayBufferBuilder> raw_data_;
...@@ -235,7 +235,7 @@ class FetchDataLoaderAsFailure final : public FetchDataLoader, ...@@ -235,7 +235,7 @@ class FetchDataLoaderAsFailure final : public FetchDataLoader,
} }
private: private:
Member<BytesConsumer> consumer_; TraceWrapperMember<BytesConsumer> consumer_;
Member<FetchDataLoader::Client> client_; Member<FetchDataLoader::Client> client_;
}; };
...@@ -405,7 +405,7 @@ class FetchDataLoaderAsFormData final : public FetchDataLoader, ...@@ -405,7 +405,7 @@ class FetchDataLoaderAsFormData final : public FetchDataLoader,
std::unique_ptr<TextResourceDecoder> string_decoder_; std::unique_ptr<TextResourceDecoder> string_decoder_;
}; };
Member<BytesConsumer> consumer_; TraceWrapperMember<BytesConsumer> consumer_;
Member<FetchDataLoader::Client> client_; Member<FetchDataLoader::Client> client_;
Member<FormData> form_data_; Member<FormData> form_data_;
Member<MultipartParser> multipart_parser_; Member<MultipartParser> multipart_parser_;
...@@ -473,7 +473,7 @@ class FetchDataLoaderAsString final : public FetchDataLoader, ...@@ -473,7 +473,7 @@ class FetchDataLoaderAsString final : public FetchDataLoader,
} }
private: private:
Member<BytesConsumer> consumer_; TraceWrapperMember<BytesConsumer> consumer_;
Member<FetchDataLoader::Client> client_; Member<FetchDataLoader::Client> client_;
std::unique_ptr<TextResourceDecoder> decoder_; std::unique_ptr<TextResourceDecoder> decoder_;
...@@ -576,7 +576,7 @@ class FetchDataLoaderAsDataPipe final : public FetchDataLoader, ...@@ -576,7 +576,7 @@ class FetchDataLoaderAsDataPipe final : public FetchDataLoader,
out_data_pipe_.reset(); out_data_pipe_.reset();
} }
Member<BytesConsumer> consumer_; TraceWrapperMember<BytesConsumer> consumer_;
Member<FetchDataLoader::Client> client_; Member<FetchDataLoader::Client> client_;
mojo::ScopedDataPipeProducerHandle out_data_pipe_; mojo::ScopedDataPipeProducerHandle out_data_pipe_;
......
...@@ -192,7 +192,7 @@ class SRIBytesConsumer final : public BytesConsumer { ...@@ -192,7 +192,7 @@ class SRIBytesConsumer final : public BytesConsumer {
} }
private: private:
Member<BytesConsumer> underlying_; TraceWrapperMember<BytesConsumer> underlying_;
Member<Client> client_; Member<Client> client_;
bool is_cancelled_ = false; bool is_cancelled_ = false;
}; };
......
...@@ -468,7 +468,7 @@ class ComplexFormDataBytesConsumer final : public BytesConsumer { ...@@ -468,7 +468,7 @@ class ComplexFormDataBytesConsumer final : public BytesConsumer {
private: private:
scoped_refptr<EncodedFormData> form_data_; scoped_refptr<EncodedFormData> form_data_;
Member<BytesConsumer> blob_bytes_consumer_; TraceWrapperMember<BytesConsumer> blob_bytes_consumer_;
}; };
} // namespace } // namespace
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "base/memory/scoped_refptr.h" #include "base/memory/scoped_refptr.h"
#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/fetch/bytes_consumer.h" #include "third_party/blink/renderer/core/fetch/bytes_consumer.h"
#include "third_party/blink/renderer/platform/bindings/trace_wrapper_member.h"
#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/forward.h"
...@@ -71,7 +72,7 @@ class FormDataBytesConsumer final : public BytesConsumer { ...@@ -71,7 +72,7 @@ class FormDataBytesConsumer final : public BytesConsumer {
scoped_refptr<EncodedFormData>, scoped_refptr<EncodedFormData>,
BytesConsumer* consumer_for_testing); BytesConsumer* consumer_for_testing);
const Member<BytesConsumer> impl_; const TraceWrapperMember<BytesConsumer> impl_;
}; };
} // namespace blink } // namespace blink
......
...@@ -98,7 +98,6 @@ ReadableStreamBytesConsumer::ReadableStreamBytesConsumer( ...@@ -98,7 +98,6 @@ ReadableStreamBytesConsumer::ReadableStreamBytesConsumer(
ScriptValue stream_reader) ScriptValue stream_reader)
: reader_(script_state->GetIsolate(), stream_reader.V8Value()), : reader_(script_state->GetIsolate(), stream_reader.V8Value()),
script_state_(script_state) { script_state_(script_state) {
reader_.SetPhantom();
} }
ReadableStreamBytesConsumer::~ReadableStreamBytesConsumer() {} ReadableStreamBytesConsumer::~ReadableStreamBytesConsumer() {}
...@@ -172,6 +171,7 @@ BytesConsumer::Error ReadableStreamBytesConsumer::GetError() const { ...@@ -172,6 +171,7 @@ BytesConsumer::Error ReadableStreamBytesConsumer::GetError() const {
} }
void ReadableStreamBytesConsumer::Trace(blink::Visitor* visitor) { void ReadableStreamBytesConsumer::Trace(blink::Visitor* visitor) {
visitor->Trace(reader_);
visitor->Trace(client_); visitor->Trace(client_);
visitor->Trace(pending_buffer_); visitor->Trace(pending_buffer_);
visitor->Trace(script_state_); visitor->Trace(script_state_);
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/core/fetch/bytes_consumer.h" #include "third_party/blink/renderer/core/fetch/bytes_consumer.h"
#include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h" #include "third_party/blink/renderer/core/typed_arrays/dom_typed_array.h"
#include "third_party/blink/renderer/platform/bindings/trace_wrapper_v8_reference.h"
#include "third_party/blink/renderer/platform/heap/handle.h" #include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/forward.h" #include "third_party/blink/renderer/platform/wtf/forward.h"
...@@ -22,10 +23,6 @@ class ScriptState; ...@@ -22,10 +23,6 @@ class ScriptState;
// implemented with V8 Extras. // implemented with V8 Extras.
// The stream will be immediately locked by the consumer and will never be // The stream will be immediately locked by the consumer and will never be
// released. // released.
//
// The ReadableStreamReader handle held in a ReadableStreamDataConsumerHandle
// is weak. A user must guarantee that the ReadableStreamReader object is kept
// alive appropriately.
class CORE_EXPORT ReadableStreamBytesConsumer final : public BytesConsumer { class CORE_EXPORT ReadableStreamBytesConsumer final : public BytesConsumer {
USING_PRE_FINALIZER(ReadableStreamBytesConsumer, Dispose); USING_PRE_FINALIZER(ReadableStreamBytesConsumer, Dispose);
...@@ -55,11 +52,7 @@ class CORE_EXPORT ReadableStreamBytesConsumer final : public BytesConsumer { ...@@ -55,11 +52,7 @@ class CORE_EXPORT ReadableStreamBytesConsumer final : public BytesConsumer {
void OnRejected(); void OnRejected();
void Notify(); void Notify();
// |m_reader| is a weak persistent. It should be kept alive by someone TraceWrapperV8Reference<v8::Value> reader_;
// outside of ReadableStreamBytesConsumer.
// Holding a ScopedPersistent here is safe in terms of cross-world wrapper
// leakage because we read only Uint8Array chunks from the reader.
ScopedPersistent<v8::Value> reader_;
Member<ScriptState> script_state_; Member<ScriptState> script_state_;
Member<BytesConsumer::Client> client_; Member<BytesConsumer::Client> client_;
Member<DOMUint8Array> pending_buffer_; Member<DOMUint8Array> pending_buffer_;
......
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