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