Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "content/browser/presentation/presentation_service_impl.h" | 5 #include "content/browser/presentation/presentation_service_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 53 const char kPresentationId[] = "presentationId"; | 53 const char kPresentationId[] = "presentationId"; |
| 54 const char kPresentationUrl1[] = "http://foo.com/index.html"; | 54 const char kPresentationUrl1[] = "http://foo.com/index.html"; |
| 55 const char kPresentationUrl2[] = "http://example.com/index.html"; | 55 const char kPresentationUrl2[] = "http://example.com/index.html"; |
| 56 const char kPresentationUrl3[] = "http://example.net/index.html"; | 56 const char kPresentationUrl3[] = "http://example.net/index.html"; |
| 57 | 57 |
| 58 void DoNothing(blink::mojom::PresentationSessionInfoPtr info, | 58 void DoNothing(blink::mojom::PresentationSessionInfoPtr info, |
| 59 blink::mojom::PresentationErrorPtr error) {} | 59 blink::mojom::PresentationErrorPtr error) {} |
| 60 | 60 |
| 61 } // namespace | 61 } // namespace |
| 62 | 62 |
| 63 class MockPresentationServiceDelegate : public PresentationServiceDelegate { | 63 class MockPresentationServiceDelegate |
| 64 : public ControllerPresentationServiceDelegate { | |
| 64 public: | 65 public: |
| 65 MOCK_METHOD3(AddObserver, | 66 MOCK_METHOD3(AddObserver, |
| 66 void(int render_process_id, | 67 void(int render_process_id, |
| 67 int render_frame_id, | 68 int render_frame_id, |
| 68 PresentationServiceDelegate::Observer* observer)); | 69 PresentationServiceDelegateBase::Observer* observer)); |
| 69 MOCK_METHOD2(RemoveObserver, | 70 MOCK_METHOD2(RemoveObserver, |
| 70 void(int render_process_id, int render_frame_id)); | 71 void(int render_process_id, int render_frame_id)); |
| 71 | 72 |
| 72 bool AddScreenAvailabilityListener( | 73 bool AddScreenAvailabilityListener( |
| 73 int render_process_id, | 74 int render_process_id, |
| 74 int routing_id, | 75 int routing_id, |
| 75 PresentationScreenAvailabilityListener* listener) override { | 76 PresentationScreenAvailabilityListener* listener) override { |
| 76 if (!screen_availability_listening_supported_) | 77 if (!screen_availability_listening_supported_) |
| 77 listener->OnScreenAvailabilityNotSupported(); | 78 listener->OnScreenAvailabilityNotSupported(); |
| 78 | 79 |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 132 SendMessageRawPtr(render_process_id, render_frame_id, session, | 133 SendMessageRawPtr(render_process_id, render_frame_id, session, |
| 133 message_request.release(), send_message_cb); | 134 message_request.release(), send_message_cb); |
| 134 } | 135 } |
| 135 MOCK_METHOD4(ListenForConnectionStateChange, | 136 MOCK_METHOD4(ListenForConnectionStateChange, |
| 136 void(int render_process_id, | 137 void(int render_process_id, |
| 137 int render_frame_id, | 138 int render_frame_id, |
| 138 const content::PresentationSessionInfo& connection, | 139 const content::PresentationSessionInfo& connection, |
| 139 const content::PresentationConnectionStateChangedCallback& | 140 const content::PresentationConnectionStateChangedCallback& |
| 140 state_changed_cb)); | 141 state_changed_cb)); |
| 141 | 142 |
| 143 void ConnectToOffscreenPresentation( | |
| 144 int render_process_id, | |
| 145 int render_frame_id, | |
| 146 const PresentationSessionInfo& session, | |
| 147 PresentationConnectionPtr connection) override { | |
| 148 RegisterOffscreenPresentationConnectionRaw( | |
| 149 render_process_id, render_frame_id, session, connection.get()); | |
| 150 } | |
| 151 | |
| 152 MOCK_METHOD4(RegisterOffscreenPresentationConnectionRaw, | |
| 153 void(int render_process_id, | |
| 154 int render_frame_id, | |
| 155 const PresentationSessionInfo& session, | |
| 156 blink::mojom::PresentationConnection* connection)); | |
| 157 | |
| 142 void set_screen_availability_listening_supported(bool value) { | 158 void set_screen_availability_listening_supported(bool value) { |
| 143 screen_availability_listening_supported_ = value; | 159 screen_availability_listening_supported_ = value; |
| 144 } | 160 } |
| 145 | 161 |
| 146 private: | 162 private: |
| 147 bool screen_availability_listening_supported_ = true; | 163 bool screen_availability_listening_supported_ = true; |
| 148 }; | 164 }; |
| 149 | 165 |
| 166 class MockReceiverPresentationServiceDelegate | |
| 167 : public ReceiverPresentationServiceDelegate { | |
| 168 public: | |
| 169 MOCK_METHOD3(AddObserver, | |
| 170 void(int render_process_id, | |
| 171 int render_frame_id, | |
| 172 PresentationServiceDelegateBase::Observer* observer)); | |
| 173 MOCK_METHOD2(RemoveObserver, | |
| 174 void(int render_process_id, int render_frame_id)); | |
| 175 MOCK_METHOD2(Reset, void(int render_process_id, int routing_id)); | |
| 176 MOCK_METHOD1(RegisterReceiverConnectionAvailableCallback, | |
| 177 void(const content::ReceiverConnectionAvailableCallback&)); | |
| 178 }; | |
| 179 | |
| 180 class MockPresentationConnection : public blink::mojom::PresentationConnection { | |
| 181 public: | |
| 182 void SetTargetConnection( | |
| 183 blink::mojom::PresentationConnectionPtr connection) override { | |
| 184 SetTargetConnection(*connection); | |
| 185 } | |
| 186 MOCK_METHOD1(SetTargetConnection, | |
| 187 void(blink::mojom::PresentationConnection& connection)); | |
| 188 | |
| 189 void OnMessage(blink::mojom::SessionMessagePtr message) override { | |
| 190 OnConnectionMessageReceived(*message); | |
| 191 } | |
| 192 MOCK_METHOD1(OnConnectionMessageReceived, | |
| 193 void(const blink::mojom::SessionMessage& message)); | |
| 194 }; | |
| 195 | |
| 150 class MockPresentationServiceClient | 196 class MockPresentationServiceClient |
| 151 : public blink::mojom::PresentationServiceClient { | 197 : public blink::mojom::PresentationServiceClient { |
| 152 public: | 198 public: |
| 153 MOCK_METHOD2(OnScreenAvailabilityUpdated, | 199 MOCK_METHOD2(OnScreenAvailabilityUpdated, |
| 154 void(const GURL& url, bool available)); | 200 void(const GURL& url, bool available)); |
| 155 void OnConnectionStateChanged( | 201 void OnConnectionStateChanged( |
| 156 blink::mojom::PresentationSessionInfoPtr connection, | 202 blink::mojom::PresentationSessionInfoPtr connection, |
| 157 blink::mojom::PresentationConnectionState new_state) override { | 203 blink::mojom::PresentationConnectionState new_state) override { |
| 158 OnConnectionStateChanged(*connection, new_state); | 204 OnConnectionStateChanged(*connection, new_state); |
| 159 } | 205 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 207 presentation_url3_(GURL(kPresentationUrl3)) {} | 253 presentation_url3_(GURL(kPresentationUrl3)) {} |
| 208 | 254 |
| 209 void SetUp() override { | 255 void SetUp() override { |
| 210 RenderViewHostImplTestHarness::SetUp(); | 256 RenderViewHostImplTestHarness::SetUp(); |
| 211 | 257 |
| 212 auto request = mojo::GetProxy(&service_ptr_); | 258 auto request = mojo::GetProxy(&service_ptr_); |
| 213 EXPECT_CALL(mock_delegate_, AddObserver(_, _, _)).Times(1); | 259 EXPECT_CALL(mock_delegate_, AddObserver(_, _, _)).Times(1); |
| 214 TestRenderFrameHost* render_frame_host = contents()->GetMainFrame(); | 260 TestRenderFrameHost* render_frame_host = contents()->GetMainFrame(); |
| 215 render_frame_host->InitializeRenderFrameIfNeeded(); | 261 render_frame_host->InitializeRenderFrameIfNeeded(); |
| 216 service_impl_.reset(new PresentationServiceImpl( | 262 service_impl_.reset(new PresentationServiceImpl( |
| 217 render_frame_host, contents(), &mock_delegate_)); | 263 render_frame_host, contents(), &mock_delegate_, nullptr)); |
| 218 service_impl_->Bind(std::move(request)); | 264 service_impl_->Bind(std::move(request)); |
| 219 | 265 |
| 220 blink::mojom::PresentationServiceClientPtr client_ptr; | 266 blink::mojom::PresentationServiceClientPtr client_ptr; |
| 221 client_binding_.reset( | 267 client_binding_.reset( |
| 222 new mojo::Binding<blink::mojom::PresentationServiceClient>( | 268 new mojo::Binding<blink::mojom::PresentationServiceClient>( |
| 223 &mock_client_, mojo::GetProxy(&client_ptr))); | 269 &mock_client_, mojo::GetProxy(&client_ptr))); |
| 224 service_impl_->SetClient(std::move(client_ptr)); | 270 service_impl_->SetClient(std::move(client_ptr)); |
| 225 | 271 |
| 226 presentation_urls_.push_back(presentation_url1_); | 272 presentation_urls_.push_back(presentation_url1_); |
| 227 presentation_urls_.push_back(presentation_url2_); | 273 presentation_urls_.push_back(presentation_url2_); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 367 base::RunLoop run_loop; | 413 base::RunLoop run_loop; |
| 368 EXPECT_CALL(mock_client_, MessagesReceived()) | 414 EXPECT_CALL(mock_client_, MessagesReceived()) |
| 369 .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); | 415 .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); |
| 370 message_cb.Run(std::move(messages), pass_ownership); | 416 message_cb.Run(std::move(messages), pass_ownership); |
| 371 run_loop.Run(); | 417 run_loop.Run(); |
| 372 } | 418 } |
| 373 ExpectSessionMessages(expected_msgs, mock_client_.messages_received_); | 419 ExpectSessionMessages(expected_msgs, mock_client_.messages_received_); |
| 374 } | 420 } |
| 375 | 421 |
| 376 MockPresentationServiceDelegate mock_delegate_; | 422 MockPresentationServiceDelegate mock_delegate_; |
| 423 MockReceiverPresentationServiceDelegate mock_receiver_delegate_; | |
| 377 | 424 |
| 378 std::unique_ptr<PresentationServiceImpl> service_impl_; | 425 std::unique_ptr<PresentationServiceImpl> service_impl_; |
| 379 mojo::InterfacePtr<blink::mojom::PresentationService> service_ptr_; | 426 mojo::InterfacePtr<blink::mojom::PresentationService> service_ptr_; |
| 380 | 427 |
| 381 MockPresentationServiceClient mock_client_; | 428 MockPresentationServiceClient mock_client_; |
| 382 std::unique_ptr<mojo::Binding<blink::mojom::PresentationServiceClient>> | 429 std::unique_ptr<mojo::Binding<blink::mojom::PresentationServiceClient>> |
| 383 client_binding_; | 430 client_binding_; |
| 384 | 431 |
| 385 base::Closure run_loop_quit_closure_; | 432 base::Closure run_loop_quit_closure_; |
| 386 | 433 |
| (...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 654 std::vector<uint8_t> binary_data(3, '\1'); | 701 std::vector<uint8_t> binary_data(3, '\1'); |
| 655 RunListenForSessionMessages(text_msg, binary_data, false); | 702 RunListenForSessionMessages(text_msg, binary_data, false); |
| 656 } | 703 } |
| 657 | 704 |
| 658 TEST_F(PresentationServiceImplTest, ListenForSessionMessagesWithEmptyMsg) { | 705 TEST_F(PresentationServiceImplTest, ListenForSessionMessagesWithEmptyMsg) { |
| 659 std::string text_msg(""); | 706 std::string text_msg(""); |
| 660 std::vector<uint8_t> binary_data; | 707 std::vector<uint8_t> binary_data; |
| 661 RunListenForSessionMessages(text_msg, binary_data, false); | 708 RunListenForSessionMessages(text_msg, binary_data, false); |
| 662 } | 709 } |
| 663 | 710 |
| 711 TEST_F(PresentationServiceImplTest, SetPresentationConnection) { | |
| 712 blink::mojom::PresentationSessionInfoPtr session( | |
| 713 blink::mojom::PresentationSessionInfo::New()); | |
| 714 session->url = GURL(kPresentationUrl1); | |
| 715 session->id = kPresentationId; | |
| 716 | |
| 717 blink::mojom::PresentationConnectionPtr connection; | |
| 718 | |
| 719 MockPresentationConnection mock_presentation_connection; | |
| 720 mojo::Binding<blink::mojom::PresentationConnection> binding( | |
| 721 &mock_presentation_connection, mojo::GetProxy(&connection)); | |
| 722 | |
| 723 EXPECT_CALL(mock_delegate_, | |
| 724 RegisterOffscreenPresentationConnectionRaw(_, _, _, _)) | |
|
mark a. foltz
2016/11/08 23:40:52
Can you verify the contents of |session| here?
zhaobin
2016/11/10 04:14:00
Done.
| |
| 725 .Times(1); | |
| 726 | |
| 727 service_impl_->SetPresentationConnection(std::move(session), | |
| 728 std::move(connection)); | |
| 729 } | |
| 730 | |
| 731 TEST_F(PresentationServiceImplTest, ReceiverPresentationServiceDelegate) { | |
| 732 MockReceiverPresentationServiceDelegate mock_receiver_delegate; | |
| 733 | |
| 734 PresentationServiceImpl service_impl(contents()->GetMainFrame(), contents(), | |
| 735 &mock_delegate_, | |
|
mark a. foltz
2016/11/08 23:40:52
Should the controller delegate be nullptr here?
zhaobin
2016/11/10 04:14:00
Done.
| |
| 736 &mock_receiver_delegate); | |
| 737 | |
| 738 EXPECT_CALL(mock_receiver_delegate, | |
| 739 RegisterReceiverConnectionAvailableCallback(_)); | |
|
mark a. foltz
2016/11/08 23:40:52
Nit: verify that the callback registered is not nu
zhaobin
2016/11/10 04:14:00
Done.
| |
| 740 | |
| 741 blink::mojom::PresentationServiceClientPtr client_ptr; | |
| 742 client_binding_.reset( | |
| 743 new mojo::Binding<blink::mojom::PresentationServiceClient>( | |
| 744 &mock_client_, mojo::GetProxy(&client_ptr))); | |
| 745 // If receiver_delegate_ != nullptr, set controller_delegate = nullptr in | |
| 746 // CreateMojoService(). | |
| 747 service_impl.controller_delegate_ = nullptr; | |
| 748 service_impl.SetClient(std::move(client_ptr)); | |
| 749 | |
| 750 // NO-OP for ControllerPresentationServiceDelegate API functions | |
| 751 EXPECT_CALL(mock_delegate_, ListenForSessionMessages(_, _, _, _)).Times(0); | |
| 752 | |
| 753 blink::mojom::PresentationSessionInfoPtr session( | |
| 754 blink::mojom::PresentationSessionInfo::New()); | |
| 755 session->url = GURL(kPresentationUrl1); | |
| 756 session->id = kPresentationId; | |
| 757 | |
| 758 service_impl.ListenForSessionMessages(std::move(session)); | |
| 759 } | |
| 760 | |
| 664 TEST_F(PresentationServiceImplTest, StartSessionInProgress) { | 761 TEST_F(PresentationServiceImplTest, StartSessionInProgress) { |
| 665 EXPECT_CALL(mock_delegate_, StartSession(_, _, presentation_urls_, _, _)) | 762 EXPECT_CALL(mock_delegate_, StartSession(_, _, presentation_urls_, _, _)) |
| 666 .Times(1); | 763 .Times(1); |
| 667 service_ptr_->StartSession(presentation_urls_, base::Bind(&DoNothing)); | 764 service_ptr_->StartSession(presentation_urls_, base::Bind(&DoNothing)); |
| 668 | 765 |
| 669 // This request should fail immediately, since there is already a StartSession | 766 // This request should fail immediately, since there is already a StartSession |
| 670 // in progress. | 767 // in progress. |
| 671 service_ptr_->StartSession( | 768 service_ptr_->StartSession( |
| 672 presentation_urls_, | 769 presentation_urls_, |
| 673 base::Bind(&PresentationServiceImplTest::ExpectNewSessionCallbackError, | 770 base::Bind(&PresentationServiceImplTest::ExpectNewSessionCallbackError, |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 852 mock_delegate_.set_screen_availability_listening_supported(false); | 949 mock_delegate_.set_screen_availability_listening_supported(false); |
| 853 base::RunLoop run_loop; | 950 base::RunLoop run_loop; |
| 854 EXPECT_CALL(mock_client_, | 951 EXPECT_CALL(mock_client_, |
| 855 OnScreenAvailabilityNotSupported(presentation_url1_)) | 952 OnScreenAvailabilityNotSupported(presentation_url1_)) |
| 856 .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); | 953 .WillOnce(InvokeWithoutArgs(&run_loop, &base::RunLoop::Quit)); |
| 857 ListenForScreenAvailabilityAndWait(presentation_url1_, false); | 954 ListenForScreenAvailabilityAndWait(presentation_url1_, false); |
| 858 run_loop.Run(); | 955 run_loop.Run(); |
| 859 } | 956 } |
| 860 | 957 |
| 861 } // namespace content | 958 } // namespace content |
| OLD | NEW |