Chromium Code Reviews| 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 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 42 #include "core/dom/SecurityContext.h" | 42 #include "core/dom/SecurityContext.h" | 
| 43 #include "core/events/MessageEvent.h" | 43 #include "core/events/MessageEvent.h" | 
| 44 #include "core/fileapi/Blob.h" | 44 #include "core/fileapi/Blob.h" | 
| 45 #include "core/frame/LocalDOMWindow.h" | 45 #include "core/frame/LocalDOMWindow.h" | 
| 46 #include "core/frame/LocalFrame.h" | 46 #include "core/frame/LocalFrame.h" | 
| 47 #include "core/frame/UseCounter.h" | 47 #include "core/frame/UseCounter.h" | 
| 48 #include "core/frame/csp/ContentSecurityPolicy.h" | 48 #include "core/frame/csp/ContentSecurityPolicy.h" | 
| 49 #include "core/inspector/ConsoleMessage.h" | 49 #include "core/inspector/ConsoleMessage.h" | 
| 50 #include "modules/websockets/CloseEvent.h" | 50 #include "modules/websockets/CloseEvent.h" | 
| 51 #include "platform/Histogram.h" | 51 #include "platform/Histogram.h" | 
| 52 #include "platform/Logging.h" | |
| 53 #include "platform/blob/BlobData.h" | 52 #include "platform/blob/BlobData.h" | 
| 53 #include "platform/network/NetworkLog.h" | |
| 54 #include "platform/weborigin/KnownPorts.h" | 54 #include "platform/weborigin/KnownPorts.h" | 
| 55 #include "platform/weborigin/SecurityOrigin.h" | 55 #include "platform/weborigin/SecurityOrigin.h" | 
| 56 #include "public/platform/Platform.h" | 56 #include "public/platform/Platform.h" | 
| 57 #include "public/platform/WebInsecureRequestPolicy.h" | 57 #include "public/platform/WebInsecureRequestPolicy.h" | 
| 58 #include "wtf/Assertions.h" | 58 #include "wtf/Assertions.h" | 
| 59 #include "wtf/HashSet.h" | 59 #include "wtf/HashSet.h" | 
| 60 #include "wtf/MathExtras.h" | 60 #include "wtf/MathExtras.h" | 
| 61 #include "wtf/StdLibExtras.h" | 61 #include "wtf/StdLibExtras.h" | 
| 62 #include "wtf/text/CString.h" | 62 #include "wtf/text/CString.h" | 
| 63 #include "wtf/text/StringBuilder.h" | 63 #include "wtf/text/StringBuilder.h" | 
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 277 if (exceptionState.hadException()) | 277 if (exceptionState.hadException()) | 
| 278 return nullptr; | 278 return nullptr; | 
| 279 | 279 | 
| 280 return webSocket; | 280 return webSocket; | 
| 281 } | 281 } | 
| 282 | 282 | 
| 283 void DOMWebSocket::connect(const String& url, const Vector<String>& protocols, E xceptionState& exceptionState) | 283 void DOMWebSocket::connect(const String& url, const Vector<String>& protocols, E xceptionState& exceptionState) | 
| 284 { | 284 { | 
| 285 UseCounter::count(getExecutionContext(), UseCounter::WebSocket); | 285 UseCounter::count(getExecutionContext(), UseCounter::WebSocket); | 
| 286 | 286 | 
| 287 WTF_LOG(Network, "WebSocket %p connect() url='%s'", this, url.utf8().data()) ; | 287 NETWORK_DVLOG(1) << "WebSocket " << this << " connect() url=" << url; | 
| 288 m_url = KURL(KURL(), url); | 288 m_url = KURL(KURL(), url); | 
| 289 | 289 | 
| 290 if (getExecutionContext()->securityContext().getInsecureRequestPolicy() & kU pgradeInsecureRequests && m_url.protocol() == "ws") { | 290 if (getExecutionContext()->securityContext().getInsecureRequestPolicy() & kU pgradeInsecureRequests && m_url.protocol() == "ws") { | 
| 291 UseCounter::count(getExecutionContext(), UseCounter::UpgradeInsecureRequ estsUpgradedRequest); | 291 UseCounter::count(getExecutionContext(), UseCounter::UpgradeInsecureRequ estsUpgradedRequest); | 
| 292 m_url.setProtocol("wss"); | 292 m_url.setProtocol("wss"); | 
| 293 if (m_url.port() == 80) | 293 if (m_url.port() == 80) | 
| 294 m_url.setPort(443); | 294 m_url.setPort(443); | 
| 295 } | 295 } | 
| 296 | 296 | 
| 297 if (!m_url.isValid()) { | 297 if (!m_url.isValid()) { | 
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 363 m_bufferedAmountAfterClose += payloadSize; | 363 m_bufferedAmountAfterClose += payloadSize; | 
| 364 | 364 | 
| 365 logError("WebSocket is already in CLOSING or CLOSED state."); | 365 logError("WebSocket is already in CLOSING or CLOSED state."); | 
| 366 } | 366 } | 
| 367 | 367 | 
| 368 void DOMWebSocket::reflectBufferedAmountConsumption(TimerBase*) | 368 void DOMWebSocket::reflectBufferedAmountConsumption(TimerBase*) | 
| 369 { | 369 { | 
| 370 ASSERT(m_bufferedAmount >= m_consumedBufferedAmount); | 370 ASSERT(m_bufferedAmount >= m_consumedBufferedAmount); | 
| 371 // Cast to unsigned long long is required since clang doesn't accept | 371 // Cast to unsigned long long is required since clang doesn't accept | 
| 372 // combination of %llu and uint64_t (known as unsigned long). | 372 // combination of %llu and uint64_t (known as unsigned long). | 
| 373 WTF_LOG(Network, "WebSocket %p reflectBufferedAmountConsumption() %llu => %l lu", this, static_cast<unsigned long long>(m_bufferedAmount), static_cast<unsign ed long long>(m_bufferedAmount - m_consumedBufferedAmount)); | 373 NETWORK_DVLOG(1) << "WebSocket " << this << " reflectBufferedAmountConsumpti on() " << m_bufferedAmount << " => " << (m_bufferedAmount - m_consumedBufferedAm ount); | 
| 374 | 374 | 
| 375 m_bufferedAmount -= m_consumedBufferedAmount; | 375 m_bufferedAmount -= m_consumedBufferedAmount; | 
| 376 m_consumedBufferedAmount = 0; | 376 m_consumedBufferedAmount = 0; | 
| 377 } | 377 } | 
| 378 | 378 | 
| 379 void DOMWebSocket::releaseChannel() | 379 void DOMWebSocket::releaseChannel() | 
| 380 { | 380 { | 
| 381 ASSERT(m_channel); | 381 ASSERT(m_channel); | 
| 382 m_channel->disconnect(); | 382 m_channel->disconnect(); | 
| 383 m_channel = nullptr; | 383 m_channel = nullptr; | 
| 384 } | 384 } | 
| 385 | 385 | 
| 386 void DOMWebSocket::logBinaryTypeChangesAfterOpen() | 386 void DOMWebSocket::logBinaryTypeChangesAfterOpen() | 
| 387 { | 387 { | 
| 388 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, binaryTypeChangesHisto gram, new CustomCountHistogram("WebCore.WebSocket.BinaryTypeChangesAfterOpen", 1 , 1024, 10)); | 388 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, binaryTypeChangesHisto gram, new CustomCountHistogram("WebCore.WebSocket.BinaryTypeChangesAfterOpen", 1 , 1024, 10)); | 
| 389 DVLOG(3) << "WebSocket " << static_cast<void*>(this) << " logBinaryTypeChang esAfterOpen() logging " << m_binaryTypeChangesAfterOpen; | 389 DVLOG(3) << "WebSocket " << static_cast<void*>(this) << " logBinaryTypeChang esAfterOpen() logging " << m_binaryTypeChangesAfterOpen; | 
| 390 binaryTypeChangesHistogram.count(m_binaryTypeChangesAfterOpen); | 390 binaryTypeChangesHistogram.count(m_binaryTypeChangesAfterOpen); | 
| 391 } | 391 } | 
| 392 | 392 | 
| 393 void DOMWebSocket::send(const String& message, ExceptionState& exceptionState) | 393 void DOMWebSocket::send(const String& message, ExceptionState& exceptionState) | 
| 394 { | 394 { | 
| 395 CString encodedMessage = message.utf8(); | 395 CString encodedMessage = message.utf8(); | 
| 396 | 396 | 
| 397 WTF_LOG(Network, "WebSocket %p send() Sending String '%s'", this, encodedMes sage.data()); | 397 NETWORK_DVLOG(1) << "WebSocket " << this << " send() Sending String '" << en codedMessage.data() << "'"; | 
| 
 
tyoshino (SeeGerritForStatus)
2016/08/12 04:50:49
as we're switching to double quotations for WTFStr
 
tkent
2016/08/12 05:37:18
Done.  This function has |const String& message|.
 
 | |
| 398 if (m_state == kConnecting) { | 398 if (m_state == kConnecting) { | 
| 399 setInvalidStateErrorForSendMethod(exceptionState); | 399 setInvalidStateErrorForSendMethod(exceptionState); | 
| 400 return; | 400 return; | 
| 401 } | 401 } | 
| 402 // No exception is raised if the connection was once established but has sub sequently been closed. | 402 // No exception is raised if the connection was once established but has sub sequently been closed. | 
| 403 if (m_state == kClosing || m_state == kClosed) { | 403 if (m_state == kClosing || m_state == kClosed) { | 
| 404 updateBufferedAmountAfterClose(encodedMessage.length()); | 404 updateBufferedAmountAfterClose(encodedMessage.length()); | 
| 405 return; | 405 return; | 
| 406 } | 406 } | 
| 407 | 407 | 
| 408 recordSendTypeHistogram(WebSocketSendTypeString); | 408 recordSendTypeHistogram(WebSocketSendTypeString); | 
| 409 | 409 | 
| 410 ASSERT(m_channel); | 410 ASSERT(m_channel); | 
| 411 m_bufferedAmount += encodedMessage.length(); | 411 m_bufferedAmount += encodedMessage.length(); | 
| 412 m_channel->send(encodedMessage); | 412 m_channel->send(encodedMessage); | 
| 413 } | 413 } | 
| 414 | 414 | 
| 415 void DOMWebSocket::send(DOMArrayBuffer* binaryData, ExceptionState& exceptionSta te) | 415 void DOMWebSocket::send(DOMArrayBuffer* binaryData, ExceptionState& exceptionSta te) | 
| 416 { | 416 { | 
| 417 WTF_LOG(Network, "WebSocket %p send() Sending ArrayBuffer %p", this, binaryD ata); | 417 NETWORK_DVLOG(1) << "WebSocket " << this << " send() Sending ArrayBuffer " < < binaryData; | 
| 418 ASSERT(binaryData && binaryData->buffer()); | 418 ASSERT(binaryData && binaryData->buffer()); | 
| 419 if (m_state == kConnecting) { | 419 if (m_state == kConnecting) { | 
| 420 setInvalidStateErrorForSendMethod(exceptionState); | 420 setInvalidStateErrorForSendMethod(exceptionState); | 
| 421 return; | 421 return; | 
| 422 } | 422 } | 
| 423 if (m_state == kClosing || m_state == kClosed) { | 423 if (m_state == kClosing || m_state == kClosed) { | 
| 424 updateBufferedAmountAfterClose(binaryData->byteLength()); | 424 updateBufferedAmountAfterClose(binaryData->byteLength()); | 
| 425 return; | 425 return; | 
| 426 } | 426 } | 
| 427 recordSendTypeHistogram(WebSocketSendTypeArrayBuffer); | 427 recordSendTypeHistogram(WebSocketSendTypeArrayBuffer); | 
| 428 recordSendMessageSizeHistogram(WebSocketSendTypeArrayBuffer, binaryData->byt eLength()); | 428 recordSendMessageSizeHistogram(WebSocketSendTypeArrayBuffer, binaryData->byt eLength()); | 
| 429 ASSERT(m_channel); | 429 ASSERT(m_channel); | 
| 430 m_bufferedAmount += binaryData->byteLength(); | 430 m_bufferedAmount += binaryData->byteLength(); | 
| 431 m_channel->send(*binaryData, 0, binaryData->byteLength()); | 431 m_channel->send(*binaryData, 0, binaryData->byteLength()); | 
| 432 } | 432 } | 
| 433 | 433 | 
| 434 void DOMWebSocket::send(DOMArrayBufferView* arrayBufferView, ExceptionState& exc eptionState) | 434 void DOMWebSocket::send(DOMArrayBufferView* arrayBufferView, ExceptionState& exc eptionState) | 
| 435 { | 435 { | 
| 436 WTF_LOG(Network, "WebSocket %p send() Sending ArrayBufferView %p", this, arr ayBufferView); | 436 NETWORK_DVLOG(1) << "WebSocket " << this << " send() Sending ArrayBufferView " << arrayBufferView; | 
| 437 ASSERT(arrayBufferView); | 437 ASSERT(arrayBufferView); | 
| 438 if (m_state == kConnecting) { | 438 if (m_state == kConnecting) { | 
| 439 setInvalidStateErrorForSendMethod(exceptionState); | 439 setInvalidStateErrorForSendMethod(exceptionState); | 
| 440 return; | 440 return; | 
| 441 } | 441 } | 
| 442 if (m_state == kClosing || m_state == kClosed) { | 442 if (m_state == kClosing || m_state == kClosed) { | 
| 443 updateBufferedAmountAfterClose(arrayBufferView->byteLength()); | 443 updateBufferedAmountAfterClose(arrayBufferView->byteLength()); | 
| 444 return; | 444 return; | 
| 445 } | 445 } | 
| 446 recordSendTypeHistogram(WebSocketSendTypeArrayBufferView); | 446 recordSendTypeHistogram(WebSocketSendTypeArrayBufferView); | 
| 447 recordSendMessageSizeHistogram(WebSocketSendTypeArrayBufferView, arrayBuffer View->byteLength()); | 447 recordSendMessageSizeHistogram(WebSocketSendTypeArrayBufferView, arrayBuffer View->byteLength()); | 
| 448 ASSERT(m_channel); | 448 ASSERT(m_channel); | 
| 449 m_bufferedAmount += arrayBufferView->byteLength(); | 449 m_bufferedAmount += arrayBufferView->byteLength(); | 
| 450 m_channel->send(*arrayBufferView->buffer(), arrayBufferView->byteOffset(), a rrayBufferView->byteLength()); | 450 m_channel->send(*arrayBufferView->buffer(), arrayBufferView->byteOffset(), a rrayBufferView->byteLength()); | 
| 451 } | 451 } | 
| 452 | 452 | 
| 453 void DOMWebSocket::send(Blob* binaryData, ExceptionState& exceptionState) | 453 void DOMWebSocket::send(Blob* binaryData, ExceptionState& exceptionState) | 
| 454 { | 454 { | 
| 455 WTF_LOG(Network, "WebSocket %p send() Sending Blob '%s'", this, binaryData-> uuid().utf8().data()); | 455 NETWORK_DVLOG(1) << "WebSocket " << this << " send() Sending Blob " << binar yData->uuid(); | 
| 456 ASSERT(binaryData); | 456 ASSERT(binaryData); | 
| 457 if (m_state == kConnecting) { | 457 if (m_state == kConnecting) { | 
| 458 setInvalidStateErrorForSendMethod(exceptionState); | 458 setInvalidStateErrorForSendMethod(exceptionState); | 
| 459 return; | 459 return; | 
| 460 } | 460 } | 
| 461 if (m_state == kClosing || m_state == kClosed) { | 461 if (m_state == kClosing || m_state == kClosed) { | 
| 462 updateBufferedAmountAfterClose(binaryData->size()); | 462 updateBufferedAmountAfterClose(binaryData->size()); | 
| 463 return; | 463 return; | 
| 464 } | 464 } | 
| 465 unsigned long long size = binaryData->size(); | 465 unsigned long long size = binaryData->size(); | 
| (...skipping 23 matching lines...) Expand all Loading... | |
| 489 | 489 | 
| 490 void DOMWebSocket::close(unsigned short code, ExceptionState& exceptionState) | 490 void DOMWebSocket::close(unsigned short code, ExceptionState& exceptionState) | 
| 491 { | 491 { | 
| 492 closeInternal(code, String(), exceptionState); | 492 closeInternal(code, String(), exceptionState); | 
| 493 } | 493 } | 
| 494 | 494 | 
| 495 void DOMWebSocket::closeInternal(int code, const String& reason, ExceptionState& exceptionState) | 495 void DOMWebSocket::closeInternal(int code, const String& reason, ExceptionState& exceptionState) | 
| 496 { | 496 { | 
| 497 String cleansedReason = reason; | 497 String cleansedReason = reason; | 
| 498 if (code == WebSocketChannel::CloseEventCodeNotSpecified) { | 498 if (code == WebSocketChannel::CloseEventCodeNotSpecified) { | 
| 499 WTF_LOG(Network, "WebSocket %p close() without code and reason", this); | 499 NETWORK_DVLOG(1) << "WebSocket " << this << " close() without code and r eason"; | 
| 500 } else { | 500 } else { | 
| 501 WTF_LOG(Network, "WebSocket %p close() code=%d reason='%s'", this, code, reason.utf8().data()); | 501 NETWORK_DVLOG(1) << "WebSocket " << this << " close() code=" << code << " reason=" << reason; | 
| 502 if (!(code == WebSocketChannel::CloseEventCodeNormalClosure || (WebSocke tChannel::CloseEventCodeMinimumUserDefined <= code && code <= WebSocketChannel:: CloseEventCodeMaximumUserDefined))) { | 502 if (!(code == WebSocketChannel::CloseEventCodeNormalClosure || (WebSocke tChannel::CloseEventCodeMinimumUserDefined <= code && code <= WebSocketChannel:: CloseEventCodeMaximumUserDefined))) { | 
| 503 exceptionState.throwDOMException(InvalidAccessError, "The code must be either 1000, or between 3000 and 4999. " + String::number(code) + " is neithe r."); | 503 exceptionState.throwDOMException(InvalidAccessError, "The code must be either 1000, or between 3000 and 4999. " + String::number(code) + " is neithe r."); | 
| 504 return; | 504 return; | 
| 505 } | 505 } | 
| 506 // Bindings specify USVString, so unpaired surrogates are already replac ed with U+FFFD. | 506 // Bindings specify USVString, so unpaired surrogates are already replac ed with U+FFFD. | 
| 507 CString utf8 = reason.utf8(); | 507 CString utf8 = reason.utf8(); | 
| 508 if (utf8.length() > maxReasonSizeInBytes) { | 508 if (utf8.length() > maxReasonSizeInBytes) { | 
| 509 exceptionState.throwDOMException(SyntaxError, "The message must not be greater than " + String::number(maxReasonSizeInBytes) + " bytes."); | 509 exceptionState.throwDOMException(SyntaxError, "The message must not be greater than " + String::number(maxReasonSizeInBytes) + " bytes."); | 
| 510 return; | 510 return; | 
| 511 } | 511 } | 
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 597 return EventTargetNames::DOMWebSocket; | 597 return EventTargetNames::DOMWebSocket; | 
| 598 } | 598 } | 
| 599 | 599 | 
| 600 ExecutionContext* DOMWebSocket::getExecutionContext() const | 600 ExecutionContext* DOMWebSocket::getExecutionContext() const | 
| 601 { | 601 { | 
| 602 return ActiveDOMObject::getExecutionContext(); | 602 return ActiveDOMObject::getExecutionContext(); | 
| 603 } | 603 } | 
| 604 | 604 | 
| 605 void DOMWebSocket::contextDestroyed() | 605 void DOMWebSocket::contextDestroyed() | 
| 606 { | 606 { | 
| 607 WTF_LOG(Network, "WebSocket %p contextDestroyed()", this); | 607 NETWORK_DVLOG(1) << "WebSocket " << this << " contextDestroyed()"; | 
| 608 DCHECK(!m_channel); | 608 DCHECK(!m_channel); | 
| 609 DCHECK_EQ(kClosed, m_state); | 609 DCHECK_EQ(kClosed, m_state); | 
| 610 ActiveDOMObject::contextDestroyed(); | 610 ActiveDOMObject::contextDestroyed(); | 
| 611 } | 611 } | 
| 612 | 612 | 
| 613 bool DOMWebSocket::hasPendingActivity() const | 613 bool DOMWebSocket::hasPendingActivity() const | 
| 614 { | 614 { | 
| 615 return m_channel || !m_eventQueue->isEmpty(); | 615 return m_channel || !m_eventQueue->isEmpty(); | 
| 616 } | 616 } | 
| 617 | 617 | 
| (...skipping 15 matching lines...) Expand all Loading... | |
| 633 releaseChannel(); | 633 releaseChannel(); | 
| 634 } | 634 } | 
| 635 if (m_state != kClosed) { | 635 if (m_state != kClosed) { | 
| 636 m_state = kClosed; | 636 m_state = kClosed; | 
| 637 logBinaryTypeChangesAfterOpen(); | 637 logBinaryTypeChangesAfterOpen(); | 
| 638 } | 638 } | 
| 639 } | 639 } | 
| 640 | 640 | 
| 641 void DOMWebSocket::didConnect(const String& subprotocol, const String& extension s) | 641 void DOMWebSocket::didConnect(const String& subprotocol, const String& extension s) | 
| 642 { | 642 { | 
| 643 WTF_LOG(Network, "WebSocket %p didConnect()", this); | 643 NETWORK_DVLOG(1) << "WebSocket " << this << " didConnect()"; | 
| 644 if (m_state != kConnecting) | 644 if (m_state != kConnecting) | 
| 645 return; | 645 return; | 
| 646 m_state = kOpen; | 646 m_state = kOpen; | 
| 647 m_subprotocol = subprotocol; | 647 m_subprotocol = subprotocol; | 
| 648 m_extensions = extensions; | 648 m_extensions = extensions; | 
| 649 m_eventQueue->dispatch(Event::create(EventTypeNames::open)); | 649 m_eventQueue->dispatch(Event::create(EventTypeNames::open)); | 
| 650 } | 650 } | 
| 651 | 651 | 
| 652 void DOMWebSocket::didReceiveTextMessage(const String& msg) | 652 void DOMWebSocket::didReceiveTextMessage(const String& msg) | 
| 653 { | 653 { | 
| 654 WTF_LOG(Network, "WebSocket %p didReceiveTextMessage() Text message '%s'", t his, msg.utf8().data()); | 654 NETWORK_DVLOG(1) << "WebSocket " << this << " didReceiveTextMessage() Text m essage " << msg; | 
| 655 if (m_state != kOpen) | 655 if (m_state != kOpen) | 
| 656 return; | 656 return; | 
| 657 recordReceiveTypeHistogram(WebSocketReceiveTypeString); | 657 recordReceiveTypeHistogram(WebSocketReceiveTypeString); | 
| 658 | 658 | 
| 659 m_eventQueue->dispatch(MessageEvent::create(msg, SecurityOrigin::create(m_ur l)->toString())); | 659 m_eventQueue->dispatch(MessageEvent::create(msg, SecurityOrigin::create(m_ur l)->toString())); | 
| 660 } | 660 } | 
| 661 | 661 | 
| 662 void DOMWebSocket::didReceiveBinaryMessage(std::unique_ptr<Vector<char>> binaryD ata) | 662 void DOMWebSocket::didReceiveBinaryMessage(std::unique_ptr<Vector<char>> binaryD ata) | 
| 663 { | 663 { | 
| 664 WTF_LOG(Network, "WebSocket %p didReceiveBinaryMessage() %lu byte binary mes sage", this, static_cast<unsigned long>(binaryData->size())); | 664 NETWORK_DVLOG(1) << "WebSocket " << this << " didReceiveBinaryMessage() " << binaryData->size() << " byte binary message"; | 
| 665 switch (m_binaryType) { | 665 switch (m_binaryType) { | 
| 666 case BinaryTypeBlob: { | 666 case BinaryTypeBlob: { | 
| 667 size_t size = binaryData->size(); | 667 size_t size = binaryData->size(); | 
| 668 RefPtr<RawData> rawData = RawData::create(); | 668 RefPtr<RawData> rawData = RawData::create(); | 
| 669 binaryData->swap(*rawData->mutableData()); | 669 binaryData->swap(*rawData->mutableData()); | 
| 670 std::unique_ptr<BlobData> blobData = BlobData::create(); | 670 std::unique_ptr<BlobData> blobData = BlobData::create(); | 
| 671 blobData->appendData(rawData.release(), 0, BlobDataItem::toEndOfFile); | 671 blobData->appendData(rawData.release(), 0, BlobDataItem::toEndOfFile); | 
| 672 Blob* blob = Blob::create(BlobDataHandle::create(std::move(blobData), si ze)); | 672 Blob* blob = Blob::create(BlobDataHandle::create(std::move(blobData), si ze)); | 
| 673 recordReceiveTypeHistogram(WebSocketReceiveTypeBlob); | 673 recordReceiveTypeHistogram(WebSocketReceiveTypeBlob); | 
| 674 recordReceiveMessageSizeHistogram(WebSocketReceiveTypeBlob, size); | 674 recordReceiveMessageSizeHistogram(WebSocketReceiveTypeBlob, size); | 
| 675 m_eventQueue->dispatch(MessageEvent::create(blob, SecurityOrigin::create (m_url)->toString())); | 675 m_eventQueue->dispatch(MessageEvent::create(blob, SecurityOrigin::create (m_url)->toString())); | 
| 676 break; | 676 break; | 
| 677 } | 677 } | 
| 678 | 678 | 
| 679 case BinaryTypeArrayBuffer: | 679 case BinaryTypeArrayBuffer: | 
| 680 DOMArrayBuffer* arrayBuffer = DOMArrayBuffer::create(binaryData->data(), binaryData->size()); | 680 DOMArrayBuffer* arrayBuffer = DOMArrayBuffer::create(binaryData->data(), binaryData->size()); | 
| 681 recordReceiveTypeHistogram(WebSocketReceiveTypeArrayBuffer); | 681 recordReceiveTypeHistogram(WebSocketReceiveTypeArrayBuffer); | 
| 682 recordReceiveMessageSizeHistogram(WebSocketReceiveTypeArrayBuffer, binar yData->size()); | 682 recordReceiveMessageSizeHistogram(WebSocketReceiveTypeArrayBuffer, binar yData->size()); | 
| 683 m_eventQueue->dispatch(MessageEvent::create(arrayBuffer, SecurityOrigin: :create(m_url)->toString())); | 683 m_eventQueue->dispatch(MessageEvent::create(arrayBuffer, SecurityOrigin: :create(m_url)->toString())); | 
| 684 break; | 684 break; | 
| 685 } | 685 } | 
| 686 } | 686 } | 
| 687 | 687 | 
| 688 void DOMWebSocket::didError() | 688 void DOMWebSocket::didError() | 
| 689 { | 689 { | 
| 690 WTF_LOG(Network, "WebSocket %p didError()", this); | 690 NETWORK_DVLOG(1) << "WebSocket " << this << " didError()"; | 
| 691 m_state = kClosed; | 691 m_state = kClosed; | 
| 692 logBinaryTypeChangesAfterOpen(); | 692 logBinaryTypeChangesAfterOpen(); | 
| 693 m_eventQueue->dispatch(Event::create(EventTypeNames::error)); | 693 m_eventQueue->dispatch(Event::create(EventTypeNames::error)); | 
| 694 } | 694 } | 
| 695 | 695 | 
| 696 void DOMWebSocket::didConsumeBufferedAmount(uint64_t consumed) | 696 void DOMWebSocket::didConsumeBufferedAmount(uint64_t consumed) | 
| 697 { | 697 { | 
| 698 ASSERT(m_bufferedAmount >= consumed + m_consumedBufferedAmount); | 698 ASSERT(m_bufferedAmount >= consumed + m_consumedBufferedAmount); | 
| 699 // Cast to unsigned long long is required since clang doesn't accept | 699 NETWORK_DVLOG(1) << "WebSocket " << this << " didConsumeBufferedAmount(" << consumed << ")"; | 
| 700 // combination of %llu and uint64_t (known as unsigned long). | |
| 701 WTF_LOG(Network, "WebSocket %p didConsumeBufferedAmount(%llu)", this, static _cast<unsigned long long>(consumed)); | |
| 702 if (m_state == kClosed) | 700 if (m_state == kClosed) | 
| 703 return; | 701 return; | 
| 704 m_consumedBufferedAmount += consumed; | 702 m_consumedBufferedAmount += consumed; | 
| 705 if (!m_bufferedAmountConsumeTimer.isActive()) | 703 if (!m_bufferedAmountConsumeTimer.isActive()) | 
| 706 m_bufferedAmountConsumeTimer.startOneShot(0, BLINK_FROM_HERE); | 704 m_bufferedAmountConsumeTimer.startOneShot(0, BLINK_FROM_HERE); | 
| 707 } | 705 } | 
| 708 | 706 | 
| 709 void DOMWebSocket::didStartClosingHandshake() | 707 void DOMWebSocket::didStartClosingHandshake() | 
| 710 { | 708 { | 
| 711 WTF_LOG(Network, "WebSocket %p didStartClosingHandshake()", this); | 709 NETWORK_DVLOG(1) << "WebSocket " << this << " didStartClosingHandshake()"; | 
| 712 m_state = kClosing; | 710 m_state = kClosing; | 
| 713 } | 711 } | 
| 714 | 712 | 
| 715 void DOMWebSocket::didClose(ClosingHandshakeCompletionStatus closingHandshakeCom pletion, unsigned short code, const String& reason) | 713 void DOMWebSocket::didClose(ClosingHandshakeCompletionStatus closingHandshakeCom pletion, unsigned short code, const String& reason) | 
| 716 { | 714 { | 
| 717 WTF_LOG(Network, "WebSocket %p didClose()", this); | 715 NETWORK_DVLOG(1) << "WebSocket " << this << " didClose()"; | 
| 718 if (!m_channel) | 716 if (!m_channel) | 
| 719 return; | 717 return; | 
| 720 bool allDataHasBeenConsumed = m_bufferedAmount == m_consumedBufferedAmount; | 718 bool allDataHasBeenConsumed = m_bufferedAmount == m_consumedBufferedAmount; | 
| 721 bool wasClean = m_state == kClosing && allDataHasBeenConsumed && closingHand shakeCompletion == ClosingHandshakeComplete && code != WebSocketChannel::CloseEv entCodeAbnormalClosure; | 719 bool wasClean = m_state == kClosing && allDataHasBeenConsumed && closingHand shakeCompletion == ClosingHandshakeComplete && code != WebSocketChannel::CloseEv entCodeAbnormalClosure; | 
| 722 m_state = kClosed; | 720 m_state = kClosed; | 
| 723 | 721 | 
| 724 m_eventQueue->dispatch(CloseEvent::create(wasClean, code, reason)); | 722 m_eventQueue->dispatch(CloseEvent::create(wasClean, code, reason)); | 
| 725 releaseChannel(); | 723 releaseChannel(); | 
| 726 } | 724 } | 
| 727 | 725 | 
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 790 DEFINE_TRACE(DOMWebSocket) | 788 DEFINE_TRACE(DOMWebSocket) | 
| 791 { | 789 { | 
| 792 visitor->trace(m_channel); | 790 visitor->trace(m_channel); | 
| 793 visitor->trace(m_eventQueue); | 791 visitor->trace(m_eventQueue); | 
| 794 WebSocketChannelClient::trace(visitor); | 792 WebSocketChannelClient::trace(visitor); | 
| 795 EventTargetWithInlineData::trace(visitor); | 793 EventTargetWithInlineData::trace(visitor); | 
| 796 ActiveDOMObject::trace(visitor); | 794 ActiveDOMObject::trace(visitor); | 
| 797 } | 795 } | 
| 798 | 796 | 
| 799 } // namespace blink | 797 } // namespace blink | 
| OLD | NEW |