Index: Source/core/events/MessageEvent.cpp |
diff --git a/Source/core/events/MessageEvent.cpp b/Source/core/events/MessageEvent.cpp |
index 5cd5e0be0f151a9b6d3abb7df5734a5144be563a..a1d7d51d3b47494bdfd982a80aac45988451f251 100644 |
--- a/Source/core/events/MessageEvent.cpp |
+++ b/Source/core/events/MessageEvent.cpp |
@@ -39,10 +39,6 @@ static inline bool isValidSource(EventTarget* source) |
return !source || source->toDOMWindow() || source->toMessagePort(); |
} |
-MessageEventInit::MessageEventInit() |
-{ |
-} |
- |
MessageEvent::MessageEvent() |
: m_dataType(DataTypeScriptValue) |
{ |
@@ -51,11 +47,18 @@ MessageEvent::MessageEvent() |
MessageEvent::MessageEvent(const AtomicString& type, const MessageEventInit& initializer) |
: Event(type, initializer) |
, m_dataType(DataTypeScriptValue) |
- , m_origin(initializer.origin) |
- , m_lastEventId(initializer.lastEventId) |
- , m_source(isValidSource(initializer.source.get()) ? initializer.source : nullptr) |
- , m_ports(adoptPtrWillBeNoop(new MessagePortArray(initializer.ports))) |
-{ |
+ , m_source(nullptr) |
+{ |
+ if (initializer.hasData()) |
+ m_dataAsScriptValue = initializer.data(); |
+ if (initializer.hasOrigin()) |
+ m_origin = initializer.origin(); |
+ if (initializer.hasLastEventId()) |
+ m_lastEventId = initializer.lastEventId(); |
+ if (initializer.hasSource() && isValidSource(initializer.source().get())) |
+ m_source = initializer.source(); |
+ if (initializer.hasPorts()) |
+ m_ports = adoptPtrWillBeNoop(new MessagePortArray(initializer.ports())); |
ASSERT(isValidSource(m_source.get())); |
} |
@@ -128,14 +131,14 @@ MessageEvent::~MessageEvent() |
PassRefPtrWillBeRawPtr<MessageEvent> MessageEvent::create(const AtomicString& type, const MessageEventInit& initializer, ExceptionState& exceptionState) |
{ |
- if (initializer.source.get() && !isValidSource(initializer.source.get())) { |
+ if (initializer.source().get() && !isValidSource(initializer.source().get())) { |
exceptionState.throwTypeError("The optional 'source' property is neither a Window nor MessagePort."); |
return nullptr; |
} |
return adoptRefWillBeNoop(new MessageEvent(type, initializer)); |
} |
-void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, const String& origin, const String& lastEventId, DOMWindow* source, PassOwnPtrWillBeRawPtr<MessagePortArray> ports) |
+void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bool cancelable, ScriptValue data, const String& origin, const String& lastEventId, DOMWindow* source, PassOwnPtrWillBeRawPtr<MessagePortArray> ports) |
{ |
if (dispatched()) |
return; |
@@ -143,6 +146,7 @@ void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bo |
initEvent(type, canBubble, cancelable); |
m_dataType = DataTypeScriptValue; |
+ m_dataAsScriptValue = data; |
m_origin = origin; |
m_lastEventId = lastEventId; |
m_source = source; |
@@ -172,6 +176,26 @@ const AtomicString& MessageEvent::interfaceName() const |
return EventNames::MessageEvent; |
} |
+MessagePortArray MessageEvent::ports(bool& isNull) const |
+{ |
+ // TODO(bashi): Currently we return a copied array because the binding |
+ // layer could modify the content of the array while executing JS callbacks. |
+ // Avoid copying once we can make sure that the binding layer won't |
+ // modify the content. |
+ if (m_ports) { |
+ isNull = false; |
+ return *m_ports; |
+ } |
+ isNull = true; |
+ return MessagePortArray(); |
+} |
+ |
+MessagePortArray MessageEvent::ports() const |
+{ |
+ bool unused; |
+ return ports(unused); |
+} |
+ |
void MessageEvent::entangleMessagePorts(ExecutionContext* context) |
{ |
m_ports = MessagePort::entanglePorts(*context, m_channels.release()); |