| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "modules/websockets/WebSocketChannel.h" | 5 #include "modules/websockets/WebSocketChannel.h" |
| 6 | 6 |
| 7 #include "core/dom/DOMArrayBuffer.h" | 7 #include "core/dom/DOMArrayBuffer.h" |
| 8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
| 9 #include "core/fileapi/Blob.h" | 9 #include "core/fileapi/Blob.h" |
| 10 #include "core/frame/ConsoleTypes.h" | 10 #include "core/frame/ConsoleTypes.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 { | 45 { |
| 46 return new testing::StrictMock<MockWebSocketChannelClient>(); | 46 return new testing::StrictMock<MockWebSocketChannelClient>(); |
| 47 } | 47 } |
| 48 | 48 |
| 49 MockWebSocketChannelClient() { } | 49 MockWebSocketChannelClient() { } |
| 50 | 50 |
| 51 ~MockWebSocketChannelClient() override { } | 51 ~MockWebSocketChannelClient() override { } |
| 52 | 52 |
| 53 MOCK_METHOD2(didConnect, void(const String&, const String&)); | 53 MOCK_METHOD2(didConnect, void(const String&, const String&)); |
| 54 MOCK_METHOD1(didReceiveTextMessage, void(const String&)); | 54 MOCK_METHOD1(didReceiveTextMessage, void(const String&)); |
| 55 void didReceiveBinaryMessage(PassOwnPtr<Vector<char>> payload) override | 55 void didReceiveArrayBuffer(PassOwnPtr<Vector<char>> payload) override |
| 56 { | 56 { |
| 57 didReceiveBinaryMessageMock(*payload); | 57 didReceiveArrayBufferMock(*payload); |
| 58 } | 58 } |
| 59 MOCK_METHOD1(didReceiveBinaryMessageMock, void(const Vector<char>&)); | 59 MOCK_METHOD1(didReceiveArrayBufferMock, void(const Vector<char>&)); |
| 60 void didReceiveBlob(PassRefPtr<BlobDataHandle> blobDataHandle) override |
| 61 { |
| 62 didReceiveBlobMock(*blobDataHandle); |
| 63 } |
| 64 MOCK_METHOD1(didReceiveBlobMock, void(const BlobDataHandle&)); |
| 60 MOCK_METHOD0(didError, void()); | 65 MOCK_METHOD0(didError, void()); |
| 61 MOCK_METHOD1(didConsumeBufferedAmount, void(uint64_t)); | 66 MOCK_METHOD1(didConsumeBufferedAmount, void(uint64_t)); |
| 62 MOCK_METHOD0(didStartClosingHandshake, void()); | 67 MOCK_METHOD0(didStartClosingHandshake, void()); |
| 63 MOCK_METHOD3(didClose, void(ClosingHandshakeCompletionStatus, unsigned short
, const String&)); | 68 MOCK_METHOD3(didClose, void(ClosingHandshakeCompletionStatus, unsigned short
, const String&)); |
| 64 | 69 |
| 65 DEFINE_INLINE_VIRTUAL_TRACE() | 70 DEFINE_INLINE_VIRTUAL_TRACE() |
| 66 { | 71 { |
| 67 WebSocketChannelClient::trace(visitor); | 72 WebSocketChannelClient::trace(visitor); |
| 68 } | 73 } |
| 69 | 74 |
| 70 }; | 75 }; |
| 71 | 76 |
| 72 class MockWebSocketHandle : public WebSocketHandle { | 77 class MockWebSocketHandle : public WebSocketHandle { |
| 73 public: | 78 public: |
| 74 static MockWebSocketHandle* create() | 79 static MockWebSocketHandle* create() |
| 75 { | 80 { |
| 76 return new testing::StrictMock<MockWebSocketHandle>(); | 81 return new testing::StrictMock<MockWebSocketHandle>(); |
| 77 } | 82 } |
| 78 | 83 |
| 79 MockWebSocketHandle() { } | 84 MockWebSocketHandle() { } |
| 80 | 85 |
| 81 ~MockWebSocketHandle() override { } | 86 ~MockWebSocketHandle() override { } |
| 82 | 87 |
| 83 MOCK_METHOD4(connect, void(const WebURL&, const WebVector<WebString>&, const
WebSecurityOrigin&, WebSocketHandleClient*)); | 88 MOCK_METHOD4(connect, void(const WebURL&, const WebVector<WebString>&, const
WebSecurityOrigin&, WebSocketHandleClient*)); |
| 84 MOCK_METHOD4(send, void(bool, WebSocketHandle::MessageType, const char*, siz
e_t)); | 89 MOCK_METHOD4(send, void(bool, WebSocketHandle::MessageType, const char*, siz
e_t)); |
| 85 MOCK_METHOD1(flowControl, void(int64_t)); | 90 MOCK_METHOD1(flowControl, void(int64_t)); |
| 86 MOCK_METHOD2(close, void(unsigned short, const WebString&)); | 91 MOCK_METHOD2(close, void(unsigned short, const WebString&)); |
| 92 MOCK_METHOD1(changeBinaryType, void(BinaryType)); |
| 93 MOCK_METHOD0(confirmBlob, void()); |
| 87 }; | 94 }; |
| 88 | 95 |
| 89 class DocumentWebSocketChannelTest : public ::testing::Test { | 96 class DocumentWebSocketChannelTest : public ::testing::Test { |
| 90 public: | 97 public: |
| 91 DocumentWebSocketChannelTest() | 98 DocumentWebSocketChannelTest() |
| 92 : m_pageHolder(DummyPageHolder::create()) | 99 : m_pageHolder(DummyPageHolder::create()) |
| 93 , m_channelClient(MockWebSocketChannelClient::create()) | 100 , m_channelClient(MockWebSocketChannelClient::create()) |
| 94 , m_handle(MockWebSocketHandle::create()) | 101 , m_handle(MockWebSocketHandle::create()) |
| 95 , m_channel(DocumentWebSocketChannel::create(&m_pageHolder->document(),
m_channelClient.get(), String(), 0, handle())) | 102 , m_channel(DocumentWebSocketChannel::create(&m_pageHolder->document(),
m_channelClient.get(), String(), 0, handle())) |
| 96 , m_sumOfConsumedBufferedAmount(0) | 103 , m_sumOfConsumedBufferedAmount(0) |
| (...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 515 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "\x90\xe0", 2); | 522 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "\x90\xe0", 2); |
| 516 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "\xa4", 1); | 523 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "\xa4", 1); |
| 517 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeC
ontinuation, "\x94", 1); | 524 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeC
ontinuation, "\x94", 1); |
| 518 } | 525 } |
| 519 | 526 |
| 520 TEST_F(DocumentWebSocketChannelTest, receiveBinary) | 527 TEST_F(DocumentWebSocketChannelTest, receiveBinary) |
| 521 { | 528 { |
| 522 connect(); | 529 connect(); |
| 523 Vector<char> fooVector; | 530 Vector<char> fooVector; |
| 524 fooVector.append("FOO", 3); | 531 fooVector.append("FOO", 3); |
| 525 EXPECT_CALL(*channelClient(), didReceiveBinaryMessageMock(fooVector)); | 532 EXPECT_CALL(*channelClient(), didReceiveArrayBufferMock(fooVector)); |
| 526 | 533 |
| 527 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "FOOx", 3); | 534 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "FOOx", 3); |
| 528 } | 535 } |
| 529 | 536 |
| 530 TEST_F(DocumentWebSocketChannelTest, receiveBinaryContinuation) | 537 TEST_F(DocumentWebSocketChannelTest, receiveBinaryContinuation) |
| 531 { | 538 { |
| 532 connect(); | 539 connect(); |
| 533 Vector<char> bazVector; | 540 Vector<char> bazVector; |
| 534 bazVector.append("BAZ", 3); | 541 bazVector.append("BAZ", 3); |
| 535 EXPECT_CALL(*channelClient(), didReceiveBinaryMessageMock(bazVector)); | 542 EXPECT_CALL(*channelClient(), didReceiveArrayBufferMock(bazVector)); |
| 536 | 543 |
| 537 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Binary, "Bx", 1); | 544 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Binary, "Bx", 1); |
| 538 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "Ax", 1); | 545 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "Ax", 1); |
| 539 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeC
ontinuation, "Zx", 1); | 546 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeC
ontinuation, "Zx", 1); |
| 540 } | 547 } |
| 541 | 548 |
| 542 TEST_F(DocumentWebSocketChannelTest, receiveBinaryWithNullBytes) | 549 TEST_F(DocumentWebSocketChannelTest, receiveBinaryWithNullBytes) |
| 543 { | 550 { |
| 544 connect(); | 551 connect(); |
| 545 { | 552 { |
| 546 InSequence s; | 553 InSequence s; |
| 547 { | 554 { |
| 548 Vector<char> v; | 555 Vector<char> v; |
| 549 v.append("\0AR", 3); | 556 v.append("\0AR", 3); |
| 550 EXPECT_CALL(*channelClient(), didReceiveBinaryMessageMock(v)); | 557 EXPECT_CALL(*channelClient(), didReceiveArrayBufferMock(v)); |
| 551 } | 558 } |
| 552 { | 559 { |
| 553 Vector<char> v; | 560 Vector<char> v; |
| 554 v.append("B\0Z", 3); | 561 v.append("B\0Z", 3); |
| 555 EXPECT_CALL(*channelClient(), didReceiveBinaryMessageMock(v)); | 562 EXPECT_CALL(*channelClient(), didReceiveArrayBufferMock(v)); |
| 556 } | 563 } |
| 557 { | 564 { |
| 558 Vector<char> v; | 565 Vector<char> v; |
| 559 v.append("QU\0", 3); | 566 v.append("QU\0", 3); |
| 560 EXPECT_CALL(*channelClient(), didReceiveBinaryMessageMock(v)); | 567 EXPECT_CALL(*channelClient(), didReceiveArrayBufferMock(v)); |
| 561 } | 568 } |
| 562 { | 569 { |
| 563 Vector<char> v; | 570 Vector<char> v; |
| 564 v.append("\0\0\0", 3); | 571 v.append("\0\0\0", 3); |
| 565 EXPECT_CALL(*channelClient(), didReceiveBinaryMessageMock(v)); | 572 EXPECT_CALL(*channelClient(), didReceiveArrayBufferMock(v)); |
| 566 } | 573 } |
| 567 } | 574 } |
| 568 | 575 |
| 569 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "\0AR", 3); | 576 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "\0AR", 3); |
| 570 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "B\0Z", 3); | 577 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "B\0Z", 3); |
| 571 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "QU\0", 3); | 578 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "QU\0", 3); |
| 572 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "\0\0\0", 3); | 579 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "\0\0\0", 3); |
| 573 } | 580 } |
| 574 | 581 |
| 575 TEST_F(DocumentWebSocketChannelTest, receiveBinaryNonLatin1UTF8) | 582 TEST_F(DocumentWebSocketChannelTest, receiveBinaryNonLatin1UTF8) |
| 576 { | 583 { |
| 577 connect(); | 584 connect(); |
| 578 Vector<char> v; | 585 Vector<char> v; |
| 579 v.append("\xe7\x8b\x90\xe0\xa4\x94", 6); | 586 v.append("\xe7\x8b\x90\xe0\xa4\x94", 6); |
| 580 EXPECT_CALL(*channelClient(), didReceiveBinaryMessageMock(v)); | 587 EXPECT_CALL(*channelClient(), didReceiveArrayBufferMock(v)); |
| 581 | 588 |
| 582 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "\xe7\x8b\x90\xe0\xa4\x94", 6); | 589 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "\xe7\x8b\x90\xe0\xa4\x94", 6); |
| 583 } | 590 } |
| 584 | 591 |
| 585 TEST_F(DocumentWebSocketChannelTest, receiveBinaryNonLatin1UTF8Continuation) | 592 TEST_F(DocumentWebSocketChannelTest, receiveBinaryNonLatin1UTF8Continuation) |
| 586 { | 593 { |
| 587 connect(); | 594 connect(); |
| 588 Vector<char> v; | 595 Vector<char> v; |
| 589 v.append("\xe7\x8b\x90\xe0\xa4\x94", 6); | 596 v.append("\xe7\x8b\x90\xe0\xa4\x94", 6); |
| 590 EXPECT_CALL(*channelClient(), didReceiveBinaryMessageMock(v)); | 597 EXPECT_CALL(*channelClient(), didReceiveArrayBufferMock(v)); |
| 591 | 598 |
| 592 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Binary, "\xe7\x8b", 2); | 599 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Binary, "\xe7\x8b", 2); |
| 593 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "\x90\xe0", 2); | 600 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "\x90\xe0", 2); |
| 594 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "\xa4", 1); | 601 handleClient()->didReceiveData(handle(), false, WebSocketHandle::MessageType
Continuation, "\xa4", 1); |
| 595 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeC
ontinuation, "\x94", 1); | 602 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeC
ontinuation, "\x94", 1); |
| 596 } | 603 } |
| 597 | 604 |
| 598 TEST_F(DocumentWebSocketChannelTest, receiveBinaryNonUTF8) | 605 TEST_F(DocumentWebSocketChannelTest, receiveBinaryNonUTF8) |
| 599 { | 606 { |
| 600 connect(); | 607 connect(); |
| 601 Vector<char> v; | 608 Vector<char> v; |
| 602 v.append("\x80\xff", 2); | 609 v.append("\x80\xff", 2); |
| 603 EXPECT_CALL(*channelClient(), didReceiveBinaryMessageMock(v)); | 610 EXPECT_CALL(*channelClient(), didReceiveArrayBufferMock(v)); |
| 604 | 611 |
| 605 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "\x80\xff", 2); | 612 handleClient()->didReceiveData(handle(), true, WebSocketHandle::MessageTypeB
inary, "\x80\xff", 2); |
| 606 } | 613 } |
| 607 | 614 |
| 608 TEST_F(DocumentWebSocketChannelTest, closeFromBrowser) | 615 TEST_F(DocumentWebSocketChannelTest, closeFromBrowser) |
| 609 { | 616 { |
| 610 connect(); | 617 connect(); |
| 611 Checkpoint checkpoint; | 618 Checkpoint checkpoint; |
| 612 { | 619 { |
| 613 InSequence s; | 620 InSequence s; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 679 EXPECT_CALL(*channelClient(), didError()); | 686 EXPECT_CALL(*channelClient(), didError()); |
| 680 EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHa
ndshakeIncomplete, WebSocketChannel::CloseEventCodeAbnormalClosure, String())); | 687 EXPECT_CALL(*channelClient(), didClose(WebSocketChannelClient::ClosingHa
ndshakeIncomplete, WebSocketChannel::CloseEventCodeAbnormalClosure, String())); |
| 681 } | 688 } |
| 682 | 689 |
| 683 channel()->fail("fail message from WebSocket", ErrorMessageLevel, "sourceURL
", 1234); | 690 channel()->fail("fail message from WebSocket", ErrorMessageLevel, "sourceURL
", 1234); |
| 684 } | 691 } |
| 685 | 692 |
| 686 } // namespace | 693 } // namespace |
| 687 | 694 |
| 688 } // namespace blink | 695 } // namespace blink |
| OLD | NEW |