| 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 23 matching lines...) Expand all Loading... |
| 34 #include "bindings/core/v8/ScriptController.h" | 34 #include "bindings/core/v8/ScriptController.h" |
| 35 #include "bindings/modules/v8/UnionTypesModules.h" | 35 #include "bindings/modules/v8/UnionTypesModules.h" |
| 36 #include "core/dom/DOMArrayBuffer.h" | 36 #include "core/dom/DOMArrayBuffer.h" |
| 37 #include "core/dom/DOMArrayBufferView.h" | 37 #include "core/dom/DOMArrayBufferView.h" |
| 38 #include "core/dom/Document.h" | 38 #include "core/dom/Document.h" |
| 39 #include "core/dom/ExceptionCode.h" | 39 #include "core/dom/ExceptionCode.h" |
| 40 #include "core/dom/ExecutionContext.h" | 40 #include "core/dom/ExecutionContext.h" |
| 41 #include "core/dom/SecurityContext.h" | 41 #include "core/dom/SecurityContext.h" |
| 42 #include "core/events/MessageEvent.h" | 42 #include "core/events/MessageEvent.h" |
| 43 #include "core/fileapi/Blob.h" | 43 #include "core/fileapi/Blob.h" |
| 44 #include "core/fileapi/FileReaderLoader.h" |
| 44 #include "core/frame/ConsoleTypes.h" | 45 #include "core/frame/ConsoleTypes.h" |
| 45 #include "core/frame/LocalDOMWindow.h" | 46 #include "core/frame/LocalDOMWindow.h" |
| 46 #include "core/frame/LocalFrame.h" | 47 #include "core/frame/LocalFrame.h" |
| 47 #include "core/frame/UseCounter.h" | 48 #include "core/frame/UseCounter.h" |
| 48 #include "core/frame/csp/ContentSecurityPolicy.h" | 49 #include "core/frame/csp/ContentSecurityPolicy.h" |
| 49 #include "core/inspector/ConsoleMessage.h" | 50 #include "core/inspector/ConsoleMessage.h" |
| 50 #include "core/inspector/ScriptCallStack.h" | 51 #include "core/inspector/ScriptCallStack.h" |
| 51 #include "modules/websockets/CloseEvent.h" | 52 #include "modules/websockets/CloseEvent.h" |
| 52 #include "platform/Logging.h" | 53 #include "platform/Logging.h" |
| 53 #include "platform/blob/BlobData.h" | 54 #include "platform/blob/BlobData.h" |
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 545 switch (m_binaryType) { | 546 switch (m_binaryType) { |
| 546 case BinaryTypeBlob: | 547 case BinaryTypeBlob: |
| 547 return "blob"; | 548 return "blob"; |
| 548 case BinaryTypeArrayBuffer: | 549 case BinaryTypeArrayBuffer: |
| 549 return "arraybuffer"; | 550 return "arraybuffer"; |
| 550 } | 551 } |
| 551 ASSERT_NOT_REACHED(); | 552 ASSERT_NOT_REACHED(); |
| 552 return String(); | 553 return String(); |
| 553 } | 554 } |
| 554 | 555 |
| 556 // static |
| 557 WebSocketChannel::BinaryType DOMWebSocket::toChannelBinaryType(BinaryType binary
Type) |
| 558 { |
| 559 static_assert(static_cast<WebSocketChannel::BinaryType>(BinaryTypeBlob) == W
ebSocketChannel::BinaryTypeBlob, "enums must match"); |
| 560 static_assert(static_cast<WebSocketChannel::BinaryType>(BinaryTypeArrayBuffe
r) == WebSocketChannel::BinaryTypeArrayBuffer, "enums must match"); |
| 561 ASSERT(binaryType == BinaryTypeBlob || binaryType == BinaryTypeArrayBuffer); |
| 562 return static_cast<WebSocketChannel::BinaryType>(binaryType); |
| 563 } |
| 564 |
| 555 void DOMWebSocket::setBinaryType(const String& binaryType) | 565 void DOMWebSocket::setBinaryType(const String& binaryType) |
| 556 { | 566 { |
| 557 if (binaryType == "blob") { | 567 if (binaryType == "blob") { |
| 558 m_binaryType = BinaryTypeBlob; | 568 if (m_binaryType != BinaryTypeBlob) { |
| 569 m_binaryType = BinaryTypeBlob; |
| 570 if (m_channel) |
| 571 m_channel->changeBinaryType(toChannelBinaryType(m_binaryType)); |
| 572 } |
| 559 return; | 573 return; |
| 560 } | 574 } |
| 561 if (binaryType == "arraybuffer") { | 575 if (binaryType == "arraybuffer") { |
| 562 m_binaryType = BinaryTypeArrayBuffer; | 576 if (m_binaryType != BinaryTypeArrayBuffer) { |
| 577 m_binaryType = BinaryTypeArrayBuffer; |
| 578 if (m_channel) |
| 579 m_channel->changeBinaryType(toChannelBinaryType(m_binaryType)); |
| 580 } |
| 563 return; | 581 return; |
| 564 } | 582 } |
| 565 ASSERT_NOT_REACHED(); | 583 ASSERT_NOT_REACHED(); |
| 566 } | 584 } |
| 567 | 585 |
| 568 const AtomicString& DOMWebSocket::interfaceName() const | 586 const AtomicString& DOMWebSocket::interfaceName() const |
| 569 { | 587 { |
| 570 return EventTargetNames::DOMWebSocket; | 588 return EventTargetNames::DOMWebSocket; |
| 571 } | 589 } |
| 572 | 590 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 621 | 639 |
| 622 void DOMWebSocket::didReceiveTextMessage(const String& msg) | 640 void DOMWebSocket::didReceiveTextMessage(const String& msg) |
| 623 { | 641 { |
| 624 WTF_LOG(Network, "WebSocket %p didReceiveTextMessage() Text message '%s'", t
his, msg.utf8().data()); | 642 WTF_LOG(Network, "WebSocket %p didReceiveTextMessage() Text message '%s'", t
his, msg.utf8().data()); |
| 625 if (m_state != OPEN) | 643 if (m_state != OPEN) |
| 626 return; | 644 return; |
| 627 Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType", W
ebSocketReceiveTypeString, WebSocketReceiveTypeMax); | 645 Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType", W
ebSocketReceiveTypeString, WebSocketReceiveTypeMax); |
| 628 m_eventQueue->dispatch(MessageEvent::create(msg, SecurityOrigin::create(m_ur
l)->toString())); | 646 m_eventQueue->dispatch(MessageEvent::create(msg, SecurityOrigin::create(m_ur
l)->toString())); |
| 629 } | 647 } |
| 630 | 648 |
| 631 void DOMWebSocket::didReceiveBinaryMessage(PassOwnPtr<Vector<char>> binaryData) | 649 void DOMWebSocket::didReceiveArrayBuffer(PassOwnPtr<Vector<char>> binaryData) |
| 632 { | 650 { |
| 633 WTF_LOG(Network, "WebSocket %p didReceiveBinaryMessage() %lu byte binary mes
sage", this, static_cast<unsigned long>(binaryData->size())); | 651 WTF_LOG(Network, "WebSocket %p didReceiveArrayBuffer() %lu byte binary messa
ge", this, static_cast<unsigned long>(binaryData->size())); |
| 634 switch (m_binaryType) { | 652 switch (m_binaryType) { |
| 635 case BinaryTypeBlob: { | 653 case BinaryTypeBlob: { |
| 636 size_t size = binaryData->size(); | 654 size_t size = binaryData->size(); |
| 637 RefPtr<RawData> rawData = RawData::create(); | 655 RefPtr<RawData> rawData = RawData::create(); |
| 638 binaryData->swap(*rawData->mutableData()); | 656 binaryData->swap(*rawData->mutableData()); |
| 639 OwnPtr<BlobData> blobData = BlobData::create(); | 657 OwnPtr<BlobData> blobData = BlobData::create(); |
| 640 blobData->appendData(rawData.release(), 0, BlobDataItem::toEndOfFile); | 658 blobData->appendData(rawData.release(), 0, BlobDataItem::toEndOfFile); |
| 641 Blob* blob = Blob::create(BlobDataHandle::create(blobData.release(), siz
e)); | 659 Blob* blob = Blob::create(BlobDataHandle::create(blobData.release(), siz
e)); |
| 642 Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType
", WebSocketReceiveTypeBlob, WebSocketReceiveTypeMax); | 660 Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType
", WebSocketReceiveTypeBlob, WebSocketReceiveTypeMax); |
| 643 m_eventQueue->dispatch(MessageEvent::create(blob, SecurityOrigin::create
(m_url)->toString())); | 661 m_eventQueue->dispatch(MessageEvent::create(blob, SecurityOrigin::create
(m_url)->toString())); |
| 644 break; | 662 break; |
| 645 } | 663 } |
| 646 | 664 |
| 647 case BinaryTypeArrayBuffer: | 665 case BinaryTypeArrayBuffer: |
| 648 RefPtr<DOMArrayBuffer> arrayBuffer = DOMArrayBuffer::create(binaryData->
data(), binaryData->size()); | 666 RefPtr<DOMArrayBuffer> arrayBuffer = DOMArrayBuffer::create(binaryData->
data(), binaryData->size()); |
| 649 Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType
", WebSocketReceiveTypeArrayBuffer, WebSocketReceiveTypeMax); | 667 Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType
", WebSocketReceiveTypeArrayBuffer, WebSocketReceiveTypeMax); |
| 650 m_eventQueue->dispatch(MessageEvent::create(arrayBuffer.release(), Secur
ityOrigin::create(m_url)->toString())); | 668 m_eventQueue->dispatch(MessageEvent::create(arrayBuffer.release(), Secur
ityOrigin::create(m_url)->toString())); |
| 651 break; | 669 break; |
| 652 } | 670 } |
| 653 } | 671 } |
| 654 | 672 |
| 673 void DOMWebSocket::didReceiveBlob(PassRefPtr<BlobDataHandle> blobDataHandle) |
| 674 { |
| 675 WTF_LOG(Network, "WebSocket %p didReceiveBlob() %llu byte binary message", t
his, blobDataHandle->size()); |
| 676 switch (m_binaryType) { |
| 677 case BinaryTypeBlob: { |
| 678 Blob* blob = Blob::create(blobDataHandle); |
| 679 Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType
", WebSocketReceiveTypeBlob, WebSocketReceiveTypeMax); |
| 680 m_eventQueue->dispatch(MessageEvent::create(blob, SecurityOrigin::create
(m_url)->toString())); |
| 681 break; |
| 682 } |
| 683 |
| 684 case BinaryTypeArrayBuffer: { |
| 685 // FIXME: Make this async. |
| 686 FileReaderLoader fileReaderLoader(FileReaderLoader::ReadAsArrayBuffer, n
ullptr); |
| 687 fileReaderLoader.start(executionContext(), blobDataHandle); |
| 688 RefPtr<DOMArrayBuffer> arrayBuffer = fileReaderLoader.arrayBufferResult(
); |
| 689 Platform::current()->histogramEnumeration("WebCore.WebSocket.ReceiveType
", WebSocketReceiveTypeArrayBuffer, WebSocketReceiveTypeMax); |
| 690 m_eventQueue->dispatch(MessageEvent::create(arrayBuffer.release(), Secur
ityOrigin::create(m_url)->toString())); |
| 691 break; |
| 692 } |
| 693 } |
| 694 } |
| 695 |
| 655 void DOMWebSocket::didError() | 696 void DOMWebSocket::didError() |
| 656 { | 697 { |
| 657 WTF_LOG(Network, "WebSocket %p didError()", this); | 698 WTF_LOG(Network, "WebSocket %p didError()", this); |
| 658 m_state = CLOSED; | 699 m_state = CLOSED; |
| 659 m_eventQueue->dispatch(Event::create(EventTypeNames::error)); | 700 m_eventQueue->dispatch(Event::create(EventTypeNames::error)); |
| 660 } | 701 } |
| 661 | 702 |
| 662 void DOMWebSocket::didConsumeBufferedAmount(uint64_t consumed) | 703 void DOMWebSocket::didConsumeBufferedAmount(uint64_t consumed) |
| 663 { | 704 { |
| 664 ASSERT(m_bufferedAmount >= consumed + m_consumedBufferedAmount); | 705 ASSERT(m_bufferedAmount >= consumed + m_consumedBufferedAmount); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 694 DEFINE_TRACE(DOMWebSocket) | 735 DEFINE_TRACE(DOMWebSocket) |
| 695 { | 736 { |
| 696 visitor->trace(m_channel); | 737 visitor->trace(m_channel); |
| 697 visitor->trace(m_eventQueue); | 738 visitor->trace(m_eventQueue); |
| 698 WebSocketChannelClient::trace(visitor); | 739 WebSocketChannelClient::trace(visitor); |
| 699 RefCountedGarbageCollectedEventTargetWithInlineData<DOMWebSocket>::trace(vis
itor); | 740 RefCountedGarbageCollectedEventTargetWithInlineData<DOMWebSocket>::trace(vis
itor); |
| 700 ActiveDOMObject::trace(visitor); | 741 ActiveDOMObject::trace(visitor); |
| 701 } | 742 } |
| 702 | 743 |
| 703 } // namespace blink | 744 } // namespace blink |
| OLD | NEW |