diff options
Diffstat (limited to 'WebCore/dom/MessagePort.h')
| -rw-r--r-- | WebCore/dom/MessagePort.h | 51 |
1 files changed, 33 insertions, 18 deletions
diff --git a/WebCore/dom/MessagePort.h b/WebCore/dom/MessagePort.h index f416b9b..ae1eb22 100644 --- a/WebCore/dom/MessagePort.h +++ b/WebCore/dom/MessagePort.h @@ -29,9 +29,9 @@ #include "AtomicStringHash.h" #include "EventListener.h" +#include "EventNames.h" #include "EventTarget.h" #include "MessagePortChannel.h" - #include <wtf/HashMap.h> #include <wtf/OwnPtr.h> #include <wtf/PassOwnPtr.h> @@ -44,22 +44,38 @@ namespace WebCore { class AtomicStringImpl; class Event; class Frame; + class MessagePort; class ScriptExecutionContext; class String; + // The overwhelmingly common case is sending a single port, so handle that efficiently with an inline buffer of size 1. + typedef Vector<RefPtr<MessagePort>, 1> MessagePortArray; + class MessagePort : public RefCounted<MessagePort>, public EventTarget { public: static PassRefPtr<MessagePort> create(ScriptExecutionContext& scriptExecutionContext) { return adoptRef(new MessagePort(scriptExecutionContext)); } ~MessagePort(); - void postMessage(const String& message, ExceptionCode&); - void postMessage(const String& message, MessagePort*, ExceptionCode&); + void postMessage(PassRefPtr<SerializedScriptValue> message, ExceptionCode&); + void postMessage(PassRefPtr<SerializedScriptValue> message, const MessagePortArray*, ExceptionCode&); + // FIXME: remove this when we update the ObjC bindings (bug #28774). + void postMessage(PassRefPtr<SerializedScriptValue> message, MessagePort*, ExceptionCode&); + void start(); void close(); void entangle(PassOwnPtr<MessagePortChannel>); PassOwnPtr<MessagePortChannel> disentangle(ExceptionCode&); + // Disentangle an array of ports, returning the entangled channels. + // Per section 8.3.3 of the HTML5 spec, generates an INVALID_STATE_ERR exception if any of the passed ports are null or not entangled. + // Returns 0 if there is an exception, or if the passed-in array is 0/empty. + static PassOwnPtr<MessagePortChannelArray> disentanglePorts(const MessagePortArray*, ExceptionCode&); + + // Entangles an array of channels, returning an array of MessagePorts in matching order. + // Returns 0 if the passed array is 0/empty. + static PassOwnPtr<MessagePortArray> entanglePorts(ScriptExecutionContext&, PassOwnPtr<MessagePortChannelArray>); + void messageAvailable(); bool started() const { return m_started; } @@ -71,43 +87,42 @@ namespace WebCore { void dispatchMessages(); - virtual void addEventListener(const AtomicString& eventType, PassRefPtr<EventListener>, bool useCapture); - virtual void removeEventListener(const AtomicString& eventType, EventListener*, bool useCapture); - virtual bool dispatchEvent(PassRefPtr<Event>, ExceptionCode&); - - typedef Vector<RefPtr<EventListener> > ListenerVector; - typedef HashMap<AtomicString, ListenerVector> EventListenersMap; - EventListenersMap& eventListeners() { return m_eventListeners; } - using RefCounted<MessagePort>::ref; using RefCounted<MessagePort>::deref; bool hasPendingActivity(); - void setOnmessage(PassRefPtr<EventListener>); - EventListener* onmessage() const { return m_onMessageListener.get(); } + void setOnmessage(PassRefPtr<EventListener> listener) + { + setAttributeEventListener(eventNames().messageEvent, listener); + start(); + } + EventListener* onmessage() { return getAttributeEventListener(eventNames().messageEvent); } // Returns null if there is no entangled port, or if the entangled port is run by a different thread. // Returns null otherwise. // NOTE: This is used solely to enable a GC optimization. Some platforms may not be able to determine ownership of the remote port (since it may live cross-process) - those platforms may always return null. MessagePort* locallyEntangledPort(); - bool isEntangled() { return m_entangledChannel; } + // A port starts out its life entangled, and remains entangled until it is closed or is cloned. + bool isEntangled() { return !m_closed && !isCloned(); } + // A port is cloned if its entangled channel has been removed and sent to a new owner via postMessage(). + bool isCloned() { return !m_entangledChannel; } private: MessagePort(ScriptExecutionContext&); virtual void refEventTarget() { ref(); } virtual void derefEventTarget() { deref(); } + virtual EventTargetData* eventTargetData(); + virtual EventTargetData* ensureEventTargetData(); OwnPtr<MessagePortChannel> m_entangledChannel; bool m_started; + bool m_closed; ScriptExecutionContext* m_scriptExecutionContext; - - RefPtr<EventListener> m_onMessageListener; - - EventListenersMap m_eventListeners; + EventTargetData m_eventTargetData; }; } // namespace WebCore |
