| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/renderer/media/user_media_client_impl.h" | 5 #include "content/renderer/media/user_media_client_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 | 38 |
| 39 blink::WebMediaConstraints CreateDefaultConstraints() { | 39 blink::WebMediaConstraints CreateDefaultConstraints() { |
| 40 MockConstraintFactory factory; | 40 MockConstraintFactory factory; |
| 41 factory.AddAdvanced(); | 41 factory.AddAdvanced(); |
| 42 return factory.CreateWebMediaConstraints(); | 42 return factory.CreateWebMediaConstraints(); |
| 43 } | 43 } |
| 44 | 44 |
| 45 blink::WebMediaConstraints CreateDeviceConstraints( | 45 blink::WebMediaConstraints CreateDeviceConstraints( |
| 46 const char* basic_exact_value, | 46 const char* basic_exact_value, |
| 47 const char* basic_ideal_value = nullptr, | 47 const char* basic_ideal_value = nullptr, |
| 48 const char* advanced_exact_value = nullptr, | 48 const char* advanced_exact_value = nullptr) { |
| 49 const char* advanced_ideal_value = nullptr) { | |
| 50 MockConstraintFactory factory; | 49 MockConstraintFactory factory; |
| 51 blink::WebMediaTrackConstraintSet basic; | 50 blink::WebMediaTrackConstraintSet basic; |
| 52 if (basic_exact_value) { | 51 if (basic_exact_value) { |
| 53 factory.basic().deviceId.setExact( | 52 factory.basic().deviceId.setExact( |
| 54 blink::WebString::fromUTF8(basic_exact_value)); | 53 blink::WebString::fromUTF8(basic_exact_value)); |
| 55 } | 54 } |
| 56 if (basic_ideal_value) { | 55 if (basic_ideal_value) { |
| 57 blink::WebString value = blink::WebString::fromUTF8(basic_ideal_value); | 56 blink::WebString value = blink::WebString::fromUTF8(basic_ideal_value); |
| 58 factory.basic().deviceId.setIdeal( | 57 factory.basic().deviceId.setIdeal( |
| 59 blink::WebVector<blink::WebString>(&value, 1)); | 58 blink::WebVector<blink::WebString>(&value, 1)); |
| 60 } | 59 } |
| 61 | 60 |
| 62 auto& advanced = factory.AddAdvanced(); | 61 auto& advanced = factory.AddAdvanced(); |
| 63 if (advanced_exact_value) { | 62 if (advanced_exact_value) { |
| 64 blink::WebString value = blink::WebString::fromUTF8(advanced_exact_value); | 63 blink::WebString value = blink::WebString::fromUTF8(advanced_exact_value); |
| 65 advanced.deviceId.setExact(value); | 64 advanced.deviceId.setExact(value); |
| 66 } | 65 } |
| 67 if (advanced_ideal_value) { | 66 |
| 68 blink::WebString value = blink::WebString::fromUTF8(advanced_ideal_value); | 67 return factory.CreateWebMediaConstraints(); |
| 69 advanced.deviceId.setIdeal(blink::WebVector<blink::WebString>(&value, 1)); | 68 } |
| 69 |
| 70 blink::WebMediaConstraints CreateFacingModeConstraints( |
| 71 const char* basic_exact_value, |
| 72 const char* basic_ideal_value = nullptr, |
| 73 const char* advanced_exact_value = nullptr) { |
| 74 MockConstraintFactory factory; |
| 75 if (basic_exact_value) { |
| 76 factory.basic().facingMode.setExact( |
| 77 blink::WebString::fromUTF8(basic_exact_value)); |
| 78 } |
| 79 if (basic_ideal_value) { |
| 80 blink::WebString value = blink::WebString::fromUTF8(basic_ideal_value); |
| 81 factory.basic().deviceId.setIdeal( |
| 82 blink::WebVector<blink::WebString>(&value, 1)); |
| 83 } |
| 84 |
| 85 auto& advanced = factory.AddAdvanced(); |
| 86 if (advanced_exact_value) { |
| 87 blink::WebString value = blink::WebString::fromUTF8(advanced_exact_value); |
| 88 advanced.deviceId.setExact(value); |
| 70 } | 89 } |
| 71 | 90 |
| 72 return factory.CreateWebMediaConstraints(); | 91 return factory.CreateWebMediaConstraints(); |
| 73 } | 92 } |
| 74 | 93 |
| 75 class MockMediaStreamVideoCapturerSource : public MockMediaStreamVideoSource { | 94 class MockMediaStreamVideoCapturerSource : public MockMediaStreamVideoSource { |
| 76 public: | 95 public: |
| 77 MockMediaStreamVideoCapturerSource( | 96 MockMediaStreamVideoCapturerSource( |
| 78 const StreamDeviceInfo& device, | 97 const StreamDeviceInfo& device, |
| 79 const SourceStoppedCallback& stop_callback, | 98 const SourceStoppedCallback& stop_callback, |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 result[MEDIA_DEVICE_TYPE_VIDEO_INPUT].push_back( | 132 result[MEDIA_DEVICE_TYPE_VIDEO_INPUT].push_back( |
| 114 MediaDeviceInfo(kFakeVideoInputDeviceId2, "Fake Video Input 2", "")); | 133 MediaDeviceInfo(kFakeVideoInputDeviceId2, "Fake Video Input 2", "")); |
| 115 } | 134 } |
| 116 if (request_audio_output) { | 135 if (request_audio_output) { |
| 117 result[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].push_back(MediaDeviceInfo( | 136 result[MEDIA_DEVICE_TYPE_AUDIO_OUTPUT].push_back(MediaDeviceInfo( |
| 118 kFakeAudioOutputDeviceId1, "Fake Audio Input 1", "fake_group 1")); | 137 kFakeAudioOutputDeviceId1, "Fake Audio Input 1", "fake_group 1")); |
| 119 } | 138 } |
| 120 callback.Run(result); | 139 callback.Run(result); |
| 121 } | 140 } |
| 122 | 141 |
| 142 void GetVideoInputCapabilities( |
| 143 const url::Origin& security_origin, |
| 144 const GetVideoInputCapabilitiesCallback& client_callback) override { |
| 145 ::mojom::VideoInputDeviceCapabilitiesPtr device = |
| 146 ::mojom::VideoInputDeviceCapabilities::New(); |
| 147 device->device_id = kFakeVideoInputDeviceId1; |
| 148 device->facing_mode = ::mojom::FacingMode::USER; |
| 149 device->formats.push_back(media::VideoCaptureFormat( |
| 150 gfx::Size(640, 480), 30.0f, media::PIXEL_FORMAT_I420)); |
| 151 std::vector<::mojom::VideoInputDeviceCapabilitiesPtr> result; |
| 152 result.push_back(std::move(device)); |
| 153 |
| 154 device = ::mojom::VideoInputDeviceCapabilities::New(); |
| 155 device->device_id = kFakeVideoInputDeviceId2; |
| 156 device->facing_mode = ::mojom::FacingMode::ENVIRONMENT; |
| 157 device->formats.push_back(media::VideoCaptureFormat( |
| 158 gfx::Size(640, 480), 30.0f, media::PIXEL_FORMAT_I420)); |
| 159 result.push_back(std::move(device)); |
| 160 |
| 161 client_callback.Run(std::move(result)); |
| 162 } |
| 163 |
| 123 MOCK_METHOD3(SubscribeDeviceChangeNotifications, | 164 MOCK_METHOD3(SubscribeDeviceChangeNotifications, |
| 124 void(MediaDeviceType type, | 165 void(MediaDeviceType type, |
| 125 uint32_t subscription_id, | 166 uint32_t subscription_id, |
| 126 const url::Origin& security_origin)); | 167 const url::Origin& security_origin)); |
| 127 MOCK_METHOD2(UnsubscribeDeviceChangeNotifications, | 168 MOCK_METHOD2(UnsubscribeDeviceChangeNotifications, |
| 128 void(MediaDeviceType type, uint32_t subscription_id)); | 169 void(MediaDeviceType type, uint32_t subscription_id)); |
| 129 MOCK_METHOD2(GetVideoInputCapabilities, | |
| 130 void(const url::Origin& security_origin, | |
| 131 const GetVideoInputCapabilitiesCallback& client_callback)); | |
| 132 }; | 170 }; |
| 133 | 171 |
| 134 class UserMediaClientImplUnderTest : public UserMediaClientImpl { | 172 class UserMediaClientImplUnderTest : public UserMediaClientImpl { |
| 135 public: | 173 public: |
| 136 enum RequestState { | 174 enum RequestState { |
| 137 REQUEST_NOT_STARTED, | 175 REQUEST_NOT_STARTED, |
| 138 REQUEST_NOT_COMPLETE, | 176 REQUEST_NOT_COMPLETE, |
| 139 REQUEST_SUCCEEDED, | 177 REQUEST_SUCCEEDED, |
| 140 REQUEST_FAILED, | 178 REQUEST_FAILED, |
| 141 }; | 179 }; |
| 142 | 180 |
| 143 UserMediaClientImplUnderTest( | 181 UserMediaClientImplUnderTest( |
| 144 PeerConnectionDependencyFactory* dependency_factory, | 182 PeerConnectionDependencyFactory* dependency_factory, |
| 145 std::unique_ptr<MediaStreamDispatcher> media_stream_dispatcher) | 183 std::unique_ptr<MediaStreamDispatcher> media_stream_dispatcher) |
| 146 : UserMediaClientImpl(NULL, | 184 : UserMediaClientImpl(nullptr, |
| 147 dependency_factory, | 185 dependency_factory, |
| 148 std::move(media_stream_dispatcher)), | 186 std::move(media_stream_dispatcher), |
| 187 base::ThreadTaskRunnerHandle::Get()), |
| 149 state_(REQUEST_NOT_STARTED), | 188 state_(REQUEST_NOT_STARTED), |
| 150 result_(NUM_MEDIA_REQUEST_RESULTS), | 189 result_(NUM_MEDIA_REQUEST_RESULTS), |
| 151 result_name_(""), | 190 result_name_(""), |
| 152 factory_(dependency_factory), | 191 factory_(dependency_factory), |
| 153 create_source_that_fails_(false), | 192 create_source_that_fails_(false), |
| 154 video_source_(NULL) {} | 193 video_source_(nullptr) {} |
| 155 | 194 |
| 156 void RequestUserMediaForTest( | 195 void RequestUserMediaForTest( |
| 157 const blink::WebUserMediaRequest& user_media_request) { | 196 const blink::WebUserMediaRequest& user_media_request) { |
| 158 state_ = REQUEST_NOT_COMPLETE; | 197 state_ = REQUEST_NOT_COMPLETE; |
| 159 requestUserMedia(user_media_request); | 198 requestUserMedia(user_media_request); |
| 160 base::RunLoop().RunUntilIdle(); | 199 base::RunLoop().RunUntilIdle(); |
| 161 } | 200 } |
| 162 | 201 |
| 163 void RequestUserMediaForTest() { | 202 void RequestUserMediaForTest() { |
| 164 blink::WebUserMediaRequest user_media_request = | 203 blink::WebUserMediaRequest user_media_request = |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 null_constraints); | 422 null_constraints); |
| 384 user_media_client_impl_->RequestUserMediaForTest(request); | 423 user_media_client_impl_->RequestUserMediaForTest(request); |
| 385 bool result = | 424 bool result = |
| 386 user_media_client_impl_->UserMediaRequestHasAutomaticDeviceSelection( | 425 user_media_client_impl_->UserMediaRequestHasAutomaticDeviceSelection( |
| 387 ms_dispatcher_->audio_input_request_id()); | 426 ms_dispatcher_->audio_input_request_id()); |
| 388 user_media_client_impl_->DeleteRequest( | 427 user_media_client_impl_->DeleteRequest( |
| 389 ms_dispatcher_->audio_input_request_id()); | 428 ms_dispatcher_->audio_input_request_id()); |
| 390 return result; | 429 return result; |
| 391 } | 430 } |
| 392 | 431 |
| 393 void TestValidRequestWithDeviceConstraints( | 432 void TestValidRequestWithConstraints( |
| 394 const blink::WebMediaConstraints& audio_constraints, | 433 const blink::WebMediaConstraints& audio_constraints, |
| 395 const blink::WebMediaConstraints& video_constraints, | 434 const blink::WebMediaConstraints& video_constraints, |
| 396 const std::string& expected_audio_device_id, | 435 const std::string& expected_audio_device_id, |
| 397 const std::string& expected_video_device_id) { | 436 const std::string& expected_video_device_id) { |
| 398 DCHECK(!audio_constraints.isNull()); | 437 DCHECK(!audio_constraints.isNull()); |
| 399 DCHECK(!video_constraints.isNull()); | 438 DCHECK(!video_constraints.isNull()); |
| 400 blink::WebUserMediaRequest request = | 439 blink::WebUserMediaRequest request = |
| 401 blink::WebUserMediaRequest::createForTesting(audio_constraints, | 440 blink::WebUserMediaRequest::createForTesting(audio_constraints, |
| 402 video_constraints); | 441 video_constraints); |
| 403 user_media_client_impl_->RequestUserMediaForTest(request); | 442 user_media_client_impl_->RequestUserMediaForTest(request); |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 user_media_client_impl_->RequestUserMediaForTest(request); | 870 user_media_client_impl_->RequestUserMediaForTest(request); |
| 832 EXPECT_EQ(UserMediaClientImplUnderTest::REQUEST_FAILED, | 871 EXPECT_EQ(UserMediaClientImplUnderTest::REQUEST_FAILED, |
| 833 user_media_client_impl_->request_state()); | 872 user_media_client_impl_->request_state()); |
| 834 } | 873 } |
| 835 | 874 |
| 836 TEST_F(UserMediaClientImplTest, CreateWithMandatoryValidDeviceIds) { | 875 TEST_F(UserMediaClientImplTest, CreateWithMandatoryValidDeviceIds) { |
| 837 blink::WebMediaConstraints audio_constraints = | 876 blink::WebMediaConstraints audio_constraints = |
| 838 CreateDeviceConstraints(kFakeAudioInputDeviceId1); | 877 CreateDeviceConstraints(kFakeAudioInputDeviceId1); |
| 839 blink::WebMediaConstraints video_constraints = | 878 blink::WebMediaConstraints video_constraints = |
| 840 CreateDeviceConstraints(kFakeVideoInputDeviceId1); | 879 CreateDeviceConstraints(kFakeVideoInputDeviceId1); |
| 841 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, | 880 TestValidRequestWithConstraints(audio_constraints, video_constraints, |
| 842 kFakeAudioInputDeviceId1, | 881 kFakeAudioInputDeviceId1, |
| 843 kFakeVideoInputDeviceId1); | 882 kFakeVideoInputDeviceId1); |
| 844 } | 883 } |
| 845 | 884 |
| 846 TEST_F(UserMediaClientImplTest, CreateWithBasicIdealValidDeviceId) { | 885 TEST_F(UserMediaClientImplTest, CreateWithBasicIdealValidDeviceId) { |
| 847 blink::WebMediaConstraints audio_constraints = | 886 blink::WebMediaConstraints audio_constraints = |
| 848 CreateDeviceConstraints(nullptr, kFakeAudioInputDeviceId1); | 887 CreateDeviceConstraints(nullptr, kFakeAudioInputDeviceId1); |
| 849 blink::WebMediaConstraints video_constraints = | 888 blink::WebMediaConstraints video_constraints = |
| 850 CreateDeviceConstraints(nullptr, kFakeVideoInputDeviceId1); | 889 CreateDeviceConstraints(nullptr, kFakeVideoInputDeviceId1); |
| 851 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, | 890 TestValidRequestWithConstraints(audio_constraints, video_constraints, |
| 852 kFakeAudioInputDeviceId1, | 891 kFakeAudioInputDeviceId1, |
| 853 kFakeVideoInputDeviceId1); | 892 kFakeVideoInputDeviceId1); |
| 854 } | 893 } |
| 855 | 894 |
| 856 TEST_F(UserMediaClientImplTest, CreateWithAdvancedExactValidDeviceId) { | 895 TEST_F(UserMediaClientImplTest, CreateWithAdvancedExactValidDeviceId) { |
| 857 blink::WebMediaConstraints audio_constraints = | 896 blink::WebMediaConstraints audio_constraints = |
| 858 CreateDeviceConstraints(nullptr, nullptr, kFakeAudioInputDeviceId1); | 897 CreateDeviceConstraints(nullptr, nullptr, kFakeAudioInputDeviceId1); |
| 859 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints( | 898 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints( |
| 860 nullptr, nullptr, kFakeVideoInputDeviceId1); | 899 nullptr, nullptr, kFakeVideoInputDeviceId1); |
| 861 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, | 900 TestValidRequestWithConstraints(audio_constraints, video_constraints, |
| 862 kFakeAudioInputDeviceId1, | 901 kFakeAudioInputDeviceId1, |
| 863 kFakeVideoInputDeviceId1); | 902 kFakeVideoInputDeviceId1); |
| 864 } | |
| 865 | |
| 866 TEST_F(UserMediaClientImplTest, CreateWithAdvancedIdealValidDeviceId) { | |
| 867 blink::WebMediaConstraints audio_constraints = CreateDeviceConstraints( | |
| 868 nullptr, nullptr, nullptr, kFakeAudioInputDeviceId1); | |
| 869 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints( | |
| 870 nullptr, nullptr, nullptr, kFakeVideoInputDeviceId1); | |
| 871 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, | |
| 872 kFakeAudioInputDeviceId1, | |
| 873 kFakeVideoInputDeviceId1); | |
| 874 } | 903 } |
| 875 | 904 |
| 876 TEST_F(UserMediaClientImplTest, CreateWithAllOptionalInvalidDeviceId) { | 905 TEST_F(UserMediaClientImplTest, CreateWithAllOptionalInvalidDeviceId) { |
| 877 blink::WebMediaConstraints audio_constraints = CreateDeviceConstraints( | 906 blink::WebMediaConstraints audio_constraints = |
| 878 nullptr, kInvalidDeviceId, kInvalidDeviceId, kInvalidDeviceId); | 907 CreateDeviceConstraints(nullptr, kInvalidDeviceId, kInvalidDeviceId); |
| 879 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints( | 908 blink::WebMediaConstraints video_constraints = |
| 880 nullptr, kInvalidDeviceId, kInvalidDeviceId, kInvalidDeviceId); | 909 CreateDeviceConstraints(nullptr, kInvalidDeviceId, kInvalidDeviceId); |
| 881 // MockMediaStreamDispatcher uses empty string as default device ID. | 910 // MockMediaStreamDispatcher uses empty string as default audio device ID. |
| 882 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, | 911 // MockMediaDevicesDispatcher uses the first device in the enumeration as |
| 883 std::string(), std::string()); | 912 // default video device ID. |
| 913 TestValidRequestWithConstraints(audio_constraints, video_constraints, |
| 914 std::string(), kFakeVideoInputDeviceId1); |
| 884 } | 915 } |
| 885 | 916 |
| 886 TEST_F(UserMediaClientImplTest, | 917 TEST_F(UserMediaClientImplTest, CreateWithFacingModeUser) { |
| 887 CreateWithAdvancedIdealValidOtherOptionalInvalidDeviceId) { | 918 blink::WebMediaConstraints audio_constraints = |
| 888 blink::WebMediaConstraints audio_constraints = CreateDeviceConstraints( | 919 CreateDeviceConstraints(kFakeAudioInputDeviceId1); |
| 889 nullptr, kInvalidDeviceId, kInvalidDeviceId, kFakeAudioInputDeviceId1); | 920 blink::WebMediaConstraints video_constraints = |
| 890 blink::WebMediaConstraints video_constraints = CreateDeviceConstraints( | 921 CreateFacingModeConstraints("user"); |
| 891 nullptr, kInvalidDeviceId, kInvalidDeviceId, kFakeVideoInputDeviceId1); | 922 // kFakeVideoInputDeviceId1 has user facing mode. |
| 892 TestValidRequestWithDeviceConstraints(audio_constraints, video_constraints, | 923 TestValidRequestWithConstraints(audio_constraints, video_constraints, |
| 893 kFakeAudioInputDeviceId1, | 924 kFakeAudioInputDeviceId1, |
| 894 kFakeVideoInputDeviceId1); | 925 kFakeVideoInputDeviceId1); |
| 926 } |
| 927 |
| 928 TEST_F(UserMediaClientImplTest, CreateWithFacingModeEnvironment) { |
| 929 blink::WebMediaConstraints audio_constraints = |
| 930 CreateDeviceConstraints(kFakeAudioInputDeviceId1); |
| 931 blink::WebMediaConstraints video_constraints = |
| 932 CreateFacingModeConstraints("environment"); |
| 933 // kFakeVideoInputDeviceId2 has environment facing mode. |
| 934 TestValidRequestWithConstraints(audio_constraints, video_constraints, |
| 935 kFakeAudioInputDeviceId1, |
| 936 kFakeVideoInputDeviceId2); |
| 895 } | 937 } |
| 896 | 938 |
| 897 } // namespace content | 939 } // namespace content |
| OLD | NEW |