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 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 | 184 |
185 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const String& message
) | 185 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const String& message
) |
186 { | 186 { |
187 WTF_LOG(Network, "NewWebSocketChannelImpl %p sendText(%s)", this, message.ut
f8().data()); | 187 WTF_LOG(Network, "NewWebSocketChannelImpl %p sendText(%s)", this, message.ut
f8().data()); |
188 if (m_identifier) { | 188 if (m_identifier) { |
189 // FIXME: Change the inspector API to show the entire message instead | 189 // FIXME: Change the inspector API to show the entire message instead |
190 // of individual frames. | 190 // of individual frames. |
191 CString data = message.utf8(); | 191 CString data = message.utf8(); |
192 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeText, true, data.data(), data.length()); | 192 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeText, true, data.data(), data.length()); |
193 } | 193 } |
| 194 if (m_client) |
| 195 m_client->didIncreaseBufferedAmount(message.utf8().length()); |
194 m_messages.append(adoptPtr(new Message(message))); | 196 m_messages.append(adoptPtr(new Message(message))); |
195 sendInternal(); | 197 sendInternal(); |
196 return SendSuccess; | 198 return SendSuccess; |
197 } | 199 } |
198 | 200 |
199 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(PassRefPtr<BlobDataHa
ndle> blobDataHandle) | 201 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(PassRefPtr<BlobDataHa
ndle> blobDataHandle) |
200 { | 202 { |
201 WTF_LOG(Network, "NewWebSocketChannelImpl %p sendBlob(%s, %s, %llu)", this,
blobDataHandle->uuid().utf8().data(), blobDataHandle->type().utf8().data(), blob
DataHandle->size()); | 203 WTF_LOG(Network, "NewWebSocketChannelImpl %p sendBlob(%s, %s, %llu)", this,
blobDataHandle->uuid().utf8().data(), blobDataHandle->type().utf8().data(), blob
DataHandle->size()); |
202 if (m_identifier) { | 204 if (m_identifier) { |
203 // FIXME: Change the inspector API to show the entire message instead | 205 // FIXME: Change the inspector API to show the entire message instead |
204 // of individual frames. | 206 // of individual frames. |
205 // FIXME: We can't access the data here. | 207 // FIXME: We can't access the data here. |
206 // Since Binary data are not displayed in Inspector, this does not | 208 // Since Binary data are not displayed in Inspector, this does not |
207 // affect actual behavior. | 209 // affect actual behavior. |
208 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeBinary, true, "", 0); | 210 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeBinary, true, "", 0); |
209 } | 211 } |
| 212 if (m_client) |
| 213 m_client->didIncreaseBufferedAmount(blobDataHandle->size()); |
210 m_messages.append(adoptPtr(new Message(blobDataHandle))); | 214 m_messages.append(adoptPtr(new Message(blobDataHandle))); |
211 sendInternal(); | 215 sendInternal(); |
212 return SendSuccess; | 216 return SendSuccess; |
213 } | 217 } |
214 | 218 |
215 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const ArrayBuffer& bu
ffer, unsigned byteOffset, unsigned byteLength) | 219 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(const ArrayBuffer& bu
ffer, unsigned byteOffset, unsigned byteLength) |
216 { | 220 { |
217 WTF_LOG(Network, "NewWebSocketChannelImpl %p sendArrayBuffer(%p, %u, %u)", t
his, buffer.data(), byteOffset, byteLength); | 221 WTF_LOG(Network, "NewWebSocketChannelImpl %p sendArrayBuffer(%p, %u, %u)", t
his, buffer.data(), byteOffset, byteLength); |
218 if (m_identifier) { | 222 if (m_identifier) { |
219 // FIXME: Change the inspector API to show the entire message instead | 223 // FIXME: Change the inspector API to show the entire message instead |
220 // of individual frames. | 224 // of individual frames. |
221 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeBinary, true, static_cast<const char*>(buffer.data()) +
byteOffset, byteLength); | 225 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeBinary, true, static_cast<const char*>(buffer.data()) +
byteOffset, byteLength); |
222 } | 226 } |
| 227 if (m_client) |
| 228 m_client->didIncreaseBufferedAmount(byteLength); |
223 // buffer.slice copies its contents. | 229 // buffer.slice copies its contents. |
224 // FIXME: Reduce copy by sending the data immediately when we don't need to | 230 // FIXME: Reduce copy by sending the data immediately when we don't need to |
225 // queue the data. | 231 // queue the data. |
226 m_messages.append(adoptPtr(new Message(buffer.slice(byteOffset, byteOffset +
byteLength)))); | 232 m_messages.append(adoptPtr(new Message(buffer.slice(byteOffset, byteOffset +
byteLength)))); |
227 sendInternal(); | 233 sendInternal(); |
228 return SendSuccess; | 234 return SendSuccess; |
229 } | 235 } |
230 | 236 |
231 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(PassOwnPtr<Vector<cha
r> > data) | 237 WebSocketChannel::SendResult NewWebSocketChannelImpl::send(PassOwnPtr<Vector<cha
r> > data) |
232 { | 238 { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
310 : type(MessageTypeArrayBuffer) | 316 : type(MessageTypeArrayBuffer) |
311 , arrayBuffer(arrayBuffer) { } | 317 , arrayBuffer(arrayBuffer) { } |
312 | 318 |
313 NewWebSocketChannelImpl::Message::Message(PassOwnPtr<Vector<char> > vectorData) | 319 NewWebSocketChannelImpl::Message::Message(PassOwnPtr<Vector<char> > vectorData) |
314 : type(MessageTypeVector) | 320 : type(MessageTypeVector) |
315 , vectorData(vectorData) { } | 321 , vectorData(vectorData) { } |
316 | 322 |
317 void NewWebSocketChannelImpl::sendInternal() | 323 void NewWebSocketChannelImpl::sendInternal() |
318 { | 324 { |
319 ASSERT(m_handle); | 325 ASSERT(m_handle); |
320 unsigned long bufferedAmount = m_bufferedAmount; | 326 int64_t quota = m_sendingQuota; |
321 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { | 327 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { |
322 bool final = false; | 328 bool final = false; |
323 Message* message = m_messages.first().get(); | 329 Message* message = m_messages.first().get(); |
324 switch (message->type) { | 330 switch (message->type) { |
325 case MessageTypeText: { | 331 case MessageTypeText: { |
326 WebSocketHandle::MessageType type = | 332 WebSocketHandle::MessageType type = |
327 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeText; | 333 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeText; |
328 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>text.length() - m_sentSizeOfTopMessage); | 334 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>text.length() - m_sentSizeOfTopMessage); |
329 final = (m_sentSizeOfTopMessage + size == message->text.length()); | 335 final = (m_sentSizeOfTopMessage + size == message->text.length()); |
330 m_handle->send(final, type, message->text.data() + m_sentSizeOfTopMe
ssage, size); | 336 m_handle->send(final, type, message->text.data() + m_sentSizeOfTopMe
ssage, size); |
(...skipping 24 matching lines...) Expand all Loading... |
355 m_sentSizeOfTopMessage += size; | 361 m_sentSizeOfTopMessage += size; |
356 m_sendingQuota -= size; | 362 m_sendingQuota -= size; |
357 break; | 363 break; |
358 } | 364 } |
359 } | 365 } |
360 if (final) { | 366 if (final) { |
361 m_messages.removeFirst(); | 367 m_messages.removeFirst(); |
362 m_sentSizeOfTopMessage = 0; | 368 m_sentSizeOfTopMessage = 0; |
363 } | 369 } |
364 } | 370 } |
365 if (m_client && m_bufferedAmount != bufferedAmount) { | 371 if (m_client && quota != m_sendingQuota) { |
366 m_client->didUpdateBufferedAmount(m_bufferedAmount); | 372 unsigned long diff = quota - m_sendingQuota; |
| 373 m_client->didDecreaseBufferedAmount(diff); |
367 } | 374 } |
368 } | 375 } |
369 | 376 |
370 void NewWebSocketChannelImpl::flowControlIfNecessary() | 377 void NewWebSocketChannelImpl::flowControlIfNecessary() |
371 { | 378 { |
372 if (!m_handle || m_receivedDataSizeForFlowControl < receivedDataSizeForFlowC
ontrolHighWaterMark) { | 379 if (!m_handle || m_receivedDataSizeForFlowControl < receivedDataSizeForFlowC
ontrolHighWaterMark) { |
373 return; | 380 return; |
374 } | 381 } |
375 m_handle->flowControl(m_receivedDataSizeForFlowControl); | 382 m_handle->flowControl(m_receivedDataSizeForFlowControl); |
376 m_receivedDataSizeForFlowControl = 0; | 383 m_receivedDataSizeForFlowControl = 0; |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 // |this| can be deleted here. | 569 // |this| can be deleted here. |
563 } | 570 } |
564 | 571 |
565 void NewWebSocketChannelImpl::trace(Visitor* visitor) | 572 void NewWebSocketChannelImpl::trace(Visitor* visitor) |
566 { | 573 { |
567 visitor->trace(m_blobLoader); | 574 visitor->trace(m_blobLoader); |
568 WebSocketChannel::trace(visitor); | 575 WebSocketChannel::trace(visitor); |
569 } | 576 } |
570 | 577 |
571 } // namespace WebCore | 578 } // namespace WebCore |
OLD | NEW |