diff options
author | hta <hta@chromium.org> | 2016-03-21 14:57:41 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-21 21:59:05 +0000 |
commit | 21615c97602c4405bcd4029d872451ac9b104298 (patch) | |
tree | 6891ca3f0dcf90be20a941052435ea6d7217cae9 /content/renderer | |
parent | 5a2027442fee79bb42fe601a608d3d5459991bc8 (diff) | |
download | chromium_src-21615c97602c4405bcd4029d872451ac9b104298.zip chromium_src-21615c97602c4405bcd4029d872451ac9b104298.tar.gz chromium_src-21615c97602c4405bcd4029d872451ac9b104298.tar.bz2 |
This CL adds tests that setting the renderToAssociatedSink constraint actually produces the expected effect in the request, and that the defaults are working as expected.
A lot of the CL consists of making WebUserMediaRequest instantiable in tests, and avoiding unsupported behaviors in the mocked version.
See https://codereview.chromium.org/1741553003/ for the behavior that needed testing.
BUG=
Review URL: https://codereview.chromium.org/1742683002
Cr-Commit-Position: refs/heads/master@{#382406}
Diffstat (limited to 'content/renderer')
-rw-r--r-- | content/renderer/media/user_media_client_impl.cc | 18 | ||||
-rw-r--r-- | content/renderer/media/user_media_client_impl.h | 14 | ||||
-rw-r--r-- | content/renderer/media/user_media_client_impl_unittest.cc | 65 |
3 files changed, 80 insertions, 17 deletions
diff --git a/content/renderer/media/user_media_client_impl.cc b/content/renderer/media/user_media_client_impl.cc index 6164b96..d841f19 100644 --- a/content/renderer/media/user_media_client_impl.cc +++ b/content/renderer/media/user_media_client_impl.cc @@ -200,23 +200,21 @@ void UserMediaClientImpl::requestUserMedia( // Check if this input device should be used to select a matching output // device for audio rendering. enable_automatic_output_device_selection = true; // On by default. - for (const auto& advanced_constraint : - user_media_request.audioConstraints().advanced()) { - if (advanced_constraint.renderToAssociatedSink.hasExact()) { - enable_automatic_output_device_selection = - advanced_constraint.renderToAssociatedSink.exact(); - break; - } - } + GetConstraintValueAsBoolean( + user_media_request.audioConstraints(), + &blink::WebMediaTrackConstraintSet::renderToAssociatedSink, + &enable_automatic_output_device_selection); } if (user_media_request.video()) { controls.video.requested = true; } CopyBlinkRequestToStreamControls(user_media_request, &controls); - security_origin = blink::WebStringToGURL( user_media_request.getSecurityOrigin().toString()); - DCHECK(render_frame()->GetWebFrame() == + // ownerDocument may be null if we are in a test. + // In that case, it's OK to not check frame(). + DCHECK(user_media_request.ownerDocument().isNull() || + render_frame()->GetWebFrame() == static_cast<blink::WebFrame*>( user_media_request.ownerDocument().frame())); } diff --git a/content/renderer/media/user_media_client_impl.h b/content/renderer/media/user_media_client_impl.h index 7beb153..b34db8b 100644 --- a/content/renderer/media/user_media_client_impl.h +++ b/content/renderer/media/user_media_client_impl.h @@ -121,7 +121,6 @@ class CONTENT_EXPORT UserMediaClientImpl const StreamDeviceInfo& device, const MediaStreamSource::SourceStoppedCallback& stop_callback); - private: // Class for storing information about a WebKit request to create a // MediaStream. class UserMediaRequestInfo @@ -176,6 +175,15 @@ class CONTENT_EXPORT UserMediaClientImpl }; typedef ScopedVector<UserMediaRequestInfo> UserMediaRequests; + protected: + // These methods can be accessed in unit tests. + UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id); + UserMediaRequestInfo* FindUserMediaRequestInfo( + const blink::WebUserMediaRequest& request); + + void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request); + + private: typedef std::vector<blink::WebMediaStreamSource> LocalStreamSources; struct MediaDevicesRequestInfo; @@ -215,10 +223,6 @@ class CONTENT_EXPORT UserMediaClientImpl void FinalizeEnumerateDevices(MediaDevicesRequestInfo* request); void FinalizeEnumerateSources(MediaDevicesRequestInfo* request); - UserMediaRequestInfo* FindUserMediaRequestInfo(int request_id); - UserMediaRequestInfo* FindUserMediaRequestInfo( - const blink::WebUserMediaRequest& request); - void DeleteUserMediaRequestInfo(UserMediaRequestInfo* request); void DeleteAllUserMediaRequests(); MediaDevicesRequestInfo* FindMediaDevicesRequestInfo(int request_id); diff --git a/content/renderer/media/user_media_client_impl_unittest.cc b/content/renderer/media/user_media_client_impl_unittest.cc index 0859d86..22ae54e 100644 --- a/content/renderer/media/user_media_client_impl_unittest.cc +++ b/content/renderer/media/user_media_client_impl_unittest.cc @@ -14,6 +14,7 @@ #include "content/renderer/media/media_stream.h" #include "content/renderer/media/media_stream_audio_source.h" #include "content/renderer/media/media_stream_track.h" +#include "content/renderer/media/mock_constraint_factory.h" #include "content/renderer/media/mock_media_stream_dispatcher.h" #include "content/renderer/media/mock_media_stream_video_source.h" #include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h" @@ -62,12 +63,16 @@ class UserMediaClientImplUnderTest : public UserMediaClientImpl { factory_(dependency_factory), video_source_(NULL) {} - void RequestUserMedia() { - blink::WebUserMediaRequest user_media_request; + void RequestUserMedia(const blink::WebUserMediaRequest& user_media_request) { state_ = REQUEST_NOT_COMPLETE; requestUserMedia(user_media_request); } + void RequestUserMedia() { + blink::WebUserMediaRequest user_media_request; + RequestUserMedia(user_media_request); + } + void RequestMediaDevices() { blink::WebMediaDevicesRequest media_devices_request; state_ = REQUEST_NOT_COMPLETE; @@ -144,6 +149,18 @@ class UserMediaClientImplUnderTest : public UserMediaClientImpl { content::MediaStreamRequestResult error_reason() const { return result_; } blink::WebString error_name() const { return result_name_; } + // Access to the request queue for testing. + bool UserMediaRequestHasAutomaticDeviceSelection(int request_id) { + auto* request = FindUserMediaRequestInfo(request_id); + EXPECT_TRUE(request != nullptr); + return request && request->enable_automatic_output_device_selection; + } + + void DeleteRequest(int request_id) { + auto* request = FindUserMediaRequestInfo(request_id); + DeleteUserMediaRequestInfo(request); + } + private: blink::WebMediaStream last_generated_stream_; RequestState state_; @@ -249,6 +266,19 @@ class UserMediaClientImplTest : public ::testing::Test { blink::WebHeap::collectGarbageForTesting(); } + bool AudioRequestHasAutomaticDeviceSelection( + const blink::WebMediaConstraints& audio_constraints) { + blink::WebMediaConstraints null_constraints; + blink::WebUserMediaRequest request = + blink::WebUserMediaRequest::createForTesting(audio_constraints, + null_constraints); + used_media_impl_->RequestUserMedia(request); + bool result = used_media_impl_->UserMediaRequestHasAutomaticDeviceSelection( + ms_dispatcher_->audio_input_request_id()); + used_media_impl_->DeleteRequest(ms_dispatcher_->audio_input_request_id()); + return result; + } + protected: base::MessageLoop message_loop_; scoped_ptr<ChildProcess> child_process_; @@ -576,4 +606,35 @@ TEST_F(UserMediaClientImplTest, EnumerateSources) { EXPECT_EQ(blink::WebSourceInfo::VideoFacingModeEnvironment, source->facing()); } +TEST_F(UserMediaClientImplTest, RenderToAssociatedSinkConstraint) { + // For a null UserMediaRequest (no audio requested), we expect false. + used_media_impl_->RequestUserMedia(); + EXPECT_FALSE(used_media_impl_->UserMediaRequestHasAutomaticDeviceSelection( + ms_dispatcher_->audio_input_request_id())); + used_media_impl_->DeleteRequest(ms_dispatcher_->audio_input_request_id()); + + // If audio is requested, but no constraint, it should be true. + MockConstraintFactory factory; + blink::WebMediaConstraints audio_constraints = + factory.CreateWebMediaConstraints(); + EXPECT_TRUE(AudioRequestHasAutomaticDeviceSelection( + factory.CreateWebMediaConstraints())); + + // If the constraint is present, it should dictate the result. + factory.Reset(); + factory.AddAdvanced().renderToAssociatedSink.setExact(true); + EXPECT_TRUE(AudioRequestHasAutomaticDeviceSelection( + factory.CreateWebMediaConstraints())); + + factory.Reset(); + factory.AddAdvanced().renderToAssociatedSink.setExact(false); + EXPECT_FALSE(AudioRequestHasAutomaticDeviceSelection( + factory.CreateWebMediaConstraints())); + + factory.Reset(); + factory.basic().renderToAssociatedSink.setExact(false); + EXPECT_FALSE(AudioRequestHasAutomaticDeviceSelection( + factory.CreateWebMediaConstraints())); +} + } // namespace content |