Index: third_party/WebKit/Source/modules/serviceworkers/ExtendableMessageEvent.cpp |
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ExtendableMessageEvent.cpp b/third_party/WebKit/Source/modules/serviceworkers/ExtendableMessageEvent.cpp |
index af432454b2338853b614dddda8163e90533ee65f..1e6750b122fcf179b8d859fcb1a2bb74d3ab4f7a 100644 |
--- a/third_party/WebKit/Source/modules/serviceworkers/ExtendableMessageEvent.cpp |
+++ b/third_party/WebKit/Source/modules/serviceworkers/ExtendableMessageEvent.cpp |
@@ -21,6 +21,43 @@ PassRefPtrWillBeRawPtr<ExtendableMessageEvent> ExtendableMessageEvent::create(co |
return adoptRefWillBeNoop(new ExtendableMessageEvent(type, initializer, observer)); |
} |
+PassRefPtrWillBeRawPtr<ExtendableMessageEvent> ExtendableMessageEvent::create(PassRefPtr<SerializedScriptValue> data, const String& origin, PassOwnPtrWillBeRawPtr<MessagePortArray> ports, WaitUntilObserver* observer) |
+{ |
+ return adoptRefWillBeNoop(new ExtendableMessageEvent(data, origin, ports, observer)); |
+} |
+ |
+MessagePortArray ExtendableMessageEvent::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 ExtendableMessageEvent::ports() const |
+{ |
+ bool unused; |
+ return ports(unused); |
+} |
+ |
+void ExtendableMessageEvent::source(ClientOrServiceWorkerOrMessagePort& result) const |
+{ |
+ if (m_sourceAsClient) |
+ result = ClientOrServiceWorkerOrMessagePort::fromClient(m_sourceAsClient); |
+ else if (m_sourceAsServiceWorker) |
+ result = ClientOrServiceWorkerOrMessagePort::fromServiceWorker(m_sourceAsServiceWorker); |
+ else if (m_sourceAsMessagePort) |
+ result = ClientOrServiceWorkerOrMessagePort::fromMessagePort(m_sourceAsMessagePort); |
+ else |
+ result = ClientOrServiceWorkerOrMessagePort(); |
+} |
+ |
const AtomicString& ExtendableMessageEvent::interfaceName() const |
{ |
return EventNames::ExtendableMessageEvent; |
@@ -28,6 +65,10 @@ const AtomicString& ExtendableMessageEvent::interfaceName() const |
DEFINE_TRACE(ExtendableMessageEvent) |
{ |
+ visitor->trace(m_sourceAsClient); |
+ visitor->trace(m_sourceAsServiceWorker); |
+ visitor->trace(m_sourceAsMessagePort); |
+ visitor->trace(m_ports); |
ExtendableEvent::trace(visitor); |
} |
@@ -43,7 +84,29 @@ ExtendableMessageEvent::ExtendableMessageEvent(const AtomicString& type, const E |
ExtendableMessageEvent::ExtendableMessageEvent(const AtomicString& type, const ExtendableMessageEventInit& initializer, WaitUntilObserver* observer) |
: ExtendableEvent(type, initializer, observer) |
{ |
- // TODO(nhiroki): Set attributes (crbug.com/543198). |
+ if (initializer.hasOrigin()) |
+ m_origin = initializer.origin(); |
+ if (initializer.hasSource()) { |
+ if (initializer.source().isClient()) |
+ m_sourceAsClient = initializer.source().getAsClient(); |
+ else if (initializer.source().isServiceWorker()) |
+ m_sourceAsServiceWorker = initializer.source().getAsServiceWorker(); |
+ else if (initializer.source().isMessagePort()) |
+ m_sourceAsMessagePort = initializer.source().getAsMessagePort(); |
+ } |
+ if (initializer.hasPorts()) |
+ m_ports = adoptRefWillBeNoop(new MessagePortArray(initializer.ports())); |
+} |
+ |
+ExtendableMessageEvent::ExtendableMessageEvent(PassRefPtr<SerializedScriptValue> data, const String& origin, PassOwnPtrWillBeRawPtr<MessagePortArray> ports, WaitUntilObserver* observer) |
+ : ExtendableEvent(EventTypeNames::message, ExtendableMessageEventInit(), observer) |
+ , m_serializedData(data) |
+ , m_origin(origin) |
+ , m_lastEventId(String()) |
+ , m_ports(ports) |
+{ |
+ if (m_serializedData) |
+ m_serializedData->registerMemoryAllocatedWithCurrentScriptContext(); |
} |
} // namespace blink |