| 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 "chrome/browser/ui/webui/media_router/media_router_ui.h" | 5 #include "chrome/browser/ui/webui/media_router/media_router_ui.h" |
| 6 | 6 |
| 7 #include <utility> |
| 8 |
| 7 #include "base/bind.h" | 9 #include "base/bind.h" |
| 8 #include "base/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 11 #include "base/strings/utf_string_conversions.h" |
| 10 #include "chrome/browser/media/router/create_presentation_connection_request.h" | 12 #include "chrome/browser/media/router/create_presentation_connection_request.h" |
| 11 #include "chrome/browser/media/router/media_route.h" | 13 #include "chrome/browser/media/router/media_route.h" |
| 12 #include "chrome/browser/media/router/media_source_helper.h" | 14 #include "chrome/browser/media/router/media_source_helper.h" |
| 13 #include "chrome/browser/media/router/mock_media_router.h" | 15 #include "chrome/browser/media/router/mock_media_router.h" |
| 14 #include "chrome/browser/media/router/route_request_result.h" | 16 #include "chrome/browser/media/router/route_request_result.h" |
| 15 #include "chrome/browser/media/router/test_helper.h" | 17 #include "chrome/browser/media/router/test_helper.h" |
| 16 #include "chrome/browser/sessions/session_tab_helper.h" | 18 #include "chrome/browser/sessions/session_tab_helper.h" |
| (...skipping 13 matching lines...) Expand all Loading... |
| 30 | 32 |
| 31 using testing::_; | 33 using testing::_; |
| 32 using testing::AnyNumber; | 34 using testing::AnyNumber; |
| 33 using testing::Invoke; | 35 using testing::Invoke; |
| 34 using testing::SaveArg; | 36 using testing::SaveArg; |
| 35 using testing::Return; | 37 using testing::Return; |
| 36 | 38 |
| 37 namespace media_router { | 39 namespace media_router { |
| 38 | 40 |
| 39 class PresentationRequestCallbacks { | 41 class PresentationRequestCallbacks { |
| 40 public: | 42 public: |
| 41 explicit PresentationRequestCallbacks( | 43 explicit PresentationRequestCallbacks( |
| 42 const content::PresentationError& expected_error) | 44 const content::PresentationError& expected_error) |
| 43 : expected_error_(expected_error) {} | 45 : expected_error_(expected_error) {} |
| 44 | 46 |
| 45 void Success(const content::PresentationSessionInfo&, const MediaRoute::Id&) { | 47 void Success(const content::PresentationSessionInfo&, const MediaRoute::Id&) { |
| 46 } | 48 } |
| 47 | 49 |
| 48 void Error(const content::PresentationError& error) { | 50 void Error(const content::PresentationError& error) { |
| 49 EXPECT_EQ(expected_error_.error_type, error.error_type); | 51 EXPECT_EQ(expected_error_.error_type, error.error_type); |
| 50 EXPECT_EQ(expected_error_.message, error.message); | 52 EXPECT_EQ(expected_error_.message, error.message); |
| 51 } | 53 } |
| 52 | 54 |
| 53 private: | 55 private: |
| 54 content::PresentationError expected_error_; | 56 content::PresentationError expected_error_; |
| 55 }; | 57 }; |
| 56 | 58 |
| 57 class MockRoutesUpdatedCallback { | 59 class MockRoutesUpdatedCallback { |
| 58 public: | 60 public: |
| 59 MOCK_METHOD2(OnRoutesUpdated, | 61 MOCK_METHOD2(OnRoutesUpdated, |
| 60 void(const std::vector<MediaRoute>& routes, | 62 void(const std::vector<MediaRoute>& routes, |
| 61 const std::vector<MediaRoute::Id>& joinable_route_ids)); | 63 const std::vector<MediaRoute::Id>& joinable_route_ids)); |
| 62 }; | 64 }; |
| 63 | 65 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 86 return true; | 88 return true; |
| 87 })); | 89 })); |
| 88 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)) | 90 EXPECT_CALL(mock_router_, RegisterMediaRoutesObserver(_)) |
| 89 .Times(AnyNumber()); | 91 .Times(AnyNumber()); |
| 90 media_router_ui_->InitForTest(&mock_router_, initiator_.get(), | 92 media_router_ui_->InitForTest(&mock_router_, initiator_.get(), |
| 91 message_handler_.get(), | 93 message_handler_.get(), |
| 92 std::move(create_session_request_)); | 94 std::move(create_session_request_)); |
| 93 message_handler_->SetWebUIForTest(&web_ui_); | 95 message_handler_->SetWebUIForTest(&web_ui_); |
| 94 } | 96 } |
| 95 | 97 |
| 98 MediaSink CreateSinkCompatibleWithAllSources() { |
| 99 MediaSink sink("sinkId", "sinkName", MediaSink::GENERIC); |
| 100 for (auto* observer : media_sinks_observers_) |
| 101 observer->OnSinksUpdated({sink}, std::vector<GURL>()); |
| 102 return sink; |
| 103 } |
| 104 |
| 96 protected: | 105 protected: |
| 97 MockMediaRouter mock_router_; | 106 MockMediaRouter mock_router_; |
| 98 content::TestBrowserThreadBundle thread_bundle_; | 107 content::TestBrowserThreadBundle thread_bundle_; |
| 99 TestingProfile profile_; | 108 TestingProfile profile_; |
| 100 std::unique_ptr<content::WebContents> initiator_; | 109 std::unique_ptr<content::WebContents> initiator_; |
| 101 content::TestWebUI web_ui_; | 110 content::TestWebUI web_ui_; |
| 102 std::unique_ptr<content::WebContents> web_contents_; | 111 std::unique_ptr<content::WebContents> web_contents_; |
| 103 std::unique_ptr<CreatePresentationConnectionRequest> create_session_request_; | 112 std::unique_ptr<CreatePresentationConnectionRequest> create_session_request_; |
| 104 std::unique_ptr<MediaRouterUI> media_router_ui_; | 113 std::unique_ptr<MediaRouterUI> media_router_ui_; |
| 105 std::unique_ptr<MediaRouterWebUIMessageHandler> message_handler_; | 114 std::unique_ptr<MediaRouterWebUIMessageHandler> message_handler_; |
| 106 std::vector<MediaSinksObserver*> media_sinks_observers_; | 115 std::vector<MediaSinksObserver*> media_sinks_observers_; |
| 107 }; | 116 }; |
| 108 | 117 |
| 109 TEST_F(MediaRouterUITest, RouteCreationTimeoutForTab) { | 118 TEST_F(MediaRouterUITest, RouteCreationTimeoutForTab) { |
| 110 CreateMediaRouterUI(&profile_); | 119 CreateMediaRouterUI(&profile_); |
| 111 std::vector<MediaRouteResponseCallback> callbacks; | 120 std::vector<MediaRouteResponseCallback> callbacks; |
| 112 EXPECT_CALL( | 121 EXPECT_CALL( |
| 113 mock_router_, | 122 mock_router_, |
| 114 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(60), false)) | 123 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(60), false)) |
| 115 .WillOnce(SaveArg<4>(&callbacks)); | 124 .WillOnce(SaveArg<4>(&callbacks)); |
| 116 media_router_ui_->CreateRoute("sinkId", MediaCastMode::TAB_MIRROR); | 125 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(), |
| 126 MediaCastMode::TAB_MIRROR); |
| 117 | 127 |
| 118 std::string expected_title = l10n_util::GetStringUTF8( | 128 std::string expected_title = l10n_util::GetStringUTF8( |
| 119 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_TAB); | 129 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_TAB); |
| 120 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); | 130 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); |
| 121 std::unique_ptr<RouteRequestResult> result = | 131 std::unique_ptr<RouteRequestResult> result = |
| 122 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT); | 132 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT); |
| 123 for (const auto& callback : callbacks) | 133 for (const auto& callback : callbacks) |
| 124 callback.Run(*result); | 134 callback.Run(*result); |
| 125 } | 135 } |
| 126 | 136 |
| 127 TEST_F(MediaRouterUITest, RouteCreationTimeoutForDesktop) { | 137 TEST_F(MediaRouterUITest, RouteCreationTimeoutForDesktop) { |
| 128 CreateMediaRouterUI(&profile_); | 138 CreateMediaRouterUI(&profile_); |
| 129 std::vector<MediaRouteResponseCallback> callbacks; | 139 std::vector<MediaRouteResponseCallback> callbacks; |
| 130 EXPECT_CALL( | 140 EXPECT_CALL( |
| 131 mock_router_, | 141 mock_router_, |
| 132 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(120), false)) | 142 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(120), false)) |
| 133 .WillOnce(SaveArg<4>(&callbacks)); | 143 .WillOnce(SaveArg<4>(&callbacks)); |
| 134 media_router_ui_->CreateRoute("sinkId", MediaCastMode::DESKTOP_MIRROR); | 144 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(), |
| 145 MediaCastMode::DESKTOP_MIRROR); |
| 135 | 146 |
| 136 std::string expected_title = l10n_util::GetStringUTF8( | 147 std::string expected_title = l10n_util::GetStringUTF8( |
| 137 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_DESKTOP); | 148 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_DESKTOP); |
| 138 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); | 149 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); |
| 139 std::unique_ptr<RouteRequestResult> result = | 150 std::unique_ptr<RouteRequestResult> result = |
| 140 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT); | 151 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT); |
| 141 for (const auto& callback : callbacks) | 152 for (const auto& callback : callbacks) |
| 142 callback.Run(*result); | 153 callback.Run(*result); |
| 143 } | 154 } |
| 144 | 155 |
| 145 TEST_F(MediaRouterUITest, RouteCreationTimeoutForPresentation) { | 156 TEST_F(MediaRouterUITest, RouteCreationTimeoutForPresentation) { |
| 146 CreateMediaRouterUI(&profile_); | 157 CreateMediaRouterUI(&profile_); |
| 147 PresentationRequest presentation_request(RenderFrameHostId(0, 0), | 158 PresentationRequest presentation_request(RenderFrameHostId(0, 0), |
| 148 "https://presentationurl.fakeurl", | 159 {"https://presentationurl.fakeurl"}, |
| 149 GURL("https://frameurl.fakeurl")); | 160 GURL("https://frameurl.fakeurl")); |
| 150 media_router_ui_->OnDefaultPresentationChanged(presentation_request); | 161 media_router_ui_->OnDefaultPresentationChanged(presentation_request); |
| 151 std::vector<MediaRouteResponseCallback> callbacks; | 162 std::vector<MediaRouteResponseCallback> callbacks; |
| 152 EXPECT_CALL( | 163 EXPECT_CALL( |
| 153 mock_router_, | 164 mock_router_, |
| 154 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(20), false)) | 165 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(20), false)) |
| 155 .WillOnce(SaveArg<4>(&callbacks)); | 166 .WillOnce(SaveArg<4>(&callbacks)); |
| 156 media_router_ui_->CreateRoute("sinkId", MediaCastMode::DEFAULT); | 167 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(), |
| 168 MediaCastMode::DEFAULT); |
| 157 | 169 |
| 158 std::string expected_title = | 170 std::string expected_title = |
| 159 l10n_util::GetStringFUTF8(IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT, | 171 l10n_util::GetStringFUTF8(IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT, |
| 160 base::UTF8ToUTF16("frameurl.fakeurl")); | 172 base::UTF8ToUTF16("frameurl.fakeurl")); |
| 161 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); | 173 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); |
| 162 std::unique_ptr<RouteRequestResult> result = | 174 std::unique_ptr<RouteRequestResult> result = |
| 163 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT); | 175 RouteRequestResult::FromError("Timed out", RouteRequestResult::TIMED_OUT); |
| 164 for (const auto& callback : callbacks) | 176 for (const auto& callback : callbacks) |
| 165 callback.Run(*result); | 177 callback.Run(*result); |
| 166 } | 178 } |
| (...skipping 10 matching lines...) Expand all Loading... |
| 177 std::string expected_title = l10n_util::GetStringUTF8( | 189 std::string expected_title = l10n_util::GetStringUTF8( |
| 178 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_TAB); | 190 IDS_MEDIA_ROUTER_ISSUE_CREATE_ROUTE_TIMEOUT_FOR_TAB); |
| 179 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); | 191 EXPECT_CALL(mock_router_, AddIssue(IssueTitleEquals(expected_title))); |
| 180 sink_callback.Run("foundSinkId"); | 192 sink_callback.Run("foundSinkId"); |
| 181 } | 193 } |
| 182 | 194 |
| 183 TEST_F(MediaRouterUITest, RouteRequestFromIncognito) { | 195 TEST_F(MediaRouterUITest, RouteRequestFromIncognito) { |
| 184 CreateMediaRouterUI(profile_.GetOffTheRecordProfile()); | 196 CreateMediaRouterUI(profile_.GetOffTheRecordProfile()); |
| 185 | 197 |
| 186 PresentationRequest presentation_request( | 198 PresentationRequest presentation_request( |
| 187 RenderFrameHostId(0, 0), "https://fooUrl", GURL("https://frameUrl")); | 199 RenderFrameHostId(0, 0), {"https://fooUrl"}, GURL("https://frameUrl")); |
| 188 media_router_ui_->OnDefaultPresentationChanged(presentation_request); | 200 media_router_ui_->OnDefaultPresentationChanged(presentation_request); |
| 189 | 201 |
| 190 EXPECT_CALL( | 202 EXPECT_CALL( |
| 191 mock_router_, | 203 mock_router_, |
| 192 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(20), true)); | 204 CreateRoute(_, _, _, _, _, base::TimeDelta::FromSeconds(20), true)); |
| 193 media_router_ui_->CreateRoute("sinkId", MediaCastMode::DEFAULT); | 205 media_router_ui_->CreateRoute(CreateSinkCompatibleWithAllSources().id(), |
| 206 MediaCastMode::DEFAULT); |
| 194 } | 207 } |
| 195 | 208 |
| 196 TEST_F(MediaRouterUITest, SortedSinks) { | 209 TEST_F(MediaRouterUITest, SortedSinks) { |
| 197 CreateMediaRouterUI(&profile_); | 210 CreateMediaRouterUI(&profile_); |
| 198 std::vector<MediaSinkWithCastModes> unsorted_sinks; | 211 std::vector<MediaSinkWithCastModes> unsorted_sinks; |
| 199 std::string sink_id1("sink3"); | 212 std::string sink_id1("sink3"); |
| 200 std::string sink_name1("B sink"); | 213 std::string sink_name1("B sink"); |
| 201 MediaSinkWithCastModes sink1( | 214 MediaSinkWithCastModes sink1( |
| 202 MediaSink(sink_id1, sink_name1, MediaSink::IconType::CAST)); | 215 MediaSink(sink_id1, sink_name1, MediaSink::IconType::CAST)); |
| 203 unsorted_sinks.push_back(sink1); | 216 unsorted_sinks.push_back(sink1); |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 for (auto* observer : media_sinks_observers_) { | 516 for (auto* observer : media_sinks_observers_) { |
| 504 if (observer->source().id() == presentation_url) { | 517 if (observer->source().id() == presentation_url) { |
| 505 observer->OnSinksUpdated(sinks, origins); | 518 observer->OnSinksUpdated(sinks, origins); |
| 506 } | 519 } |
| 507 } | 520 } |
| 508 // Destroying the UI should return the expected error from above to the error | 521 // Destroying the UI should return the expected error from above to the error |
| 509 // callback. | 522 // callback. |
| 510 media_router_ui_.reset(); | 523 media_router_ui_.reset(); |
| 511 } | 524 } |
| 512 } // namespace media_router | 525 } // namespace media_router |
| OLD | NEW |