| Index: third_party/WebKit/Source/core/events/MessageEvent.cpp
|
| diff --git a/third_party/WebKit/Source/core/events/MessageEvent.cpp b/third_party/WebKit/Source/core/events/MessageEvent.cpp
|
| index 53ad37f028a60d150417f408a0aa598dd1dfd915..69e566b8bafd6e472e1eddc3edb59935262ea562 100644
|
| --- a/third_party/WebKit/Source/core/events/MessageEvent.cpp
|
| +++ b/third_party/WebKit/Source/core/events/MessageEvent.cpp
|
| @@ -40,15 +40,21 @@ static inline bool IsValidSource(EventTarget* source) {
|
| source->ToServiceWorker();
|
| }
|
|
|
| -MessageEvent::MessageEvent() : data_type_(kDataTypeScriptValue) {}
|
| +MessageEvent::MessageEvent()
|
| + : data_type_(kDataTypeV8Reference), data_as_v8_value_reference_(this) {}
|
|
|
| -MessageEvent::MessageEvent(const AtomicString& type,
|
| +MessageEvent::MessageEvent(ScriptState* script_state,
|
| + const AtomicString& type,
|
| const MessageEventInit& initializer)
|
| : Event(type, initializer),
|
| - data_type_(kDataTypeScriptValue),
|
| + data_type_(kDataTypeV8Reference),
|
| + data_as_v8_value_reference_(this),
|
| source_(nullptr) {
|
| - if (initializer.hasData())
|
| - data_as_script_value_ = initializer.data();
|
| + if (initializer.hasData()) {
|
| + world_ = RefPtr<DOMWrapperWorld>(script_state->World());
|
| + data_as_v8_value_reference_.Set(initializer.data().GetIsolate(),
|
| + initializer.data().V8Value());
|
| + }
|
| if (initializer.hasOrigin())
|
| origin_ = initializer.origin();
|
| if (initializer.hasLastEventId())
|
| @@ -66,7 +72,8 @@ MessageEvent::MessageEvent(const String& origin,
|
| MessagePortArray* ports,
|
| const String& suborigin)
|
| : Event(EventTypeNames::message, false, false),
|
| - data_type_(kDataTypeScriptValue),
|
| + data_type_(kDataTypeV8Reference),
|
| + data_as_v8_value_reference_(this),
|
| origin_(origin),
|
| last_event_id_(last_event_id),
|
| source_(source),
|
| @@ -82,6 +89,7 @@ MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data,
|
| const String& suborigin)
|
| : Event(EventTypeNames::message, false, false),
|
| data_type_(kDataTypeSerializedScriptValue),
|
| + data_as_v8_value_reference_(this),
|
| data_as_serialized_script_value_(std::move(data)),
|
| origin_(origin),
|
| last_event_id_(last_event_id),
|
| @@ -101,6 +109,7 @@ MessageEvent::MessageEvent(PassRefPtr<SerializedScriptValue> data,
|
| const String& suborigin)
|
| : Event(EventTypeNames::message, false, false),
|
| data_type_(kDataTypeSerializedScriptValue),
|
| + data_as_v8_value_reference_(this),
|
| data_as_serialized_script_value_(std::move(data)),
|
| origin_(origin),
|
| last_event_id_(last_event_id),
|
| @@ -118,6 +127,7 @@ MessageEvent::MessageEvent(const String& data,
|
| const String& suborigin)
|
| : Event(EventTypeNames::message, false, false),
|
| data_type_(kDataTypeString),
|
| + data_as_v8_value_reference_(this),
|
| data_as_string_(data),
|
| origin_(origin) {}
|
|
|
| @@ -126,6 +136,7 @@ MessageEvent::MessageEvent(Blob* data,
|
| const String& suborigin)
|
| : Event(EventTypeNames::message, false, false),
|
| data_type_(kDataTypeBlob),
|
| + data_as_v8_value_reference_(this),
|
| data_as_blob_(data),
|
| origin_(origin) {}
|
|
|
| @@ -134,12 +145,14 @@ MessageEvent::MessageEvent(DOMArrayBuffer* data,
|
| const String& suborigin)
|
| : Event(EventTypeNames::message, false, false),
|
| data_type_(kDataTypeArrayBuffer),
|
| + data_as_v8_value_reference_(this),
|
| data_as_array_buffer_(data),
|
| origin_(origin) {}
|
|
|
| MessageEvent::~MessageEvent() {}
|
|
|
| -MessageEvent* MessageEvent::Create(const AtomicString& type,
|
| +MessageEvent* MessageEvent::Create(ScriptState* script_state,
|
| + const AtomicString& type,
|
| const MessageEventInit& initializer,
|
| ExceptionState& exception_state) {
|
| if (initializer.source() && !IsValidSource(initializer.source())) {
|
| @@ -147,10 +160,11 @@ MessageEvent* MessageEvent::Create(const AtomicString& type,
|
| "The optional 'source' property is neither a Window nor MessagePort.");
|
| return nullptr;
|
| }
|
| - return new MessageEvent(type, initializer);
|
| + return new MessageEvent(script_state, type, initializer);
|
| }
|
|
|
| -void MessageEvent::initMessageEvent(const AtomicString& type,
|
| +void MessageEvent::initMessageEvent(ScriptState* script_state,
|
| + const AtomicString& type,
|
| bool can_bubble,
|
| bool cancelable,
|
| ScriptValue data,
|
| @@ -163,8 +177,11 @@ void MessageEvent::initMessageEvent(const AtomicString& type,
|
|
|
| initEvent(type, can_bubble, cancelable);
|
|
|
| - data_type_ = kDataTypeScriptValue;
|
| - data_as_script_value_ = data;
|
| + data_type_ = kDataTypeV8Reference;
|
| + if (!data.IsEmpty()) {
|
| + world_ = RefPtr<DOMWrapperWorld>(script_state->World());
|
| + data_as_v8_value_reference_.Set(data.GetIsolate(), data.V8Value());
|
| + }
|
| origin_ = origin;
|
| last_event_id_ = last_event_id;
|
| source_ = source;
|
| @@ -224,6 +241,23 @@ const AtomicString& MessageEvent::InterfaceName() const {
|
| return EventNames::MessageEvent;
|
| }
|
|
|
| +ScriptValue MessageEvent::DataAsScriptValue(ScriptState* script_state) const {
|
| + DCHECK_EQ(data_type_, kDataTypeV8Reference);
|
| + DCHECK(script_state);
|
| + v8::Isolate* isolate = script_state->GetIsolate();
|
| + if (data_as_v8_value_reference_.IsEmpty())
|
| + return ScriptValue(script_state, v8::Null(isolate));
|
| + // Returns a clone of the v8 value if the world is different.
|
| + if (!world_ || world_->GetWorldId() != script_state->World().GetWorldId()) {
|
| + v8::Local<v8::Value> value = data_as_v8_value_reference_.NewLocal(isolate);
|
| + RefPtr<SerializedScriptValue> serialized =
|
| + SerializedScriptValue::SerializeAndSwallowExceptions(isolate, value);
|
| + return ScriptValue(script_state, serialized->Deserialize(isolate));
|
| + }
|
| + return ScriptValue(script_state,
|
| + data_as_v8_value_reference_.NewLocal(isolate));
|
| +}
|
| +
|
| MessagePortArray MessageEvent::ports(bool& is_null) const {
|
| // TODO(bashi): Currently we return a copied array because the binding
|
| // layer could modify the content of the array while executing JS callbacks.
|
| @@ -254,6 +288,11 @@ DEFINE_TRACE(MessageEvent) {
|
| Event::Trace(visitor);
|
| }
|
|
|
| +DEFINE_TRACE_WRAPPERS(MessageEvent) {
|
| + visitor->TraceWrappers(data_as_v8_value_reference_);
|
| + Event::TraceWrappers(visitor);
|
| +}
|
| +
|
| v8::Local<v8::Object> MessageEvent::AssociateWithWrapper(
|
| v8::Isolate* isolate,
|
| const WrapperTypeInfo* wrapper_type,
|
| @@ -264,7 +303,7 @@ v8::Local<v8::Object> MessageEvent::AssociateWithWrapper(
|
| // how much memory is used via the wrapper. To keep the wrapper alive, it's
|
| // set to the wrapper of the MessageEvent as a private value.
|
| switch (GetDataType()) {
|
| - case MessageEvent::kDataTypeScriptValue:
|
| + case MessageEvent::kDataTypeV8Reference:
|
| case MessageEvent::kDataTypeSerializedScriptValue:
|
| break;
|
| case MessageEvent::kDataTypeString:
|
|
|