OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "modules/presentation/PresentationConnection.h" | 5 #include "modules/presentation/PresentationConnection.h" |
6 | 6 |
7 #include "bindings/core/v8/ScriptPromiseResolver.h" | 7 #include "bindings/core/v8/ScriptPromiseResolver.h" |
8 #include "core/dom/DOMArrayBuffer.h" | 8 #include "core/dom/DOMArrayBuffer.h" |
9 #include "core/dom/DOMArrayBufferView.h" | 9 #include "core/dom/DOMArrayBufferView.h" |
10 #include "core/dom/Document.h" | 10 #include "core/dom/Document.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 return errorValue; | 81 return errorValue; |
82 } | 82 } |
83 | 83 |
84 void throwPresentationDisconnectedError(ExceptionState& exceptionState) | 84 void throwPresentationDisconnectedError(ExceptionState& exceptionState) |
85 { | 85 { |
86 exceptionState.throwDOMException(InvalidStateError, "Presentation connection
is disconnected."); | 86 exceptionState.throwDOMException(InvalidStateError, "Presentation connection
is disconnected."); |
87 } | 87 } |
88 | 88 |
89 } // namespace | 89 } // namespace |
90 | 90 |
91 class PresentationConnection::Message final : public GarbageCollectedFinalized<P
resentationConnection::Message> { | |
92 public: | |
93 Message(const String& text) | |
94 : type(MessageTypeText) | |
95 , text(text) | |
96 { | |
97 } | |
98 | |
99 Message(DOMArrayBuffer* arrayBuffer) | |
100 : type(MessageTypeArrayBuffer) | |
101 , arrayBuffer(arrayBuffer) | |
102 { | |
103 } | |
104 | |
105 Message(PassRefPtr<BlobDataHandle> blobDataHandle) | |
106 : type(MessageTypeBlob) | |
107 , blobDataHandle(blobDataHandle) | |
108 { | |
109 } | |
110 | |
111 DEFINE_INLINE_TRACE() | |
112 { | |
113 visitor->trace(arrayBuffer); | |
114 } | |
115 | |
116 MessageType type; | |
117 String text; | |
118 Member<DOMArrayBuffer> arrayBuffer; | |
119 RefPtr<BlobDataHandle> blobDataHandle; | |
120 }; | |
121 | |
122 class PresentationConnection::BlobLoader final : public GarbageCollectedFinalize
d<PresentationConnection::BlobLoader>, public FileReaderLoaderClient { | 91 class PresentationConnection::BlobLoader final : public GarbageCollectedFinalize
d<PresentationConnection::BlobLoader>, public FileReaderLoaderClient { |
123 public: | 92 public: |
124 BlobLoader(PassRefPtr<BlobDataHandle> blobDataHandle, PresentationConnection
* PresentationConnection) | 93 BlobLoader(PassRefPtr<BlobDataHandle> blobDataHandle, PresentationConnection
* PresentationConnection) |
125 : m_PresentationConnection(PresentationConnection) | 94 : m_PresentationConnection(PresentationConnection) |
126 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) | 95 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) |
127 { | 96 { |
128 m_loader.start(m_PresentationConnection->getExecutionContext(), blobData
Handle); | 97 m_loader.start(m_PresentationConnection->getExecutionContext(), blobData
Handle); |
129 } | 98 } |
130 ~BlobLoader() override { } | 99 ~BlobLoader() override { } |
131 | 100 |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 UseCounter::count(getExecutionContext(), UseCounter::PresentationConnect
ionTerminateEventListener); | 195 UseCounter::count(getExecutionContext(), UseCounter::PresentationConnect
ionTerminateEventListener); |
227 else if (eventType == EventTypeNames::message) | 196 else if (eventType == EventTypeNames::message) |
228 UseCounter::count(getExecutionContext(), UseCounter::PresentationConnect
ionMessageEventListener); | 197 UseCounter::count(getExecutionContext(), UseCounter::PresentationConnect
ionMessageEventListener); |
229 | 198 |
230 return EventTarget::addEventListenerInternal(eventType, listener, options); | 199 return EventTarget::addEventListenerInternal(eventType, listener, options); |
231 } | 200 } |
232 | 201 |
233 DEFINE_TRACE(PresentationConnection) | 202 DEFINE_TRACE(PresentationConnection) |
234 { | 203 { |
235 visitor->trace(m_blobLoader); | 204 visitor->trace(m_blobLoader); |
236 visitor->trace(m_messages); | |
237 RefCountedGarbageCollectedEventTargetWithInlineData<PresentationConnection>:
:trace(visitor); | 205 RefCountedGarbageCollectedEventTargetWithInlineData<PresentationConnection>:
:trace(visitor); |
238 DOMWindowProperty::trace(visitor); | 206 DOMWindowProperty::trace(visitor); |
239 } | 207 } |
240 | 208 |
241 const AtomicString& PresentationConnection::state() const | 209 const AtomicString& PresentationConnection::state() const |
242 { | 210 { |
243 return connectionStateToString(m_state); | 211 return connectionStateToString(m_state); |
244 } | 212 } |
245 | 213 |
246 void PresentationConnection::send(const String& message, ExceptionState& excepti
onState) | 214 void PresentationConnection::send(const String& message, ExceptionState& excepti
onState) |
247 { | 215 { |
248 if (!canSendMessage(exceptionState)) | 216 if (!canSendMessage(exceptionState)) |
249 return; | 217 return; |
250 | 218 |
251 m_messages.append(new Message(message)); | 219 m_messages.append(adoptPtr(new Message(message))); |
252 handleMessageQueue(); | 220 handleMessageQueue(); |
253 } | 221 } |
254 | 222 |
255 void PresentationConnection::send(DOMArrayBuffer* arrayBuffer, ExceptionState& e
xceptionState) | 223 void PresentationConnection::send(PassRefPtr<DOMArrayBuffer> arrayBuffer, Except
ionState& exceptionState) |
256 { | 224 { |
257 ASSERT(arrayBuffer && arrayBuffer->buffer()); | 225 ASSERT(arrayBuffer && arrayBuffer->buffer()); |
258 if (!canSendMessage(exceptionState)) | 226 if (!canSendMessage(exceptionState)) |
259 return; | 227 return; |
260 | 228 |
261 m_messages.append(new Message(arrayBuffer)); | 229 m_messages.append(adoptPtr(new Message(arrayBuffer))); |
262 handleMessageQueue(); | 230 handleMessageQueue(); |
263 } | 231 } |
264 | 232 |
265 void PresentationConnection::send(DOMArrayBufferView* arrayBufferView, Exception
State& exceptionState) | 233 void PresentationConnection::send(PassRefPtr<DOMArrayBufferView> arrayBufferView
, ExceptionState& exceptionState) |
266 { | 234 { |
267 ASSERT(arrayBufferView); | 235 ASSERT(arrayBufferView); |
268 if (!canSendMessage(exceptionState)) | 236 if (!canSendMessage(exceptionState)) |
269 return; | 237 return; |
270 | 238 |
271 m_messages.append(new Message(arrayBufferView->buffer())); | 239 m_messages.append(adoptPtr(new Message(arrayBufferView->buffer()))); |
272 handleMessageQueue(); | 240 handleMessageQueue(); |
273 } | 241 } |
274 | 242 |
275 void PresentationConnection::send(Blob* data, ExceptionState& exceptionState) | 243 void PresentationConnection::send(Blob* data, ExceptionState& exceptionState) |
276 { | 244 { |
277 ASSERT(data); | 245 ASSERT(data); |
278 if (!canSendMessage(exceptionState)) | 246 if (!canSendMessage(exceptionState)) |
279 return; | 247 return; |
280 | 248 |
281 m_messages.append(new Message(data->blobDataHandle())); | 249 m_messages.append(adoptPtr(new Message(data->blobDataHandle()))); |
282 handleMessageQueue(); | 250 handleMessageQueue(); |
283 } | 251 } |
284 | 252 |
285 bool PresentationConnection::canSendMessage(ExceptionState& exceptionState) | 253 bool PresentationConnection::canSendMessage(ExceptionState& exceptionState) |
286 { | 254 { |
287 if (m_state != WebPresentationConnectionState::Connected) { | 255 if (m_state != WebPresentationConnectionState::Connected) { |
288 throwPresentationDisconnectedError(exceptionState); | 256 throwPresentationDisconnectedError(exceptionState); |
289 return false; | 257 return false; |
290 } | 258 } |
291 | 259 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
358 | 326 |
359 switch (m_binaryType) { | 327 switch (m_binaryType) { |
360 case BinaryTypeBlob: { | 328 case BinaryTypeBlob: { |
361 OwnPtr<BlobData> blobData = BlobData::create(); | 329 OwnPtr<BlobData> blobData = BlobData::create(); |
362 blobData->appendBytes(data, length); | 330 blobData->appendBytes(data, length); |
363 Blob* blob = Blob::create(BlobDataHandle::create(blobData.release(), len
gth)); | 331 Blob* blob = Blob::create(BlobDataHandle::create(blobData.release(), len
gth)); |
364 dispatchEvent(MessageEvent::create(blob)); | 332 dispatchEvent(MessageEvent::create(blob)); |
365 return; | 333 return; |
366 } | 334 } |
367 case BinaryTypeArrayBuffer: | 335 case BinaryTypeArrayBuffer: |
368 DOMArrayBuffer* buffer = DOMArrayBuffer::create(data, length); | 336 RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::create(data, length); |
369 dispatchEvent(MessageEvent::create(buffer)); | 337 dispatchEvent(MessageEvent::create(buffer.release())); |
370 return; | 338 return; |
371 } | 339 } |
372 ASSERT_NOT_REACHED(); | 340 ASSERT_NOT_REACHED(); |
373 } | 341 } |
374 | 342 |
375 void PresentationConnection::close() | 343 void PresentationConnection::close() |
376 { | 344 { |
377 if (m_state != WebPresentationConnectionState::Connected) | 345 if (m_state != WebPresentationConnectionState::Connected) |
378 return; | 346 return; |
379 WebPresentationClient* client = presentationClient(getExecutionContext()); | 347 WebPresentationClient* client = presentationClient(getExecutionContext()); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 | 390 |
423 void PresentationConnection::didClose(WebPresentationConnectionCloseReason reaso
n, const String& message) | 391 void PresentationConnection::didClose(WebPresentationConnectionCloseReason reaso
n, const String& message) |
424 { | 392 { |
425 if (m_state == WebPresentationConnectionState::Closed) | 393 if (m_state == WebPresentationConnectionState::Closed) |
426 return; | 394 return; |
427 | 395 |
428 m_state = WebPresentationConnectionState::Closed; | 396 m_state = WebPresentationConnectionState::Closed; |
429 dispatchEvent(PresentationConnectionCloseEvent::create(EventTypeNames::close
, connectionCloseReasonToString(reason), message)); | 397 dispatchEvent(PresentationConnectionCloseEvent::create(EventTypeNames::close
, connectionCloseReasonToString(reason), message)); |
430 } | 398 } |
431 | 399 |
432 void PresentationConnection::didFinishLoadingBlob(DOMArrayBuffer* buffer) | 400 void PresentationConnection::didFinishLoadingBlob(PassRefPtr<DOMArrayBuffer> buf
fer) |
433 { | 401 { |
434 ASSERT(!m_messages.isEmpty() && m_messages.first()->type == MessageTypeBlob)
; | 402 ASSERT(!m_messages.isEmpty() && m_messages.first()->type == MessageTypeBlob)
; |
435 ASSERT(buffer && buffer->buffer()); | 403 ASSERT(buffer && buffer->buffer()); |
436 // Send the loaded blob immediately here and continue processing the queue. | 404 // Send the loaded blob immediately here and continue processing the queue. |
437 WebPresentationClient* client = presentationClient(getExecutionContext()); | 405 WebPresentationClient* client = presentationClient(getExecutionContext()); |
438 if (client) | 406 if (client) |
439 client->sendBlobData(m_url, m_id, static_cast<const uint8_t*>(buffer->da
ta()), buffer->byteLength()); | 407 client->sendBlobData(m_url, m_id, static_cast<const uint8_t*>(buffer->da
ta()), buffer->byteLength()); |
440 | 408 |
441 m_messages.removeFirst(); | 409 m_messages.removeFirst(); |
442 m_blobLoader.clear(); | 410 m_blobLoader.clear(); |
(...skipping 10 matching lines...) Expand all Loading... |
453 handleMessageQueue(); | 421 handleMessageQueue(); |
454 } | 422 } |
455 | 423 |
456 void PresentationConnection::tearDown() | 424 void PresentationConnection::tearDown() |
457 { | 425 { |
458 // Cancel current Blob loading if any. | 426 // Cancel current Blob loading if any. |
459 if (m_blobLoader) { | 427 if (m_blobLoader) { |
460 m_blobLoader->cancel(); | 428 m_blobLoader->cancel(); |
461 m_blobLoader.clear(); | 429 m_blobLoader.clear(); |
462 } | 430 } |
463 m_messages.clear(); | 431 |
| 432 // Clear message queue. |
| 433 Deque<OwnPtr<Message>> empty; |
| 434 m_messages.swap(empty); |
464 } | 435 } |
465 | 436 |
466 } // namespace blink | 437 } // namespace blink |
OLD | NEW |