summaryrefslogtreecommitdiffstats
path: root/content/renderer
diff options
context:
space:
mode:
authorhta <hta@chromium.org>2016-03-21 14:57:41 -0700
committerCommit bot <commit-bot@chromium.org>2016-03-21 21:59:05 +0000
commit21615c97602c4405bcd4029d872451ac9b104298 (patch)
tree6891ca3f0dcf90be20a941052435ea6d7217cae9 /content/renderer
parent5a2027442fee79bb42fe601a608d3d5459991bc8 (diff)
downloadchromium_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.cc18
-rw-r--r--content/renderer/media/user_media_client_impl.h14
-rw-r--r--content/renderer/media/user_media_client_impl_unittest.cc65
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