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 |