OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007 Henry Mason (hmason@mac.com) | 2 * Copyright (C) 2007 Henry Mason (hmason@mac.com) |
3 * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. | 3 * Copyright (C) 2003, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 21 matching lines...) Expand all Loading... |
32 #include "bindings/core/v8/ExceptionState.h" | 32 #include "bindings/core/v8/ExceptionState.h" |
33 #include "bindings/core/v8/V8ArrayBuffer.h" | 33 #include "bindings/core/v8/V8ArrayBuffer.h" |
34 | 34 |
35 namespace blink { | 35 namespace blink { |
36 | 36 |
37 static inline bool isValidSource(EventTarget* source) | 37 static inline bool isValidSource(EventTarget* source) |
38 { | 38 { |
39 return !source || source->toDOMWindow() || source->toMessagePort(); | 39 return !source || source->toDOMWindow() || source->toMessagePort(); |
40 } | 40 } |
41 | 41 |
42 MessageEventInit::MessageEventInit() | |
43 { | |
44 } | |
45 | |
46 MessageEvent::MessageEvent() | 42 MessageEvent::MessageEvent() |
47 : m_dataType(DataTypeScriptValue) | 43 : m_dataType(DataTypeScriptValue) |
48 { | 44 { |
49 } | 45 } |
50 | 46 |
51 MessageEvent::MessageEvent(const AtomicString& type, const MessageEventInit& ini
tializer) | 47 MessageEvent::MessageEvent(const AtomicString& type, const MessageEventInit& ini
tializer) |
52 : Event(type, initializer) | 48 : Event(type, initializer) |
53 , m_dataType(DataTypeScriptValue) | 49 , m_dataType(DataTypeScriptValue) |
54 , m_origin(initializer.origin) | 50 , m_source(nullptr) |
55 , m_lastEventId(initializer.lastEventId) | |
56 , m_source(isValidSource(initializer.source.get()) ? initializer.source : nu
llptr) | |
57 , m_ports(adoptPtrWillBeNoop(new MessagePortArray(initializer.ports))) | |
58 { | 51 { |
| 52 if (initializer.hasData()) |
| 53 m_dataAsScriptValue = initializer.data(); |
| 54 if (initializer.hasOrigin()) |
| 55 m_origin = initializer.origin(); |
| 56 if (initializer.hasLastEventId()) |
| 57 m_lastEventId = initializer.lastEventId(); |
| 58 if (initializer.hasSource() && isValidSource(initializer.source().get())) |
| 59 m_source = initializer.source(); |
| 60 if (initializer.hasPorts()) |
| 61 m_ports = adoptPtrWillBeNoop(new MessagePortArray(initializer.ports())); |
59 ASSERT(isValidSource(m_source.get())); | 62 ASSERT(isValidSource(m_source.get())); |
60 } | 63 } |
61 | 64 |
62 MessageEvent::MessageEvent(const String& origin, const String& lastEventId, Pass
RefPtrWillBeRawPtr<EventTarget> source, PassOwnPtrWillBeRawPtr<MessagePortArray>
ports) | 65 MessageEvent::MessageEvent(const String& origin, const String& lastEventId, Pass
RefPtrWillBeRawPtr<EventTarget> source, PassOwnPtrWillBeRawPtr<MessagePortArray>
ports) |
63 : Event(EventTypeNames::message, false, false) | 66 : Event(EventTypeNames::message, false, false) |
64 , m_dataType(DataTypeScriptValue) | 67 , m_dataType(DataTypeScriptValue) |
65 , m_origin(origin) | 68 , m_origin(origin) |
66 , m_lastEventId(lastEventId) | 69 , m_lastEventId(lastEventId) |
67 , m_source(source) | 70 , m_source(source) |
68 , m_ports(ports) | 71 , m_ports(ports) |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
121 , m_origin(origin) | 124 , m_origin(origin) |
122 { | 125 { |
123 } | 126 } |
124 | 127 |
125 MessageEvent::~MessageEvent() | 128 MessageEvent::~MessageEvent() |
126 { | 129 { |
127 } | 130 } |
128 | 131 |
129 PassRefPtrWillBeRawPtr<MessageEvent> MessageEvent::create(const AtomicString& ty
pe, const MessageEventInit& initializer, ExceptionState& exceptionState) | 132 PassRefPtrWillBeRawPtr<MessageEvent> MessageEvent::create(const AtomicString& ty
pe, const MessageEventInit& initializer, ExceptionState& exceptionState) |
130 { | 133 { |
131 if (initializer.source.get() && !isValidSource(initializer.source.get())) { | 134 if (initializer.source().get() && !isValidSource(initializer.source().get())
) { |
132 exceptionState.throwTypeError("The optional 'source' property is neither
a Window nor MessagePort."); | 135 exceptionState.throwTypeError("The optional 'source' property is neither
a Window nor MessagePort."); |
133 return nullptr; | 136 return nullptr; |
134 } | 137 } |
135 return adoptRefWillBeNoop(new MessageEvent(type, initializer)); | 138 return adoptRefWillBeNoop(new MessageEvent(type, initializer)); |
136 } | 139 } |
137 | 140 |
138 void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bo
ol cancelable, const String& origin, const String& lastEventId, DOMWindow* sourc
e, PassOwnPtrWillBeRawPtr<MessagePortArray> ports) | 141 void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bo
ol cancelable, ScriptValue data, const String& origin, const String& lastEventId
, DOMWindow* source, PassOwnPtrWillBeRawPtr<MessagePortArray> ports) |
139 { | 142 { |
140 if (dispatched()) | 143 if (dispatched()) |
141 return; | 144 return; |
142 | 145 |
143 initEvent(type, canBubble, cancelable); | 146 initEvent(type, canBubble, cancelable); |
144 | 147 |
145 m_dataType = DataTypeScriptValue; | 148 m_dataType = DataTypeScriptValue; |
| 149 m_dataAsScriptValue = data; |
146 m_origin = origin; | 150 m_origin = origin; |
147 m_lastEventId = lastEventId; | 151 m_lastEventId = lastEventId; |
148 m_source = source; | 152 m_source = source; |
149 m_ports = ports; | 153 m_ports = ports; |
150 } | 154 } |
151 | 155 |
152 void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bo
ol cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, con
st String& lastEventId, DOMWindow* source, PassOwnPtrWillBeRawPtr<MessagePortArr
ay> ports) | 156 void MessageEvent::initMessageEvent(const AtomicString& type, bool canBubble, bo
ol cancelable, PassRefPtr<SerializedScriptValue> data, const String& origin, con
st String& lastEventId, DOMWindow* source, PassOwnPtrWillBeRawPtr<MessagePortArr
ay> ports) |
153 { | 157 { |
154 if (dispatched()) | 158 if (dispatched()) |
155 return; | 159 return; |
156 | 160 |
157 initEvent(type, canBubble, cancelable); | 161 initEvent(type, canBubble, cancelable); |
158 | 162 |
159 m_dataType = DataTypeSerializedScriptValue; | 163 m_dataType = DataTypeSerializedScriptValue; |
160 m_dataAsSerializedScriptValue = data; | 164 m_dataAsSerializedScriptValue = data; |
161 m_origin = origin; | 165 m_origin = origin; |
162 m_lastEventId = lastEventId; | 166 m_lastEventId = lastEventId; |
163 m_source = source; | 167 m_source = source; |
164 m_ports = ports; | 168 m_ports = ports; |
165 | 169 |
166 if (m_dataAsSerializedScriptValue) | 170 if (m_dataAsSerializedScriptValue) |
167 m_dataAsSerializedScriptValue->registerMemoryAllocatedWithCurrentScriptC
ontext(); | 171 m_dataAsSerializedScriptValue->registerMemoryAllocatedWithCurrentScriptC
ontext(); |
168 } | 172 } |
169 | 173 |
170 const AtomicString& MessageEvent::interfaceName() const | 174 const AtomicString& MessageEvent::interfaceName() const |
171 { | 175 { |
172 return EventNames::MessageEvent; | 176 return EventNames::MessageEvent; |
173 } | 177 } |
174 | 178 |
| 179 MessagePortArray MessageEvent::ports(bool& isNull) const |
| 180 { |
| 181 // TODO(bashi): Currently we return a copied array because the binding |
| 182 // layer could modify the content of the array while executing JS callbacks. |
| 183 // Avoid copying once we can make sure that the binding layer won't |
| 184 // modify the content. |
| 185 if (m_ports) { |
| 186 isNull = false; |
| 187 return *m_ports; |
| 188 } |
| 189 isNull = true; |
| 190 return MessagePortArray(); |
| 191 } |
| 192 |
| 193 MessagePortArray MessageEvent::ports() const |
| 194 { |
| 195 bool unused; |
| 196 return ports(unused); |
| 197 } |
| 198 |
175 void MessageEvent::entangleMessagePorts(ExecutionContext* context) | 199 void MessageEvent::entangleMessagePorts(ExecutionContext* context) |
176 { | 200 { |
177 m_ports = MessagePort::entanglePorts(*context, m_channels.release()); | 201 m_ports = MessagePort::entanglePorts(*context, m_channels.release()); |
178 } | 202 } |
179 | 203 |
180 DEFINE_TRACE(MessageEvent) | 204 DEFINE_TRACE(MessageEvent) |
181 { | 205 { |
182 visitor->trace(m_dataAsBlob); | 206 visitor->trace(m_dataAsBlob); |
183 visitor->trace(m_source); | 207 visitor->trace(m_source); |
184 #if ENABLE(OILPAN) | 208 #if ENABLE(OILPAN) |
(...skipping 20 matching lines...) Expand all Loading... |
205 break; | 229 break; |
206 case MessageEvent::DataTypeArrayBuffer: | 230 case MessageEvent::DataTypeArrayBuffer: |
207 V8HiddenValue::setHiddenValue(isolate, wrapper, V8HiddenValue::arrayBuff
erData(isolate), toV8(dataAsArrayBuffer(), wrapper, isolate)); | 231 V8HiddenValue::setHiddenValue(isolate, wrapper, V8HiddenValue::arrayBuff
erData(isolate), toV8(dataAsArrayBuffer(), wrapper, isolate)); |
208 break; | 232 break; |
209 } | 233 } |
210 | 234 |
211 return wrapper; | 235 return wrapper; |
212 } | 236 } |
213 | 237 |
214 } // namespace blink | 238 } // namespace blink |
OLD | NEW |