Chromium Code Reviews| 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 int64_t quota = m_sendingQuota; |
|
tyoshino (SeeGerritForStatus)
2014/06/16 02:29:29
quota and bufferedAmount are different concept. as
yhirano
2014/06/16 04:44:27
Done.
| |
| 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); |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 355 m_sentSizeOfTopMessage += size; | 348 m_sentSizeOfTopMessage += size; |
| 356 m_sendingQuota -= size; | 349 m_sendingQuota -= size; |
| 357 break; | 350 break; |
| 358 } | 351 } |
| 359 } | 352 } |
| 360 if (final) { | 353 if (final) { |
| 361 m_messages.removeFirst(); | 354 m_messages.removeFirst(); |
| 362 m_sentSizeOfTopMessage = 0; | 355 m_sentSizeOfTopMessage = 0; |
| 363 } | 356 } |
| 364 } | 357 } |
| 365 if (m_client && m_bufferedAmount != bufferedAmount) { | 358 if (m_client && quota != m_sendingQuota) { |
| 366 m_client->didUpdateBufferedAmount(m_bufferedAmount); | 359 unsigned long diff = quota - m_sendingQuota; |
| 360 m_client->didConsumeBufferedAmount(diff); | |
| 367 } | 361 } |
| 368 } | 362 } |
| 369 | 363 |
| 370 void NewWebSocketChannelImpl::flowControlIfNecessary() | 364 void NewWebSocketChannelImpl::flowControlIfNecessary() |
| 371 { | 365 { |
| 372 if (!m_handle || m_receivedDataSizeForFlowControl < receivedDataSizeForFlowC ontrolHighWaterMark) { | 366 if (!m_handle || m_receivedDataSizeForFlowControl < receivedDataSizeForFlowC ontrolHighWaterMark) { |
| 373 return; | 367 return; |
| 374 } | 368 } |
| 375 m_handle->flowControl(m_receivedDataSizeForFlowControl); | 369 m_handle->flowControl(m_receivedDataSizeForFlowControl); |
| 376 m_receivedDataSizeForFlowControl = 0; | 370 m_receivedDataSizeForFlowControl = 0; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 388 { | 382 { |
| 389 m_handle.clear(); | 383 m_handle.clear(); |
| 390 abortAsyncOperations(); | 384 abortAsyncOperations(); |
| 391 if (!m_client) { | 385 if (!m_client) { |
| 392 return; | 386 return; |
| 393 } | 387 } |
| 394 WebSocketChannelClient* client = m_client; | 388 WebSocketChannelClient* client = m_client; |
| 395 m_client = 0; | 389 m_client = 0; |
| 396 WebSocketChannelClient::ClosingHandshakeCompletionStatus status = | 390 WebSocketChannelClient::ClosingHandshakeCompletionStatus status = |
| 397 wasClean ? WebSocketChannelClient::ClosingHandshakeComplete : WebSocketC hannelClient::ClosingHandshakeIncomplete; | 391 wasClean ? WebSocketChannelClient::ClosingHandshakeComplete : WebSocketC hannelClient::ClosingHandshakeIncomplete; |
| 398 client->didClose(m_bufferedAmount, status, code, reason); | 392 client->didClose(status, code, reason); |
| 399 // client->didClose may delete this object. | 393 // client->didClose may delete this object. |
| 400 } | 394 } |
| 401 | 395 |
| 402 Document* NewWebSocketChannelImpl::document() | 396 Document* NewWebSocketChannelImpl::document() |
| 403 { | 397 { |
| 404 ASSERT(m_identifier); | 398 ASSERT(m_identifier); |
| 405 ExecutionContext* context = executionContext(); | 399 ExecutionContext* context = executionContext(); |
| 406 ASSERT(context->isDocument()); | 400 ASSERT(context->isDocument()); |
| 407 return toDocument(context); | 401 return toDocument(context); |
| 408 } | 402 } |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 562 // |this| can be deleted here. | 556 // |this| can be deleted here. |
| 563 } | 557 } |
| 564 | 558 |
| 565 void NewWebSocketChannelImpl::trace(Visitor* visitor) | 559 void NewWebSocketChannelImpl::trace(Visitor* visitor) |
| 566 { | 560 { |
| 567 visitor->trace(m_blobLoader); | 561 visitor->trace(m_blobLoader); |
| 568 WebSocketChannel::trace(visitor); | 562 WebSocketChannel::trace(visitor); |
| 569 } | 563 } |
| 570 | 564 |
| 571 } // namespace WebCore | 565 } // namespace WebCore |
| OLD | NEW |