| 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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 DEFINE_INLINE_TRACE() | 76 DEFINE_INLINE_TRACE() |
| 77 { | 77 { |
| 78 visitor->trace(m_channel); | 78 visitor->trace(m_channel); |
| 79 } | 79 } |
| 80 | 80 |
| 81 private: | 81 private: |
| 82 Member<DocumentWebSocketChannel> m_channel; | 82 Member<DocumentWebSocketChannel> m_channel; |
| 83 FileReaderLoader m_loader; | 83 FileReaderLoader m_loader; |
| 84 }; | 84 }; |
| 85 | 85 |
| 86 class DocumentWebSocketChannel::Message : public GarbageCollectedFinalized<Docum
entWebSocketChannel::Message> { | |
| 87 public: | |
| 88 explicit Message(const CString&); | |
| 89 explicit Message(PassRefPtr<BlobDataHandle>); | |
| 90 explicit Message(DOMArrayBuffer*); | |
| 91 // For WorkerWebSocketChannel | |
| 92 explicit Message(PassOwnPtr<Vector<char>>, MessageType); | |
| 93 // Close message | |
| 94 Message(unsigned short code, const String& reason); | |
| 95 | |
| 96 DEFINE_INLINE_TRACE() | |
| 97 { | |
| 98 visitor->trace(arrayBuffer); | |
| 99 } | |
| 100 | |
| 101 MessageType type; | |
| 102 | |
| 103 CString text; | |
| 104 RefPtr<BlobDataHandle> blobDataHandle; | |
| 105 Member<DOMArrayBuffer> arrayBuffer; | |
| 106 OwnPtr<Vector<char>> vectorData; | |
| 107 unsigned short code; | |
| 108 String reason; | |
| 109 }; | |
| 110 | |
| 111 DocumentWebSocketChannel::BlobLoader::BlobLoader(PassRefPtr<BlobDataHandle> blob
DataHandle, DocumentWebSocketChannel* channel) | 86 DocumentWebSocketChannel::BlobLoader::BlobLoader(PassRefPtr<BlobDataHandle> blob
DataHandle, DocumentWebSocketChannel* channel) |
| 112 : m_channel(channel) | 87 : m_channel(channel) |
| 113 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) | 88 , m_loader(FileReaderLoader::ReadAsArrayBuffer, this) |
| 114 { | 89 { |
| 115 m_loader.start(channel->getExecutionContext(), blobDataHandle); | 90 m_loader.start(channel->getExecutionContext(), blobDataHandle); |
| 116 } | 91 } |
| 117 | 92 |
| 118 void DocumentWebSocketChannel::BlobLoader::cancel() | 93 void DocumentWebSocketChannel::BlobLoader::cancel() |
| 119 { | 94 { |
| 120 m_loader.cancel(); | 95 m_loader.cancel(); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 190 InspectorInstrumentation::didCreateWebSocket(document(), m_identifier, url,
protocol); | 165 InspectorInstrumentation::didCreateWebSocket(document(), m_identifier, url,
protocol); |
| 191 return true; | 166 return true; |
| 192 } | 167 } |
| 193 | 168 |
| 194 void DocumentWebSocketChannel::send(const CString& message) | 169 void DocumentWebSocketChannel::send(const CString& message) |
| 195 { | 170 { |
| 196 WTF_LOG(Network, "DocumentWebSocketChannel %p sendText(%s)", this, message.d
ata()); | 171 WTF_LOG(Network, "DocumentWebSocketChannel %p sendText(%s)", this, message.d
ata()); |
| 197 // FIXME: Change the inspector API to show the entire message instead | 172 // FIXME: Change the inspector API to show the entire message instead |
| 198 // of individual frames. | 173 // of individual frames. |
| 199 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeText, true, message.data(), message.length()); | 174 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeText, true, message.data(), message.length()); |
| 200 m_messages.append(new Message(message)); | 175 m_messages.append(adoptPtr(new Message(message))); |
| 201 processSendQueue(); | 176 processSendQueue(); |
| 202 } | 177 } |
| 203 | 178 |
| 204 void DocumentWebSocketChannel::send(PassRefPtr<BlobDataHandle> blobDataHandle) | 179 void DocumentWebSocketChannel::send(PassRefPtr<BlobDataHandle> blobDataHandle) |
| 205 { | 180 { |
| 206 WTF_LOG(Network, "DocumentWebSocketChannel %p sendBlob(%s, %s, %llu)", this,
blobDataHandle->uuid().utf8().data(), blobDataHandle->type().utf8().data(), blo
bDataHandle->size()); | 181 WTF_LOG(Network, "DocumentWebSocketChannel %p sendBlob(%s, %s, %llu)", this,
blobDataHandle->uuid().utf8().data(), blobDataHandle->type().utf8().data(), blo
bDataHandle->size()); |
| 207 // FIXME: Change the inspector API to show the entire message instead | 182 // FIXME: Change the inspector API to show the entire message instead |
| 208 // of individual frames. | 183 // of individual frames. |
| 209 // FIXME: We can't access the data here. | 184 // FIXME: We can't access the data here. |
| 210 // Since Binary data are not displayed in Inspector, this does not | 185 // Since Binary data are not displayed in Inspector, this does not |
| 211 // affect actual behavior. | 186 // affect actual behavior. |
| 212 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeBinary, true, "", 0); | 187 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeBinary, true, "", 0); |
| 213 m_messages.append(new Message(blobDataHandle)); | 188 m_messages.append(adoptPtr(new Message(blobDataHandle))); |
| 214 processSendQueue(); | 189 processSendQueue(); |
| 215 } | 190 } |
| 216 | 191 |
| 217 void DocumentWebSocketChannel::send(const DOMArrayBuffer& buffer, unsigned byteO
ffset, unsigned byteLength) | 192 void DocumentWebSocketChannel::send(const DOMArrayBuffer& buffer, unsigned byteO
ffset, unsigned byteLength) |
| 218 { | 193 { |
| 219 WTF_LOG(Network, "DocumentWebSocketChannel %p sendArrayBuffer(%p, %u, %u)",
this, buffer.data(), byteOffset, byteLength); | 194 WTF_LOG(Network, "DocumentWebSocketChannel %p sendArrayBuffer(%p, %u, %u)",
this, buffer.data(), byteOffset, byteLength); |
| 220 // FIXME: Change the inspector API to show the entire message instead | 195 // FIXME: Change the inspector API to show the entire message instead |
| 221 // of individual frames. | 196 // of individual frames. |
| 222 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeBinary, true, static_cast<const char*>(buffer.data()) + byte
Offset, byteLength); | 197 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeBinary, true, static_cast<const char*>(buffer.data()) + byte
Offset, byteLength); |
| 223 // buffer.slice copies its contents. | 198 // buffer.slice copies its contents. |
| 224 // FIXME: Reduce copy by sending the data immediately when we don't need to | 199 // FIXME: Reduce copy by sending the data immediately when we don't need to |
| 225 // queue the data. | 200 // queue the data. |
| 226 m_messages.append(new Message(buffer.slice(byteOffset, byteOffset + byteLeng
th))); | 201 m_messages.append(adoptPtr(new Message(buffer.slice(byteOffset, byteOffset +
byteLength)))); |
| 227 processSendQueue(); | 202 processSendQueue(); |
| 228 } | 203 } |
| 229 | 204 |
| 230 void DocumentWebSocketChannel::sendTextAsCharVector(PassOwnPtr<Vector<char>> dat
a) | 205 void DocumentWebSocketChannel::sendTextAsCharVector(PassOwnPtr<Vector<char>> dat
a) |
| 231 { | 206 { |
| 232 WTF_LOG(Network, "DocumentWebSocketChannel %p sendTextAsCharVector(%p, %llu)
", this, data.get(), static_cast<unsigned long long>(data->size())); | 207 WTF_LOG(Network, "DocumentWebSocketChannel %p sendTextAsCharVector(%p, %llu)
", this, data.get(), static_cast<unsigned long long>(data->size())); |
| 233 // FIXME: Change the inspector API to show the entire message instead | 208 // FIXME: Change the inspector API to show the entire message instead |
| 234 // of individual frames. | 209 // of individual frames. |
| 235 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeText, true, data->data(), data->size()); | 210 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeText, true, data->data(), data->size()); |
| 236 m_messages.append(new Message(data, MessageTypeTextAsCharVector)); | 211 m_messages.append(adoptPtr(new Message(data, MessageTypeTextAsCharVector))); |
| 237 processSendQueue(); | 212 processSendQueue(); |
| 238 } | 213 } |
| 239 | 214 |
| 240 void DocumentWebSocketChannel::sendBinaryAsCharVector(PassOwnPtr<Vector<char>> d
ata) | 215 void DocumentWebSocketChannel::sendBinaryAsCharVector(PassOwnPtr<Vector<char>> d
ata) |
| 241 { | 216 { |
| 242 WTF_LOG(Network, "DocumentWebSocketChannel %p sendBinaryAsCharVector(%p, %ll
u)", this, data.get(), static_cast<unsigned long long>(data->size())); | 217 WTF_LOG(Network, "DocumentWebSocketChannel %p sendBinaryAsCharVector(%p, %ll
u)", this, data.get(), static_cast<unsigned long long>(data->size())); |
| 243 // FIXME: Change the inspector API to show the entire message instead | 218 // FIXME: Change the inspector API to show the entire message instead |
| 244 // of individual frames. | 219 // of individual frames. |
| 245 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeBinary, true, data->data(), data->size()); | 220 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier, We
bSocketFrame::OpCodeBinary, true, data->data(), data->size()); |
| 246 m_messages.append(new Message(data, MessageTypeBinaryAsCharVector)); | 221 m_messages.append(adoptPtr(new Message(data, MessageTypeBinaryAsCharVector))
); |
| 247 processSendQueue(); | 222 processSendQueue(); |
| 248 } | 223 } |
| 249 | 224 |
| 250 void DocumentWebSocketChannel::close(int code, const String& reason) | 225 void DocumentWebSocketChannel::close(int code, const String& reason) |
| 251 { | 226 { |
| 252 WTF_LOG(Network, "DocumentWebSocketChannel %p close(%d, %s)", this, code, re
ason.utf8().data()); | 227 WTF_LOG(Network, "DocumentWebSocketChannel %p close(%d, %s)", this, code, re
ason.utf8().data()); |
| 253 ASSERT(m_handle); | 228 ASSERT(m_handle); |
| 254 unsigned short codeToSend = static_cast<unsigned short>(code == CloseEventCo
deNotSpecified ? CloseEventCodeNoStatusRcvd : code); | 229 unsigned short codeToSend = static_cast<unsigned short>(code == CloseEventCo
deNotSpecified ? CloseEventCodeNoStatusRcvd : code); |
| 255 m_messages.append(new Message(codeToSend, reason)); | 230 m_messages.append(adoptPtr(new Message(codeToSend, reason))); |
| 256 processSendQueue(); | 231 processSendQueue(); |
| 257 } | 232 } |
| 258 | 233 |
| 259 void DocumentWebSocketChannel::fail(const String& reason, MessageLevel level, co
nst String& sourceURL, unsigned lineNumber) | 234 void DocumentWebSocketChannel::fail(const String& reason, MessageLevel level, co
nst String& sourceURL, unsigned lineNumber) |
| 260 { | 235 { |
| 261 WTF_LOG(Network, "DocumentWebSocketChannel %p fail(%s)", this, reason.utf8()
.data()); | 236 WTF_LOG(Network, "DocumentWebSocketChannel %p fail(%s)", this, reason.utf8()
.data()); |
| 262 // m_handle and m_client can be null here. | 237 // m_handle and m_client can be null here. |
| 263 | 238 |
| 264 InspectorInstrumentation::didReceiveWebSocketFrameError(document(), m_identi
fier, reason); | 239 InspectorInstrumentation::didReceiveWebSocketFrameError(document(), m_identi
fier, reason); |
| 265 const String message = "WebSocket connection to '" + m_url.elidedString() +
"' failed: " + reason; | 240 const String message = "WebSocket connection to '" + m_url.elidedString() +
"' failed: " + reason; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 287 } | 262 } |
| 288 | 263 |
| 289 DocumentWebSocketChannel::Message::Message(const CString& text) | 264 DocumentWebSocketChannel::Message::Message(const CString& text) |
| 290 : type(MessageTypeText) | 265 : type(MessageTypeText) |
| 291 , text(text) { } | 266 , text(text) { } |
| 292 | 267 |
| 293 DocumentWebSocketChannel::Message::Message(PassRefPtr<BlobDataHandle> blobDataHa
ndle) | 268 DocumentWebSocketChannel::Message::Message(PassRefPtr<BlobDataHandle> blobDataHa
ndle) |
| 294 : type(MessageTypeBlob) | 269 : type(MessageTypeBlob) |
| 295 , blobDataHandle(blobDataHandle) { } | 270 , blobDataHandle(blobDataHandle) { } |
| 296 | 271 |
| 297 DocumentWebSocketChannel::Message::Message(DOMArrayBuffer* arrayBuffer) | 272 DocumentWebSocketChannel::Message::Message(PassRefPtr<DOMArrayBuffer> arrayBuffe
r) |
| 298 : type(MessageTypeArrayBuffer) | 273 : type(MessageTypeArrayBuffer) |
| 299 , arrayBuffer(arrayBuffer) { } | 274 , arrayBuffer(arrayBuffer) { } |
| 300 | 275 |
| 301 DocumentWebSocketChannel::Message::Message(PassOwnPtr<Vector<char>> vectorData,
MessageType type) | 276 DocumentWebSocketChannel::Message::Message(PassOwnPtr<Vector<char>> vectorData,
MessageType type) |
| 302 : type(type) | 277 : type(type) |
| 303 , vectorData(vectorData) | 278 , vectorData(vectorData) |
| 304 { | 279 { |
| 305 ASSERT(type == MessageTypeTextAsCharVector || type == MessageTypeBinaryAsCha
rVector); | 280 ASSERT(type == MessageTypeTextAsCharVector || type == MessageTypeBinaryAsCha
rVector); |
| 306 } | 281 } |
| 307 | 282 |
| (...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 { | 522 { |
| 548 WTF_LOG(Network, "DocumentWebSocketChannel %p didStartClosingHandshake(%p)",
this, handle); | 523 WTF_LOG(Network, "DocumentWebSocketChannel %p didStartClosingHandshake(%p)",
this, handle); |
| 549 | 524 |
| 550 ASSERT(m_handle); | 525 ASSERT(m_handle); |
| 551 ASSERT(handle == m_handle); | 526 ASSERT(handle == m_handle); |
| 552 | 527 |
| 553 if (m_client) | 528 if (m_client) |
| 554 m_client->didStartClosingHandshake(); | 529 m_client->didStartClosingHandshake(); |
| 555 } | 530 } |
| 556 | 531 |
| 557 void DocumentWebSocketChannel::didFinishLoadingBlob(DOMArrayBuffer* buffer) | 532 void DocumentWebSocketChannel::didFinishLoadingBlob(PassRefPtr<DOMArrayBuffer> b
uffer) |
| 558 { | 533 { |
| 559 m_blobLoader.clear(); | 534 m_blobLoader.clear(); |
| 560 ASSERT(m_handle); | 535 ASSERT(m_handle); |
| 561 // The loaded blob is always placed on m_messages[0]. | 536 // The loaded blob is always placed on m_messages[0]. |
| 562 ASSERT(m_messages.size() > 0 && m_messages.first()->type == MessageTypeBlob)
; | 537 ASSERT(m_messages.size() > 0 && m_messages.first()->type == MessageTypeBlob)
; |
| 563 // We replace it with the loaded blob. | 538 // We replace it with the loaded blob. |
| 564 m_messages.first() = new Message(buffer); | 539 m_messages.first() = adoptPtr(new Message(buffer)); |
| 565 processSendQueue(); | 540 processSendQueue(); |
| 566 } | 541 } |
| 567 | 542 |
| 568 void DocumentWebSocketChannel::didFailLoadingBlob(FileError::ErrorCode errorCode
) | 543 void DocumentWebSocketChannel::didFailLoadingBlob(FileError::ErrorCode errorCode
) |
| 569 { | 544 { |
| 570 m_blobLoader.clear(); | 545 m_blobLoader.clear(); |
| 571 if (errorCode == FileError::ABORT_ERR) { | 546 if (errorCode == FileError::ABORT_ERR) { |
| 572 // The error is caused by cancel(). | 547 // The error is caused by cancel(). |
| 573 return; | 548 return; |
| 574 } | 549 } |
| 575 // FIXME: Generate human-friendly reason message. | 550 // FIXME: Generate human-friendly reason message. |
| 576 failAsError("Failed to load Blob: error code = " + String::number(errorCode)
); | 551 failAsError("Failed to load Blob: error code = " + String::number(errorCode)
); |
| 577 // |this| can be deleted here. | 552 // |this| can be deleted here. |
| 578 } | 553 } |
| 579 | 554 |
| 580 DEFINE_TRACE(DocumentWebSocketChannel) | 555 DEFINE_TRACE(DocumentWebSocketChannel) |
| 581 { | 556 { |
| 582 visitor->trace(m_blobLoader); | 557 visitor->trace(m_blobLoader); |
| 583 visitor->trace(m_messages); | |
| 584 visitor->trace(m_client); | 558 visitor->trace(m_client); |
| 585 WebSocketChannel::trace(visitor); | 559 WebSocketChannel::trace(visitor); |
| 586 ContextLifecycleObserver::trace(visitor); | 560 ContextLifecycleObserver::trace(visitor); |
| 587 } | 561 } |
| 588 | 562 |
| 589 } // namespace blink | 563 } // namespace blink |
| OLD | NEW |