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