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 aba2ca04f8d5357793f78660b892ecbf9b4f28a9..1b3f1cac1f6cfeb9b67a09b85a17af86a0285fdb 100644 |
--- a/third_party/WebKit/Source/core/events/MessageEvent.cpp |
+++ b/third_party/WebKit/Source/core/events/MessageEvent.cpp |
@@ -40,15 +40,19 @@ 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, |
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()) { |
+ data_as_v8_value_reference_.Set(initializer.data().GetIsolate(), |
+ initializer.data().V8Value()); |
+ } |
if (initializer.hasOrigin()) |
origin_ = initializer.origin(); |
if (initializer.hasLastEventId()) |
@@ -66,7 +70,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 +87,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 +107,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 +125,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 +134,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,6 +143,7 @@ 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) {} |
@@ -163,8 +173,9 @@ 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()) |
+ data_as_v8_value_reference_.Set(data.GetIsolate(), data.V8Value()); |
origin_ = origin; |
last_event_id_ = last_event_id; |
source_ = source; |
@@ -224,6 +235,13 @@ const AtomicString& MessageEvent::InterfaceName() const { |
return EventNames::MessageEvent; |
} |
+ScriptValue MessageEvent::DataAsScriptValue(ScriptState* script_state) const { |
+ DCHECK_EQ(data_type_, kDataTypeV8Reference); |
+ DCHECK(script_state); |
+ return ScriptValue(script_state, data_as_v8_value_reference_.NewLocal( |
haraken
2017/05/02 07:24:41
Do you know why we don't need to check the world b
bashi
2017/05/02 07:38:12
In V8MessageEvent::dataAttributeGetterCustom() we
bashi
2017/05/09 08:09:33
Sorry I was wrong. We need to check world here. Ch
|
+ script_state->GetIsolate())); |
+} |
+ |
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 +272,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 +287,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: |