| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * 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 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 132 { | 132 { |
| 133 return code == WebSocketChannel::CloseEventCodeNormalClosure | 133 return code == WebSocketChannel::CloseEventCodeNormalClosure |
| 134 || (WebSocketChannel::CloseEventCodeMinimumUserDefined <= code | 134 || (WebSocketChannel::CloseEventCodeMinimumUserDefined <= code |
| 135 && code <= WebSocketChannel::CloseEventCodeMaximumUserDefined); | 135 && code <= WebSocketChannel::CloseEventCodeMaximumUserDefined); |
| 136 } | 136 } |
| 137 | 137 |
| 138 } // namespace | 138 } // namespace |
| 139 | 139 |
| 140 class NewWebSocketChannelImpl::BlobLoader : public FileReaderLoaderClient { | 140 class NewWebSocketChannelImpl::BlobLoader : public FileReaderLoaderClient { |
| 141 public: | 141 public: |
| 142 BlobLoader(const Blob&, NewWebSocketChannelImpl*); | 142 BlobLoader(PassRefPtr<BlobDataHandle>, NewWebSocketChannelImpl*); |
| 143 virtual ~BlobLoader() { } | 143 virtual ~BlobLoader() { } |
| 144 | 144 |
| 145 void cancel(); | 145 void cancel(); |
| 146 | 146 |
| 147 // FileReaderLoaderClient functions. | 147 // FileReaderLoaderClient functions. |
| 148 virtual void didStartLoading() OVERRIDE { } | 148 virtual void didStartLoading() OVERRIDE { } |
| 149 virtual void didReceiveData() OVERRIDE { } | 149 virtual void didReceiveData() OVERRIDE { } |
| 150 virtual void didFinishLoading() OVERRIDE; | 150 virtual void didFinishLoading() OVERRIDE; |
| 151 virtual void didFail(FileError::ErrorCode) OVERRIDE; | 151 virtual void didFail(FileError::ErrorCode) OVERRIDE; |
| 152 | 152 |
| 153 private: | 153 private: |
| 154 NewWebSocketChannelImpl* m_channel; | 154 NewWebSocketChannelImpl* m_channel; |
| 155 FileReaderLoader m_loader; | 155 FileReaderLoader m_loader; |
| 156 }; | 156 }; |
| 157 | 157 |
| 158 NewWebSocketChannelImpl::BlobLoader::BlobLoader(const Blob& blob, NewWebSocketCh
annelImpl* channel) | 158 NewWebSocketChannelImpl::BlobLoader::BlobLoader(PassRefPtr<BlobDataHandle> blobD
ataHandle, NewWebSocketChannelImpl* channel) |
| 159 : m_channel(channel) | 159 : m_channel(channel) |
| 160 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) | 160 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) |
| 161 { | 161 { |
| 162 m_loader.start(channel->executionContext(), blob); | 162 m_loader.start(channel->executionContext(), blobDataHandle); |
| 163 } | 163 } |
| 164 | 164 |
| 165 void NewWebSocketChannelImpl::BlobLoader::cancel() | 165 void NewWebSocketChannelImpl::BlobLoader::cancel() |
| 166 { | 166 { |
| 167 m_loader.cancel(); | 167 m_loader.cancel(); |
| 168 // didFail will be called immediately. | 168 // didFail will be called immediately. |
| 169 // |this| is deleted here. | 169 // |this| is deleted here. |
| 170 } | 170 } |
| 171 | 171 |
| 172 void NewWebSocketChannelImpl::BlobLoader::didFinishLoading() | 172 void NewWebSocketChannelImpl::BlobLoader::didFinishLoading() |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 304 } | 304 } |
| 305 | 305 |
| 306 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const String& message
) | 306 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const String& message
) |
| 307 { | 307 { |
| 308 LOG(Network, "NewWebSocketChannelImpl %p sendText(%s)", this, message.utf8()
.data()); | 308 LOG(Network, "NewWebSocketChannelImpl %p sendText(%s)", this, message.utf8()
.data()); |
| 309 m_messages.append(Message(message)); | 309 m_messages.append(Message(message)); |
| 310 sendInternal(); | 310 sendInternal(); |
| 311 return SendSuccess; | 311 return SendSuccess; |
| 312 } | 312 } |
| 313 | 313 |
| 314 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const Blob& blob) | 314 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(PassRefPtr<BlobDataHa
ndle> blobDataHandle) |
| 315 { | 315 { |
| 316 LOG(Network, "NewWebSocketChannelImpl %p sendBlob(%s, %s, %llu)", this, blob
.url().string().utf8().data(), blob.type().utf8().data(), blob.size()); | 316 LOG(Network, "NewWebSocketChannelImpl %p sendBlob(%s, %s, %llu)", this, blob
DataHandle->uuid().utf8().data(), blobDataHandle->type().utf8().data(), blobData
Handle->size()); |
| 317 m_messages.append(Message(blob)); | 317 m_messages.append(Message(blobDataHandle)); |
| 318 sendInternal(); | 318 sendInternal(); |
| 319 return SendSuccess; | 319 return SendSuccess; |
| 320 } | 320 } |
| 321 | 321 |
| 322 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const ArrayBuffer& bu
ffer, unsigned byteOffset, unsigned byteLength) | 322 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const ArrayBuffer& bu
ffer, unsigned byteOffset, unsigned byteLength) |
| 323 { | 323 { |
| 324 LOG(Network, "NewWebSocketChannelImpl %p sendArrayBuffer(%p, %u, %u)", this,
buffer.data(), byteOffset, byteLength); | 324 LOG(Network, "NewWebSocketChannelImpl %p sendArrayBuffer(%p, %u, %u)", this,
buffer.data(), byteOffset, byteLength); |
| 325 // buffer.slice copies its contents. | 325 // buffer.slice copies its contents. |
| 326 m_messages.append(buffer.slice(byteOffset, byteOffset + byteLength)); | 326 m_messages.append(buffer.slice(byteOffset, byteOffset + byteLength)); |
| 327 sendInternal(); | 327 sendInternal(); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 isClean(code) ? WebSocketChannelClient::ClosingHandshakeComplete : WebSo
cketChannelClient::ClosingHandshakeIncomplete; | 431 isClean(code) ? WebSocketChannelClient::ClosingHandshakeComplete : WebSo
cketChannelClient::ClosingHandshakeIncomplete; |
| 432 client->didClose(m_bufferedAmount, status, code, reason); | 432 client->didClose(m_bufferedAmount, status, code, reason); |
| 433 // client->didClose may delete this object. | 433 // client->didClose may delete this object. |
| 434 } | 434 } |
| 435 | 435 |
| 436 | 436 |
| 437 NewWebSocketChannelImpl::Message::Message(const String& text) | 437 NewWebSocketChannelImpl::Message::Message(const String& text) |
| 438 : type(MessageTypeText) | 438 : type(MessageTypeText) |
| 439 , text(text.utf8(String::StrictConversionReplacingUnpairedSurrogatesWithFFFD
)) { } | 439 , text(text.utf8(String::StrictConversionReplacingUnpairedSurrogatesWithFFFD
)) { } |
| 440 | 440 |
| 441 NewWebSocketChannelImpl::Message::Message(const Blob& blob) | 441 NewWebSocketChannelImpl::Message::Message(PassRefPtr<BlobDataHandle> blobDataHan
dle) |
| 442 : type(MessageTypeBlob) | 442 : type(MessageTypeBlob) |
| 443 , blob(Blob::create(blob.url(), blob.type(), blob.size())) { } | 443 , blobDataHandle(blobDataHandle) { } |
| 444 | 444 |
| 445 NewWebSocketChannelImpl::Message::Message(PassRefPtr<ArrayBuffer> arrayBuffer) | 445 NewWebSocketChannelImpl::Message::Message(PassRefPtr<ArrayBuffer> arrayBuffer) |
| 446 : type(MessageTypeArrayBuffer) | 446 : type(MessageTypeArrayBuffer) |
| 447 , arrayBuffer(arrayBuffer) { } | 447 , arrayBuffer(arrayBuffer) { } |
| 448 | 448 |
| 449 void NewWebSocketChannelImpl::sendInternal() | 449 void NewWebSocketChannelImpl::sendInternal() |
| 450 { | 450 { |
| 451 ASSERT(m_handle); | 451 ASSERT(m_handle); |
| 452 unsigned long bufferedAmount = m_bufferedAmount; | 452 unsigned long bufferedAmount = m_bufferedAmount; |
| 453 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { | 453 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { |
| 454 bool final = false; | 454 bool final = false; |
| 455 const Message& message = m_messages.first(); | 455 const Message& message = m_messages.first(); |
| 456 switch (message.type) { | 456 switch (message.type) { |
| 457 case MessageTypeText: { | 457 case MessageTypeText: { |
| 458 WebSocketHandle::MessageType type = | 458 WebSocketHandle::MessageType type = |
| 459 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeText; | 459 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeText; |
| 460 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message.
text.length() - m_sentSizeOfTopMessage); | 460 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message.
text.length() - m_sentSizeOfTopMessage); |
| 461 final = (m_sendingQuota == size); | 461 final = (m_sendingQuota == size); |
| 462 m_handle->send(final, type, message.text.data() + m_sentSizeOfTopMes
sage, size); | 462 m_handle->send(final, type, message.text.data() + m_sentSizeOfTopMes
sage, size); |
| 463 m_sentSizeOfTopMessage += size; | 463 m_sentSizeOfTopMessage += size; |
| 464 m_sendingQuota -= size; | 464 m_sendingQuota -= size; |
| 465 break; | 465 break; |
| 466 } | 466 } |
| 467 case MessageTypeBlob: | 467 case MessageTypeBlob: |
| 468 ASSERT(!m_blobLoader); | 468 ASSERT(!m_blobLoader); |
| 469 m_blobLoader = adoptPtr(new BlobLoader(*message.blob, this)); | 469 m_blobLoader = adoptPtr(new BlobLoader(message.blobDataHandle, this)
); |
| 470 break; | 470 break; |
| 471 case MessageTypeArrayBuffer: { | 471 case MessageTypeArrayBuffer: { |
| 472 WebSocketHandle::MessageType type = | 472 WebSocketHandle::MessageType type = |
| 473 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; | 473 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; |
| 474 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message.
arrayBuffer->byteLength() - m_sentSizeOfTopMessage); | 474 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message.
arrayBuffer->byteLength() - m_sentSizeOfTopMessage); |
| 475 final = (m_sendingQuota == size); | 475 final = (m_sendingQuota == size); |
| 476 m_handle->send(final, type, static_cast<const char*>(message.arrayBu
ffer->data()) + m_sentSizeOfTopMessage, size); | 476 m_handle->send(final, type, static_cast<const char*>(message.arrayBu
ffer->data()) + m_sentSizeOfTopMessage, size); |
| 477 m_sentSizeOfTopMessage += size; | 477 m_sentSizeOfTopMessage += size; |
| 478 m_sendingQuota -= size; | 478 m_sendingQuota -= size; |
| 479 break; | 479 break; |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 601 if (errorCode == FileError::ABORT_ERR) { | 601 if (errorCode == FileError::ABORT_ERR) { |
| 602 // The error is caused by cancel(). | 602 // The error is caused by cancel(). |
| 603 return; | 603 return; |
| 604 } | 604 } |
| 605 // FIXME: Generate human-friendly reason message. | 605 // FIXME: Generate human-friendly reason message. |
| 606 failAsError("Failed to load Blob: error code = " + String::number(errorCode)
); | 606 failAsError("Failed to load Blob: error code = " + String::number(errorCode)
); |
| 607 // |this| can be deleted here. | 607 // |this| can be deleted here. |
| 608 } | 608 } |
| 609 | 609 |
| 610 } // namespace WebCore | 610 } // namespace WebCore |
| OLD | NEW |