2 * Copyright (C) 2007 Henry Mason (hmason@mac.com)
3 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #ifndef MessageEvent_h
29 #define MessageEvent_h
31 #include "bindings/core/v8/SerializedScriptValue.h"
32 #include "core/CoreExport.h"
33 #include "core/dom/DOMArrayBuffer.h"
34 #include "core/dom/MessagePort.h"
35 #include "core/events/Event.h"
36 #include "core/events/EventTarget.h"
37 #include "core/events/MessageEventInit.h"
38 #include "core/fileapi/Blob.h"
39 #include "core/frame/DOMWindow.h"
43 class CORE_EXPORT MessageEvent final
: public Event
{
44 DEFINE_WRAPPERTYPEINFO();
46 static PassRefPtrWillBeRawPtr
<MessageEvent
> create()
48 return adoptRefWillBeNoop(new MessageEvent
);
50 static PassRefPtrWillBeRawPtr
<MessageEvent
> create(MessagePortArray
* ports
, const String
& origin
= String(), const String
& lastEventId
= String(), PassRefPtrWillBeRawPtr
<EventTarget
> source
= nullptr)
52 return adoptRefWillBeNoop(new MessageEvent(origin
, lastEventId
, source
, ports
));
54 static PassRefPtrWillBeRawPtr
<MessageEvent
> create(MessagePortArray
* ports
, PassRefPtr
<SerializedScriptValue
> data
, const String
& origin
= String(), const String
& lastEventId
= String(), PassRefPtrWillBeRawPtr
<EventTarget
> source
= nullptr)
56 return adoptRefWillBeNoop(new MessageEvent(data
, origin
, lastEventId
, source
, ports
));
58 static PassRefPtrWillBeRawPtr
<MessageEvent
> create(PassOwnPtr
<MessagePortChannelArray
> channels
, PassRefPtr
<SerializedScriptValue
> data
, const String
& origin
= String(), const String
& lastEventId
= String(), PassRefPtrWillBeRawPtr
<EventTarget
> source
= nullptr)
60 return adoptRefWillBeNoop(new MessageEvent(data
, origin
, lastEventId
, source
, channels
));
62 static PassRefPtrWillBeRawPtr
<MessageEvent
> create(const String
& data
, const String
& origin
= String())
64 return adoptRefWillBeNoop(new MessageEvent(data
, origin
));
66 static PassRefPtrWillBeRawPtr
<MessageEvent
> create(Blob
* data
, const String
& origin
= String())
68 return adoptRefWillBeNoop(new MessageEvent(data
, origin
));
70 static PassRefPtrWillBeRawPtr
<MessageEvent
> create(PassRefPtr
<DOMArrayBuffer
> data
, const String
& origin
= String())
72 return adoptRefWillBeNoop(new MessageEvent(data
, origin
));
74 static PassRefPtrWillBeRawPtr
<MessageEvent
> create(const AtomicString
& type
, const MessageEventInit
& initializer
, ExceptionState
&);
75 ~MessageEvent() override
;
77 void initMessageEvent(const AtomicString
& type
, bool canBubble
, bool cancelable
, ScriptValue data
, const String
& origin
, const String
& lastEventId
, DOMWindow
* source
, MessagePortArray
*);
78 void initMessageEvent(const AtomicString
& type
, bool canBubble
, bool cancelable
, PassRefPtr
<SerializedScriptValue
> data
, const String
& origin
, const String
& lastEventId
, DOMWindow
* source
, MessagePortArray
*);
80 const String
& origin() const { return m_origin
; }
81 const String
& lastEventId() const { return m_lastEventId
; }
82 EventTarget
* source() const { return m_source
.get(); }
83 MessagePortArray
ports(bool& isNull
) const;
84 MessagePortArray
ports() const;
85 MessagePortChannelArray
* channels() const { return m_channels
? m_channels
.get() : nullptr; }
87 const AtomicString
& interfaceName() const override
;
91 DataTypeSerializedScriptValue
,
96 DataType
dataType() const { return m_dataType
; }
97 ScriptValue
dataAsScriptValue() const { ASSERT(m_dataType
== DataTypeScriptValue
); return m_dataAsScriptValue
; }
98 SerializedScriptValue
* dataAsSerializedScriptValue() const { ASSERT(m_dataType
== DataTypeSerializedScriptValue
); return m_dataAsSerializedScriptValue
.get(); }
99 String
dataAsString() const { ASSERT(m_dataType
== DataTypeString
); return m_dataAsString
; }
100 Blob
* dataAsBlob() const { ASSERT(m_dataType
== DataTypeBlob
); return m_dataAsBlob
.get(); }
101 DOMArrayBuffer
* dataAsArrayBuffer() const { ASSERT(m_dataType
== DataTypeArrayBuffer
); return m_dataAsArrayBuffer
.get(); }
103 void setSerializedData(PassRefPtr
<SerializedScriptValue
> data
)
105 ASSERT(!m_dataAsSerializedScriptValue
);
106 m_dataAsSerializedScriptValue
= data
;
109 void entangleMessagePorts(ExecutionContext
*);
111 DECLARE_VIRTUAL_TRACE();
113 v8::Local
<v8::Object
> associateWithWrapper(v8::Isolate
*, const WrapperTypeInfo
*, v8::Local
<v8::Object
> wrapper
) override WARN_UNUSED_RETURN
;
117 MessageEvent(const AtomicString
&, const MessageEventInit
&);
118 MessageEvent(const String
& origin
, const String
& lastEventId
, PassRefPtrWillBeRawPtr
<EventTarget
> source
, MessagePortArray
*);
119 MessageEvent(PassRefPtr
<SerializedScriptValue
> data
, const String
& origin
, const String
& lastEventId
, PassRefPtrWillBeRawPtr
<EventTarget
> source
, MessagePortArray
*);
120 MessageEvent(PassRefPtr
<SerializedScriptValue
> data
, const String
& origin
, const String
& lastEventId
, PassRefPtrWillBeRawPtr
<EventTarget
> source
, PassOwnPtr
<MessagePortChannelArray
>);
122 MessageEvent(const String
& data
, const String
& origin
);
123 MessageEvent(Blob
* data
, const String
& origin
);
124 MessageEvent(PassRefPtr
<DOMArrayBuffer
> data
, const String
& origin
);
127 ScriptValue m_dataAsScriptValue
;
128 RefPtr
<SerializedScriptValue
> m_dataAsSerializedScriptValue
;
129 String m_dataAsString
;
130 PersistentWillBeMember
<Blob
> m_dataAsBlob
;
131 RefPtr
<DOMArrayBuffer
> m_dataAsArrayBuffer
;
133 String m_lastEventId
;
134 RefPtrWillBeMember
<EventTarget
> m_source
;
135 // m_ports are the MessagePorts in an engtangled state, and m_channels are
136 // the MessageChannels in a disentangled state. Only one of them can be
137 // non-empty at a time. entangleMessagePorts() moves between the states.
138 PersistentWillBeMember
<MessagePortArray
> m_ports
;
139 OwnPtr
<MessagePortChannelArray
> m_channels
;
144 #endif // MessageEvent_h