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