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 |