| 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) |
| 118 , m_sentSizeOfTopMessage(0) | 119 , m_sentSizeOfTopMessage(0) |
| 119 , m_sourceURLAtConstruction(sourceURL) | 120 , m_sourceURLAtConstruction(sourceURL) |
| 120 , m_lineNumberAtConstruction(lineNumber) | 121 , m_lineNumberAtConstruction(lineNumber) |
| 121 { | 122 { |
| 122 if (context->isDocument() && toDocument(context)->page()) | 123 if (context->isDocument() && toDocument(context)->page()) |
| 123 m_identifier = createUniqueIdentifier(); | 124 m_identifier = createUniqueIdentifier(); |
| 124 } | 125 } |
| 125 | 126 |
| 126 NewWebSocketChannelImpl::~NewWebSocketChannelImpl() | 127 NewWebSocketChannelImpl::~NewWebSocketChannelImpl() |
| 127 { | 128 { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 221 if (m_identifier) { | 222 if (m_identifier) { |
| 222 // FIXME: Change the inspector API to show the entire message instead | 223 // FIXME: Change the inspector API to show the entire message instead |
| 223 // of individual frames. | 224 // of individual frames. |
| 224 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeBinary, true, data->data(), data->size()); | 225 InspectorInstrumentation::didSendWebSocketFrame(document(), m_identifier
, WebSocketFrame::OpCodeBinary, true, data->data(), data->size()); |
| 225 } | 226 } |
| 226 m_messages.append(adoptPtr(new Message(data))); | 227 m_messages.append(adoptPtr(new Message(data))); |
| 227 sendInternal(); | 228 sendInternal(); |
| 228 return SendSuccess; | 229 return SendSuccess; |
| 229 } | 230 } |
| 230 | 231 |
| 232 unsigned long NewWebSocketChannelImpl::bufferedAmount() const |
| 233 { |
| 234 WTF_LOG(Network, "NewWebSocketChannelImpl %p bufferedAmount()", this); |
| 235 return m_bufferedAmount; |
| 236 } |
| 237 |
| 231 void NewWebSocketChannelImpl::close(int code, const String& reason) | 238 void NewWebSocketChannelImpl::close(int code, const String& reason) |
| 232 { | 239 { |
| 233 WTF_LOG(Network, "NewWebSocketChannelImpl %p close(%d, %s)", this, code, rea
son.utf8().data()); | 240 WTF_LOG(Network, "NewWebSocketChannelImpl %p close(%d, %s)", this, code, rea
son.utf8().data()); |
| 234 ASSERT(m_handle); | 241 ASSERT(m_handle); |
| 235 unsigned short codeToSend = static_cast<unsigned short>(code == CloseEventCo
deNotSpecified ? CloseEventCodeNoStatusRcvd : code); | 242 unsigned short codeToSend = static_cast<unsigned short>(code == CloseEventCo
deNotSpecified ? CloseEventCodeNoStatusRcvd : code); |
| 236 m_handle->close(codeToSend, reason); | 243 m_handle->close(codeToSend, reason); |
| 237 } | 244 } |
| 238 | 245 |
| 239 void NewWebSocketChannelImpl::fail(const String& reason, MessageLevel level, con
st String& sourceURL, unsigned lineNumber) | 246 void NewWebSocketChannelImpl::fail(const String& reason, MessageLevel level, con
st String& sourceURL, unsigned lineNumber) |
| 240 { | 247 { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 291 : type(MessageTypeArrayBuffer) | 298 : type(MessageTypeArrayBuffer) |
| 292 , arrayBuffer(arrayBuffer) { } | 299 , arrayBuffer(arrayBuffer) { } |
| 293 | 300 |
| 294 NewWebSocketChannelImpl::Message::Message(PassOwnPtr<Vector<char> > vectorData) | 301 NewWebSocketChannelImpl::Message::Message(PassOwnPtr<Vector<char> > vectorData) |
| 295 : type(MessageTypeVector) | 302 : type(MessageTypeVector) |
| 296 , vectorData(vectorData) { } | 303 , vectorData(vectorData) { } |
| 297 | 304 |
| 298 void NewWebSocketChannelImpl::sendInternal() | 305 void NewWebSocketChannelImpl::sendInternal() |
| 299 { | 306 { |
| 300 ASSERT(m_handle); | 307 ASSERT(m_handle); |
| 301 unsigned long consumedBufferedAmount = 0; | 308 unsigned long bufferedAmount = m_bufferedAmount; |
| 302 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { | 309 while (!m_messages.isEmpty() && m_sendingQuota > 0 && !m_blobLoader) { |
| 303 bool final = false; | 310 bool final = false; |
| 304 Message* message = m_messages.first().get(); | 311 Message* message = m_messages.first().get(); |
| 305 switch (message->type) { | 312 switch (message->type) { |
| 306 case MessageTypeText: { | 313 case MessageTypeText: { |
| 307 WebSocketHandle::MessageType type = | 314 WebSocketHandle::MessageType type = |
| 308 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeText; | 315 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeText; |
| 309 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>text.length() - m_sentSizeOfTopMessage); | 316 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>text.length() - m_sentSizeOfTopMessage); |
| 310 final = (m_sentSizeOfTopMessage + size == message->text.length()); | 317 final = (m_sentSizeOfTopMessage + size == message->text.length()); |
| 311 m_handle->send(final, type, message->text.data() + m_sentSizeOfTopMe
ssage, size); | 318 m_handle->send(final, type, message->text.data() + m_sentSizeOfTopMe
ssage, size); |
| 312 m_sentSizeOfTopMessage += size; | 319 m_sentSizeOfTopMessage += size; |
| 313 m_sendingQuota -= size; | 320 m_sendingQuota -= size; |
| 314 consumedBufferedAmount += size; | |
| 315 break; | 321 break; |
| 316 } | 322 } |
| 317 case MessageTypeBlob: | 323 case MessageTypeBlob: |
| 318 ASSERT(!m_blobLoader); | 324 ASSERT(!m_blobLoader); |
| 319 m_blobLoader = adoptPtrWillBeNoop(new BlobLoader(message->blobDataHa
ndle, this)); | 325 m_blobLoader = adoptPtrWillBeNoop(new BlobLoader(message->blobDataHa
ndle, this)); |
| 320 break; | 326 break; |
| 321 case MessageTypeArrayBuffer: { | 327 case MessageTypeArrayBuffer: { |
| 322 WebSocketHandle::MessageType type = | 328 WebSocketHandle::MessageType type = |
| 323 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; | 329 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; |
| 324 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>arrayBuffer->byteLength() - m_sentSizeOfTopMessage); | 330 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>arrayBuffer->byteLength() - m_sentSizeOfTopMessage); |
| 325 final = (m_sentSizeOfTopMessage + size == message->arrayBuffer->byte
Length()); | 331 final = (m_sentSizeOfTopMessage + size == message->arrayBuffer->byte
Length()); |
| 326 m_handle->send(final, type, static_cast<const char*>(message->arrayB
uffer->data()) + m_sentSizeOfTopMessage, size); | 332 m_handle->send(final, type, static_cast<const char*>(message->arrayB
uffer->data()) + m_sentSizeOfTopMessage, size); |
| 327 m_sentSizeOfTopMessage += size; | 333 m_sentSizeOfTopMessage += size; |
| 328 m_sendingQuota -= size; | 334 m_sendingQuota -= size; |
| 329 consumedBufferedAmount += size; | |
| 330 break; | 335 break; |
| 331 } | 336 } |
| 332 case MessageTypeVector: { | 337 case MessageTypeVector: { |
| 333 WebSocketHandle::MessageType type = | 338 WebSocketHandle::MessageType type = |
| 334 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; | 339 m_sentSizeOfTopMessage ? WebSocketHandle::MessageTypeContinuatio
n : WebSocketHandle::MessageTypeBinary; |
| 335 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>vectorData->size() - m_sentSizeOfTopMessage); | 340 size_t size = std::min(static_cast<size_t>(m_sendingQuota), message-
>vectorData->size() - m_sentSizeOfTopMessage); |
| 336 final = (m_sentSizeOfTopMessage + size == message->vectorData->size(
)); | 341 final = (m_sentSizeOfTopMessage + size == message->vectorData->size(
)); |
| 337 m_handle->send(final, type, message->vectorData->data() + m_sentSize
OfTopMessage, size); | 342 m_handle->send(final, type, message->vectorData->data() + m_sentSize
OfTopMessage, size); |
| 338 m_sentSizeOfTopMessage += size; | 343 m_sentSizeOfTopMessage += size; |
| 339 m_sendingQuota -= size; | 344 m_sendingQuota -= size; |
| 340 consumedBufferedAmount += size; | |
| 341 break; | 345 break; |
| 342 } | 346 } |
| 343 } | 347 } |
| 344 if (final) { | 348 if (final) { |
| 345 m_messages.removeFirst(); | 349 m_messages.removeFirst(); |
| 346 m_sentSizeOfTopMessage = 0; | 350 m_sentSizeOfTopMessage = 0; |
| 347 } | 351 } |
| 348 } | 352 } |
| 349 if (m_client && consumedBufferedAmount > 0) | 353 if (m_client && m_bufferedAmount != bufferedAmount) { |
| 350 m_client->didConsumeBufferedAmount(consumedBufferedAmount); | 354 m_client->didUpdateBufferedAmount(m_bufferedAmount); |
| 355 } |
| 351 } | 356 } |
| 352 | 357 |
| 353 void NewWebSocketChannelImpl::flowControlIfNecessary() | 358 void NewWebSocketChannelImpl::flowControlIfNecessary() |
| 354 { | 359 { |
| 355 if (!m_handle || m_receivedDataSizeForFlowControl < receivedDataSizeForFlowC
ontrolHighWaterMark) { | 360 if (!m_handle || m_receivedDataSizeForFlowControl < receivedDataSizeForFlowC
ontrolHighWaterMark) { |
| 356 return; | 361 return; |
| 357 } | 362 } |
| 358 m_handle->flowControl(m_receivedDataSizeForFlowControl); | 363 m_handle->flowControl(m_receivedDataSizeForFlowControl); |
| 359 m_receivedDataSizeForFlowControl = 0; | 364 m_receivedDataSizeForFlowControl = 0; |
| 360 } | 365 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 371 { | 376 { |
| 372 m_handle.clear(); | 377 m_handle.clear(); |
| 373 abortAsyncOperations(); | 378 abortAsyncOperations(); |
| 374 if (!m_client) { | 379 if (!m_client) { |
| 375 return; | 380 return; |
| 376 } | 381 } |
| 377 WebSocketChannelClient* client = m_client; | 382 WebSocketChannelClient* client = m_client; |
| 378 m_client = 0; | 383 m_client = 0; |
| 379 WebSocketChannelClient::ClosingHandshakeCompletionStatus status = | 384 WebSocketChannelClient::ClosingHandshakeCompletionStatus status = |
| 380 wasClean ? WebSocketChannelClient::ClosingHandshakeComplete : WebSocketC
hannelClient::ClosingHandshakeIncomplete; | 385 wasClean ? WebSocketChannelClient::ClosingHandshakeComplete : WebSocketC
hannelClient::ClosingHandshakeIncomplete; |
| 381 client->didClose(status, code, reason); | 386 client->didClose(m_bufferedAmount, status, code, reason); |
| 382 // client->didClose may delete this object. | 387 // client->didClose may delete this object. |
| 383 } | 388 } |
| 384 | 389 |
| 385 Document* NewWebSocketChannelImpl::document() | 390 Document* NewWebSocketChannelImpl::document() |
| 386 { | 391 { |
| 387 ASSERT(m_identifier); | 392 ASSERT(m_identifier); |
| 388 ExecutionContext* context = executionContext(); | 393 ExecutionContext* context = executionContext(); |
| 389 ASSERT(context->isDocument()); | 394 ASSERT(context->isDocument()); |
| 390 return toDocument(context); | 395 return toDocument(context); |
| 391 } | 396 } |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 // |this| can be deleted here. | 548 // |this| can be deleted here. |
| 544 } | 549 } |
| 545 | 550 |
| 546 void NewWebSocketChannelImpl::trace(Visitor* visitor) | 551 void NewWebSocketChannelImpl::trace(Visitor* visitor) |
| 547 { | 552 { |
| 548 visitor->trace(m_blobLoader); | 553 visitor->trace(m_blobLoader); |
| 549 WebSocketChannel::trace(visitor); | 554 WebSocketChannel::trace(visitor); |
| 550 } | 555 } |
| 551 | 556 |
| 552 } // namespace WebCore | 557 } // namespace WebCore |
| OLD | NEW |