Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Unified Diff: third_party/WebKit/Source/core/events/MessageEvent.cpp

Issue 2849373002: Stop storing ScriptValue in MessageEvent (Closed)
Patch Set: Fix tests Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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:
« no previous file with comments | « third_party/WebKit/Source/core/events/MessageEvent.h ('k') | third_party/WebKit/Source/core/events/MessageEvent.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698