| 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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 108 // |this| is deleted here. | 108 // |this| is deleted here. |
| 109 } | 109 } |
| 110 | 110 |
| 111 NewWebSocketChannelImpl::NewWebSocketChannelImpl(ExecutionContext* context, WebS
ocketChannelClient* client, const String& sourceURL, unsigned lineNumber) | 111 NewWebSocketChannelImpl::NewWebSocketChannelImpl(ExecutionContext* context, WebS
ocketChannelClient* client, const String& sourceURL, unsigned lineNumber) |
| 112 : ContextLifecycleObserver(context) | 112 : ContextLifecycleObserver(context) |
| 113 , m_handle(adoptPtr(blink::Platform::current()->createWebSocketHandle())) | 113 , m_handle(adoptPtr(blink::Platform::current()->createWebSocketHandle())) |
| 114 , m_client(client) | 114 , m_client(client) |
| 115 , m_identifier(0) | 115 , m_identifier(0) |
| 116 , m_sendingQuota(0) | 116 , m_sendingQuota(0) |
| 117 , m_receivedDataSizeForFlowControl(receivedDataSizeForFlowControlHighWaterMa
rk * 2) // initial quota | 117 , m_receivedDataSizeForFlowControl(receivedDataSizeForFlowControlHighWaterMa
rk * 2) // initial quota |
| 118 , m_bufferedAmount(0) | |
| 119 , m_sentSizeOfTopMessage(0) | 118 , m_sentSizeOfTopMessage(0) |
| 120 , m_sourceURLAtConstruction(sourceURL) | 119 , m_sourceURLAtConstruction(sourceURL) |
| 121 , m_lineNumberAtConstruction(lineNumber) | 120 , m_lineNumberAtConstruction(lineNumber) |
| 122 { | 121 { |
| 123 if (context->isDocument() && toDocument(context)->page()) | 122 if (context->isDocument() && toDocument(context)->page()) |
| 124 m_identifier = createUniqueIdentifier(); | 123 m_identifier = createUniqueIdentifier(); |
| 125 } | 124 } |
| 126 | 125 |
| 127 NewWebSocketChannelImpl::~NewWebSocketChannelImpl() | 126 NewWebSocketChannelImpl::~NewWebSocketChannelImpl() |
| 128 { | 127 { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 234 if (m_identifier) { | 233 if (m_identifier) { |
| 235 // FIXME: Change the inspector API to show the entire message instead | 234 // FIXME: Change the inspector API to show the entire message instead |
| 236 // of individual frames. | 235 // of individual frames. |
| 237 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeBinary, true, data->data(), data->size()); | 236 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeBinary, true, data->data(), data->size()); |
| 238 } | 237 } |
| 239 m_messages.append(adoptPtr(new Message(data))); | 238 m_messages.append(adoptPtr(new Message(data))); |
| 240 sendInternal(); | 239 sendInternal(); |
| 241 return SendSuccess; | 240 return SendSuccess; |
| 242 } | 241 } |
| 243 | 242 |
| 244 unsigned long NewWebSocketChannelImpl::bufferedAmount() const | |
| 245 { | |
| 246 WTF_LOG(Network, "NewWebSocketChannelImpl %p bufferedAmount()", this); | |
| 247 return m_bufferedAmount; | |
| 248 } | |
| 249 | |
| 250 void NewWebSocketChannelImpl::close(int code, const String& reason) | 243 void NewWebSocketChannelImpl::close(int code, const String& reason) |
| 251 { | 244 { |
| 252 WTF_LOG(Network, "NewWebSocketChannelImpl %p close(%d, %s)", this, code, rea
son.utf8().data()); | 245 WTF_LOG(Network, "NewWebSocketChannelImpl %p close(%d, %s)", this, code, rea
son.utf8().data()); |
| 253 ASSERT(m_handle); | 246 ASSERT(m_handle); |
| 254 unsigned short codeToSend = static_cast<unsigned short>(code == CloseEventCo
deNotSpecified ? CloseEventCodeNoStatusRcvd : code); | 247 unsigned short codeToSend = static_cast<unsigned short>(code == CloseEventCo
deNotSpecified ? CloseEventCodeNoStatusRcvd : code); |
| 255 m_handle->close(codeToSend, reason); | 248 m_handle->close(codeToSend, reason); |
| 256 } | 249 } |
| 257 | 250 |
| 258 void NewWebSocketChannelImpl::fail(const String& reason, MessageLevel level, con
st String& sourceURL, unsigned lineNumber) | 251 void NewWebSocketChannelImpl::fail(const String& reason, MessageLevel level, con
st String& sourceURL, unsigned lineNumber) |
| 259 { | 252 { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 : type(MessageTypeArrayBuffer) | 303 : type(MessageTypeArrayBuffer) |
| 311 , arrayBuffer(arrayBuffer) { } | 304 , arrayBuffer(arrayBuffer) { } |
| 312 | 305 |
| 313 NewWebSocketChannelImpl::Message::Message(PassOwnPtr<Vector<char> > vectorData) | 306 NewWebSocketChannelImpl::Message::Message(PassOwnPtr<Vector<char> > vectorData) |
| 314 : type(MessageTypeVector) | 307 : type(MessageTypeVector) |
| 315 , vectorData(vectorData) { } | 308 , vectorData(vectorData) { } |
| 316 | 309 |
| 317 void NewWebSocketChannelImpl::sendInternal() | 310 void NewWebSocketChannelImpl::sendInternal() |
| 318 { | 311 { |
| 319 ASSERT(m_handle); | 312 ASSERT(m_handle); |
| 320 unsigned long bufferedAmount = m_bufferedAmount; | 313 unsigned long consumedBufferedAmount = 0; |
| 321 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { | 314 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { |
| 322 bool final = false; | 315 bool final = false; |
| 323 Message* message = m_messages.first().get(); | 316 Message* message = m_messages.first().get(); |
| 324 switch (message->type) { | 317 switch (message->type) { |
| 325 case MessageTypeText: { | 318 case MessageTypeText: { |
| 326 WebSocketHandle::MessageType type = | 319 WebSocketHandle::MessageType type = |
| 327 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeText; | 320 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeText; |
| 328 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>text.length() - m_sentSizeOfTopMessage); | 321 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>text.length() - m_sentSizeOfTopMessage); |
| 329 final = (m_sentSizeOfTopMessage + size == message->text.length()); | 322 final = (m_sentSizeOfTopMessage + size == message->text.length()); |
| 330 m_handle->send(final, type, message->text.data() + m_sentSizeOfTopMe
ssage, size); | 323 m_handle->send(final, type, message->text.data() + m_sentSizeOfTopMe
ssage, size); |
| 331 m_sentSizeOfTopMessage += size; | 324 m_sentSizeOfTopMessage += size; |
| 332 m_sendingQuota -= size; | 325 m_sendingQuota -= size; |
| 326 consumedBufferedAmount += size; |
| 333 break; | 327 break; |
| 334 } | 328 } |
| 335 case MessageTypeBlob: | 329 case MessageTypeBlob: |
| 336 ASSERT(!m_blobLoader); | 330 ASSERT(!m_blobLoader); |
| 337 m_blobLoader = adoptPtrWillBeNoop(new BlobLoader(message->blobDataHa
ndle, this)); | 331 m_blobLoader = adoptPtrWillBeNoop(new BlobLoader(message->blobDataHa
ndle, this)); |
| 338 break; | 332 break; |
| 339 case MessageTypeArrayBuffer: { | 333 case MessageTypeArrayBuffer: { |
| 340 WebSocketHandle::MessageType type = | 334 WebSocketHandle::MessageType type = |
| 341 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; | 335 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; |
| 342 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>arrayBuffer->byteLength() - m_sentSizeOfTopMessage); | 336 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>arrayBuffer->byteLength() - m_sentSizeOfTopMessage); |
| 343 final = (m_sentSizeOfTopMessage + size == message->arrayBuffer->byte
Length()); | 337 final = (m_sentSizeOfTopMessage + size == message->arrayBuffer->byte
Length()); |
| 344 m_handle->send(final, type, static_cast<const char*>(message->arrayB
uffer->data()) + m_sentSizeOfTopMessage, size); | 338 m_handle->send(final, type, static_cast<const char*>(message->arrayB
uffer->data()) + m_sentSizeOfTopMessage, size); |
| 345 m_sentSizeOfTopMessage += size; | 339 m_sentSizeOfTopMessage += size; |
| 346 m_sendingQuota -= size; | 340 m_sendingQuota -= size; |
| 341 consumedBufferedAmount += size; |
| 347 break; | 342 break; |
| 348 } | 343 } |
| 349 case MessageTypeVector: { | 344 case MessageTypeVector: { |
| 350 WebSocketHandle::MessageType type = | 345 WebSocketHandle::MessageType type = |
| 351 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; | 346 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; |
| 352 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>vectorData->size() - m_sentSizeOfTopMessage); | 347 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>vectorData->size() - m_sentSizeOfTopMessage); |
| 353 final = (m_sentSizeOfTopMessage + size == message->vectorData->size(
)); | 348 final = (m_sentSizeOfTopMessage + size == message->vectorData->size(
)); |
| 354 m_handle->send(final, type, message->vectorData->data() + m_sentSize
OfTopMessage, size); | 349 m_handle->send(final, type, message->vectorData->data() + m_sentSize
OfTopMessage, size); |
| 355 m_sentSizeOfTopMessage += size; | 350 m_sentSizeOfTopMessage += size; |
| 356 m_sendingQuota -= size; | 351 m_sendingQuota -= size; |
| 352 consumedBufferedAmount += size; |
| 357 break; | 353 break; |
| 358 } | 354 } |
| 359 } | 355 } |
| 360 if (final) { | 356 if (final) { |
| 361 m_messages.removeFirst(); | 357 m_messages.removeFirst(); |
| 362 m_sentSizeOfTopMessage = 0; | 358 m_sentSizeOfTopMessage = 0; |
| 363 } | 359 } |
| 364 } | 360 } |
| 365 if (m_client && m_bufferedAmount != bufferedAmount) { | 361 if (m_client && consumedBufferedAmount > 0) |
| 366 m_client->didUpdateBufferedAmount(m_bufferedAmount); | 362 m_client->didConsumeBufferedAmount(consumedBufferedAmount); |
| 367 } | |
| 368 } | 363 } |
| 369 | 364 |
| 370 void NewWebSocketChannelImpl::flowControlIfNecessary() | 365 void NewWebSocketChannelImpl::flowControlIfNecessary() |
| 371 { | 366 { |
| 372 if (!m_handle || m_receivedDataSizeForFlowControl < receivedDataSizeForFlowC
ontrolHighWaterMark) { | 367 if (!m_handle || m_receivedDataSizeForFlowControl < receivedDataSizeForFlowC
ontrolHighWaterMark) { |
| 373 return; | 368 return; |
| 374 } | 369 } |
| 375 m_handle->flowControl(m_receivedDataSizeForFlowControl); | 370 m_handle->flowControl(m_receivedDataSizeForFlowControl); |
| 376 m_receivedDataSizeForFlowControl = 0; | 371 m_receivedDataSizeForFlowControl = 0; |
| 377 } | 372 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 388 { | 383 { |
| 389 m_handle.clear(); | 384 m_handle.clear(); |
| 390 abortAsyncOperations(); | 385 abortAsyncOperations(); |
| 391 if (!m_client) { | 386 if (!m_client) { |
| 392 return; | 387 return; |
| 393 } | 388 } |
| 394 WebSocketChannelClient* client = m_client; | 389 WebSocketChannelClient* client = m_client; |
| 395 m_client = 0; | 390 m_client = 0; |
| 396 WebSocketChannelClient::ClosingHandshakeCompletionStatus status = | 391 WebSocketChannelClient::ClosingHandshakeCompletionStatus status = |
| 397 wasClean ? WebSocketChannelClient::ClosingHandshakeComplete : WebSocketC
hannelClient::ClosingHandshakeIncomplete; | 392 wasClean ? WebSocketChannelClient::ClosingHandshakeComplete : WebSocketC
hannelClient::ClosingHandshakeIncomplete; |
| 398 client->didClose(m_bufferedAmount, status, code, reason); | 393 client->didClose(status, code, reason); |
| 399 // client->didClose may delete this object. | 394 // client->didClose may delete this object. |
| 400 } | 395 } |
| 401 | 396 |
| 402 Document* NewWebSocketChannelImpl::document() | 397 Document* NewWebSocketChannelImpl::document() |
| 403 { | 398 { |
| 404 ASSERT(m_identifier); | 399 ASSERT(m_identifier); |
| 405 ExecutionContext* context = executionContext(); | 400 ExecutionContext* context = executionContext(); |
| 406 ASSERT(context->isDocument()); | 401 ASSERT(context->isDocument()); |
| 407 return toDocument(context); | 402 return toDocument(context); |
| 408 } | 403 } |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 562 // |this| can be deleted here. | 557 // |this| can be deleted here. |
| 563 } | 558 } |
| 564 | 559 |
| 565 void NewWebSocketChannelImpl::trace(Visitor* visitor) | 560 void NewWebSocketChannelImpl::trace(Visitor* visitor) |
| 566 { | 561 { |
| 567 visitor->trace(m_blobLoader); | 562 visitor->trace(m_blobLoader); |
| 568 WebSocketChannel::trace(visitor); | 563 WebSocketChannel::trace(visitor); |
| 569 } | 564 } |
| 570 | 565 |
| 571 } // namespace WebCore | 566 } // namespace WebCore |
| OLD | NEW |