messageEvent.source can also be a ServiceWorker
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Oct 2017 02:57:08 +0000 (02:57 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 26 Oct 2017 02:57:08 +0000 (02:57 +0000)
https://bugs.webkit.org/show_bug.cgi?id=178839

Reviewed by Brady Eidson.

messageEvent.source can also be a ServiceWorker:
- https://html.spec.whatwg.org/multipage/comms.html#messageeventsource

This enables calling postMessage() from a ServiceWorker via Bug 178794.

* dom/MessageEvent.cpp:
(WebCore::MessageEvent::source const): Deleted.
* dom/MessageEvent.h:
* dom/MessageEvent.idl:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@224000 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/dom/MessageEvent.cpp
Source/WebCore/dom/MessageEvent.h
Source/WebCore/dom/MessageEvent.idl

index 059cc1d..d16cb5a 100644 (file)
@@ -1,3 +1,20 @@
+2017-10-25  Chris Dumez  <cdumez@apple.com>
+
+        messageEvent.source can also be a ServiceWorker
+        https://bugs.webkit.org/show_bug.cgi?id=178839
+
+        Reviewed by Brady Eidson.
+
+        messageEvent.source can also be a ServiceWorker:
+        - https://html.spec.whatwg.org/multipage/comms.html#messageeventsource
+
+        This enables calling postMessage() from a ServiceWorker via Bug 178794.
+
+        * dom/MessageEvent.cpp:
+        (WebCore::MessageEvent::source const): Deleted.
+        * dom/MessageEvent.h:
+        * dom/MessageEvent.idl:
+
 2017-10-25  Ryosuke Niwa  <rniwa@webkit.org>
 
         Style::Scope::flushPendingUpdate() can replace the entire document in XSLTProcessor::createDocumentFromSource
index 548596c..e9889e5 100644 (file)
@@ -150,17 +150,6 @@ void MessageEvent::initMessageEvent(ExecState& state, const AtomicString& type,
     m_ports = WTFMove(ports);
 }
 
-EventTarget* MessageEvent::source() const
-{
-    if (!m_source)
-        return nullptr;
-
-    return WTF::switchOn(m_source.value(),
-        [] (const RefPtr<DOMWindow>& window) -> EventTarget* { return const_cast<DOMWindow*>(window.get()); },
-        [] (const RefPtr<MessagePort>& messagePort) -> EventTarget* { return const_cast<MessagePort*>(messagePort.get()); }
-    );
-}
-
 RefPtr<SerializedScriptValue> MessageEvent::trySerializeData(ExecState* exec)
 {
     ASSERT(!m_dataAsScriptValue.hasNoValue());
index efd65b3..ad110f0 100644 (file)
@@ -31,6 +31,7 @@
 #include "Event.h"
 #include "MessagePort.h"
 #include "SerializedScriptValue.h"
+#include "ServiceWorker.h"
 #include <bindings/ScriptValue.h>
 #include <wtf/Variant.h>
 
@@ -38,7 +39,11 @@ namespace WebCore {
 
 class Blob;
 
+#if ENABLE(SERVICE_WORKER)
+using MessageEventSource = Variant<RefPtr<DOMWindow>, RefPtr<MessagePort>, RefPtr<ServiceWorker>>;
+#else
 using MessageEventSource = Variant<RefPtr<DOMWindow>, RefPtr<MessagePort>>;
+#endif
 
 class MessageEvent final : public Event {
 public:
@@ -64,7 +69,7 @@ public:
 
     const String& origin() const { return m_origin; }
     const String& lastEventId() const { return m_lastEventId; }
-    EventTarget* source() const;
+    const std::optional<MessageEventSource>& source() const { return m_source; }
     const Vector<RefPtr<MessagePort>>& ports() const { return m_ports; }
 
     // FIXME: Remove this when we have custom ObjC binding support.
index cb92e01..664d0ab 100644 (file)
  *
  */
 
+#if defined(ENABLE_SERVICE_WORKER) && ENABLE_SERVICE_WORKER
+typedef (DOMWindow or MessagePort or ServiceWorker) MessageEventSource;
+#else
+typedef (DOMWindow or MessagePort) MessageEventSource;
+#endif
+
 [
     Constructor(DOMString type, optional MessageEventInit eventInitDict),
     ConstructorCallWith=ScriptState,
 ] interface MessageEvent : Event {
     readonly attribute USVString origin;
     readonly attribute DOMString lastEventId;
-    readonly attribute EventTarget? source;
+    readonly attribute MessageEventSource? source;
     [CachedAttribute, CustomGetter] readonly attribute any data;
     readonly attribute FrozenArray<MessagePort> ports;
 
     [CallWith=ScriptState] void initMessageEvent(DOMString type, optional boolean bubbles = false, optional boolean cancelable = false,
-        optional any data = null, optional USVString originArg = "", optional DOMString lastEventId = "", optional (DOMWindow or MessagePort)? source = null,
+        optional any data = null, optional USVString originArg = "", optional DOMString lastEventId = "", optional MessageEventSource? source = null,
         optional sequence<MessagePort> messagePorts = []);
 };
 
@@ -46,6 +52,6 @@ dictionary MessageEventInit : EventInit {
       any data = null;
       USVString origin = "";
       DOMString lastEventId = "";
-      (DOMWindow or MessagePort)? source = null;
+      MessageEventSource? source = null;
       sequence<MessagePort> ports = [];
 };