| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 #include "core/frame/DOMWindow.h" | 44 #include "core/frame/DOMWindow.h" |
| 45 #include "core/frame/LocalFrame.h" | 45 #include "core/frame/LocalFrame.h" |
| 46 #include "core/frame/csp/ContentSecurityPolicy.h" | 46 #include "core/frame/csp/ContentSecurityPolicy.h" |
| 47 #include "core/inspector/ScriptCallStack.h" | 47 #include "core/inspector/ScriptCallStack.h" |
| 48 #include "modules/websockets/CloseEvent.h" | 48 #include "modules/websockets/CloseEvent.h" |
| 49 #include "platform/Logging.h" | 49 #include "platform/Logging.h" |
| 50 #include "platform/blob/BlobData.h" | 50 #include "platform/blob/BlobData.h" |
| 51 #include "platform/heap/Handle.h" | 51 #include "platform/heap/Handle.h" |
| 52 #include "platform/weborigin/KnownPorts.h" | 52 #include "platform/weborigin/KnownPorts.h" |
| 53 #include "platform/weborigin/SecurityOrigin.h" | 53 #include "platform/weborigin/SecurityOrigin.h" |
| 54 #include "public/platform/Platform.h" |
| 54 #include "wtf/ArrayBuffer.h" | 55 #include "wtf/ArrayBuffer.h" |
| 55 #include "wtf/ArrayBufferView.h" | 56 #include "wtf/ArrayBufferView.h" |
| 56 #include "wtf/HashSet.h" | 57 #include "wtf/HashSet.h" |
| 57 #include "wtf/PassOwnPtr.h" | 58 #include "wtf/PassOwnPtr.h" |
| 58 #include "wtf/StdLibExtras.h" | 59 #include "wtf/StdLibExtras.h" |
| 59 #include "wtf/text/CString.h" | 60 #include "wtf/text/CString.h" |
| 60 #include "wtf/text/StringBuilder.h" | 61 #include "wtf/text/StringBuilder.h" |
| 61 #include "wtf/text/WTFString.h" | 62 #include "wtf/text/WTFString.h" |
| 62 | 63 |
| 63 using namespace std; | 64 using namespace std; |
| (...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 } | 350 } |
| 350 } | 351 } |
| 351 | 352 |
| 352 String protocolString; | 353 String protocolString; |
| 353 if (!protocols.isEmpty()) | 354 if (!protocols.isEmpty()) |
| 354 protocolString = joinStrings(protocols, subProtocolSeperator()); | 355 protocolString = joinStrings(protocols, subProtocolSeperator()); |
| 355 | 356 |
| 356 m_channel->connect(m_url, protocolString); | 357 m_channel->connect(m_url, protocolString); |
| 357 } | 358 } |
| 358 | 359 |
| 359 void WebSocket::handleSendResult(WebSocketChannel::SendResult result, ExceptionS
tate& exceptionState) | 360 void WebSocket::handleSendResult(WebSocketChannel::SendResult result, ExceptionS
tate& exceptionState, WebSocketSendType dataType) |
| 360 { | 361 { |
| 361 switch (result) { | 362 switch (result) { |
| 362 case WebSocketChannel::InvalidMessage: | 363 case WebSocketChannel::InvalidMessage: |
| 363 exceptionState.throwDOMException(SyntaxError, "The message contains inva
lid characters."); | 364 exceptionState.throwDOMException(SyntaxError, "The message contains inva
lid characters."); |
| 364 return; | 365 return; |
| 365 case WebSocketChannel::SendFail: | 366 case WebSocketChannel::SendFail: |
| 366 logError("WebSocket send() failed."); | 367 logError("WebSocket send() failed."); |
| 367 return; | 368 return; |
| 368 case WebSocketChannel::SendSuccess: | 369 case WebSocketChannel::SendSuccess: |
| 370 blink::Platform::current()->histogramEnumeration("WebCore.WebSocket.Send
Type", dataType, WebSocketSendTypeMax); |
| 369 return; | 371 return; |
| 370 } | 372 } |
| 371 ASSERT_NOT_REACHED(); | 373 ASSERT_NOT_REACHED(); |
| 372 } | 374 } |
| 373 | 375 |
| 374 void WebSocket::updateBufferedAmountAfterClose(unsigned long payloadSize) | 376 void WebSocket::updateBufferedAmountAfterClose(unsigned long payloadSize) |
| 375 { | 377 { |
| 376 m_bufferedAmountAfterClose = saturateAdd(m_bufferedAmountAfterClose, payload
Size); | 378 m_bufferedAmountAfterClose = saturateAdd(m_bufferedAmountAfterClose, payload
Size); |
| 377 m_bufferedAmountAfterClose = saturateAdd(m_bufferedAmountAfterClose, getFram
ingOverhead(payloadSize)); | 379 m_bufferedAmountAfterClose = saturateAdd(m_bufferedAmountAfterClose, getFram
ingOverhead(payloadSize)); |
| 378 | 380 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 392 if (m_state == CONNECTING) { | 394 if (m_state == CONNECTING) { |
| 393 setInvalidStateErrorForSendMethod(exceptionState); | 395 setInvalidStateErrorForSendMethod(exceptionState); |
| 394 return; | 396 return; |
| 395 } | 397 } |
| 396 // No exception is raised if the connection was once established but has sub
sequently been closed. | 398 // No exception is raised if the connection was once established but has sub
sequently been closed. |
| 397 if (m_state == CLOSING || m_state == CLOSED) { | 399 if (m_state == CLOSING || m_state == CLOSED) { |
| 398 updateBufferedAmountAfterClose(message.utf8().length()); | 400 updateBufferedAmountAfterClose(message.utf8().length()); |
| 399 return; | 401 return; |
| 400 } | 402 } |
| 401 ASSERT(m_channel); | 403 ASSERT(m_channel); |
| 402 handleSendResult(m_channel->send(message), exceptionState); | 404 handleSendResult(m_channel->send(message), exceptionState, WebSocketSendType
String); |
| 403 } | 405 } |
| 404 | 406 |
| 405 void WebSocket::send(ArrayBuffer* binaryData, ExceptionState& exceptionState) | 407 void WebSocket::send(ArrayBuffer* binaryData, ExceptionState& exceptionState) |
| 406 { | 408 { |
| 407 WTF_LOG(Network, "WebSocket %p send() Sending ArrayBuffer %p", this, binaryD
ata); | 409 WTF_LOG(Network, "WebSocket %p send() Sending ArrayBuffer %p", this, binaryD
ata); |
| 408 ASSERT(binaryData); | 410 ASSERT(binaryData); |
| 409 if (m_state == CONNECTING) { | 411 if (m_state == CONNECTING) { |
| 410 setInvalidStateErrorForSendMethod(exceptionState); | 412 setInvalidStateErrorForSendMethod(exceptionState); |
| 411 return; | 413 return; |
| 412 } | 414 } |
| 413 if (m_state == CLOSING || m_state == CLOSED) { | 415 if (m_state == CLOSING || m_state == CLOSED) { |
| 414 updateBufferedAmountAfterClose(binaryData->byteLength()); | 416 updateBufferedAmountAfterClose(binaryData->byteLength()); |
| 415 return; | 417 return; |
| 416 } | 418 } |
| 417 ASSERT(m_channel); | 419 ASSERT(m_channel); |
| 418 handleSendResult(m_channel->send(*binaryData, 0, binaryData->byteLength()),
exceptionState); | 420 handleSendResult(m_channel->send(*binaryData, 0, binaryData->byteLength()),
exceptionState, WebSocketSendTypeArrayBuffer); |
| 419 } | 421 } |
| 420 | 422 |
| 421 void WebSocket::send(ArrayBufferView* arrayBufferView, ExceptionState& exception
State) | 423 void WebSocket::send(ArrayBufferView* arrayBufferView, ExceptionState& exception
State) |
| 422 { | 424 { |
| 423 WTF_LOG(Network, "WebSocket %p send() Sending ArrayBufferView %p", this, arr
ayBufferView); | 425 WTF_LOG(Network, "WebSocket %p send() Sending ArrayBufferView %p", this, arr
ayBufferView); |
| 424 ASSERT(arrayBufferView); | 426 ASSERT(arrayBufferView); |
| 425 if (m_state == CONNECTING) { | 427 if (m_state == CONNECTING) { |
| 426 setInvalidStateErrorForSendMethod(exceptionState); | 428 setInvalidStateErrorForSendMethod(exceptionState); |
| 427 return; | 429 return; |
| 428 } | 430 } |
| 429 if (m_state == CLOSING || m_state == CLOSED) { | 431 if (m_state == CLOSING || m_state == CLOSED) { |
| 430 updateBufferedAmountAfterClose(arrayBufferView->byteLength()); | 432 updateBufferedAmountAfterClose(arrayBufferView->byteLength()); |
| 431 return; | 433 return; |
| 432 } | 434 } |
| 433 ASSERT(m_channel); | 435 ASSERT(m_channel); |
| 434 RefPtr<ArrayBuffer> arrayBuffer(arrayBufferView->buffer()); | 436 RefPtr<ArrayBuffer> arrayBuffer(arrayBufferView->buffer()); |
| 435 handleSendResult(m_channel->send(*arrayBuffer, arrayBufferView->byteOffset()
, arrayBufferView->byteLength()), exceptionState); | 437 handleSendResult(m_channel->send(*arrayBuffer, arrayBufferView->byteOffset()
, arrayBufferView->byteLength()), exceptionState, WebSocketSendTypeArrayBufferVi
ew); |
| 436 } | 438 } |
| 437 | 439 |
| 438 void WebSocket::send(Blob* binaryData, ExceptionState& exceptionState) | 440 void WebSocket::send(Blob* binaryData, ExceptionState& exceptionState) |
| 439 { | 441 { |
| 440 WTF_LOG(Network, "WebSocket %p send() Sending Blob '%s'", this, binaryData->
uuid().utf8().data()); | 442 WTF_LOG(Network, "WebSocket %p send() Sending Blob '%s'", this, binaryData->
uuid().utf8().data()); |
| 441 ASSERT(binaryData); | 443 ASSERT(binaryData); |
| 442 if (m_state == CONNECTING) { | 444 if (m_state == CONNECTING) { |
| 443 setInvalidStateErrorForSendMethod(exceptionState); | 445 setInvalidStateErrorForSendMethod(exceptionState); |
| 444 return; | 446 return; |
| 445 } | 447 } |
| 446 if (m_state == CLOSING || m_state == CLOSED) { | 448 if (m_state == CLOSING || m_state == CLOSED) { |
| 447 updateBufferedAmountAfterClose(static_cast<unsigned long>(binaryData->si
ze())); | 449 updateBufferedAmountAfterClose(static_cast<unsigned long>(binaryData->si
ze())); |
| 448 return; | 450 return; |
| 449 } | 451 } |
| 450 ASSERT(m_channel); | 452 ASSERT(m_channel); |
| 451 handleSendResult(m_channel->send(binaryData->blobDataHandle()), exceptionSta
te); | 453 handleSendResult(m_channel->send(binaryData->blobDataHandle()), exceptionSta
te, WebSocketSendTypeBlob); |
| 452 } | 454 } |
| 453 | 455 |
| 454 void WebSocket::close(unsigned short code, const String& reason, ExceptionState&
exceptionState) | 456 void WebSocket::close(unsigned short code, const String& reason, ExceptionState&
exceptionState) |
| 455 { | 457 { |
| 456 closeInternal(code, reason, exceptionState); | 458 closeInternal(code, reason, exceptionState); |
| 457 } | 459 } |
| 458 | 460 |
| 459 void WebSocket::close(ExceptionState& exceptionState) | 461 void WebSocket::close(ExceptionState& exceptionState) |
| 460 { | 462 { |
| 461 closeInternal(WebSocketChannel::CloseEventCodeNotSpecified, String(), except
ionState); | 463 closeInternal(WebSocketChannel::CloseEventCodeNotSpecified, String(), except
ionState); |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 674 static const size_t minimumPayloadSizeWithEightByteExtendedPayloadLength = 0
x10000; | 676 static const size_t minimumPayloadSizeWithEightByteExtendedPayloadLength = 0
x10000; |
| 675 size_t overhead = hybiBaseFramingOverhead + hybiMaskingKeyLength; | 677 size_t overhead = hybiBaseFramingOverhead + hybiMaskingKeyLength; |
| 676 if (payloadSize >= minimumPayloadSizeWithEightByteExtendedPayloadLength) | 678 if (payloadSize >= minimumPayloadSizeWithEightByteExtendedPayloadLength) |
| 677 overhead += 8; | 679 overhead += 8; |
| 678 else if (payloadSize >= minimumPayloadSizeWithTwoByteExtendedPayloadLength) | 680 else if (payloadSize >= minimumPayloadSizeWithTwoByteExtendedPayloadLength) |
| 679 overhead += 2; | 681 overhead += 2; |
| 680 return overhead; | 682 return overhead; |
| 681 } | 683 } |
| 682 | 684 |
| 683 } // namespace WebCore | 685 } // namespace WebCore |
| OLD | NEW |