Skip to content

Commit

Permalink
Revert "Remove MediaStreamTrack.getSources()."
Browse files Browse the repository at this point in the history
This reverts commit 3ea42b2.

This revert is temporary in order to give time to a performance test to
be fixed.

TBR=rbyers@chromium.org, hbos@chromium.org
BUG=662414, 649710, 388194

Review-Url: https://codereview.chromium.org/2489823002
Cr-Commit-Position: refs/heads/master@{#431224}
  • Loading branch information
guidou authored and Commit bot committed Nov 10, 2016
1 parent 9930ee9 commit f29875a
Show file tree
Hide file tree
Showing 46 changed files with 1,108 additions and 18 deletions.
14 changes: 7 additions & 7 deletions chrome/test/data/extensions/hangout_services_test.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
// Populates UI elements with initial contents.
function populate() {
populateSinks();
navigator.mediaDevices.enumerateDevices().then(populateSources);
MediaStreamTrack.getSources(populateSources);
}

// Populates the select box with information on all sinks and the
Expand All @@ -42,14 +42,14 @@
});
}

function populateSources(devices) {
function populateSources(sources) {
var select = document.getElementById('selectSource');
for (var i = 0; i < devices.length; ++i) {
var device = devices[i];
if (device.kind == 'audioinput') {
for (var i = 0; i < sources.length; ++i) {
var source = sources[i];
if (source.kind == 'audio') {
var option = document.createElement('option');
option.value = device.deviceId;
option.text = device.label + ' (' + device.deviceId + ')';
option.value = source.id;
option.text = source.label + ' (' + source.id + ')';
select.add(option);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
<html>
<head>
<script type="text/javascript">
// A guest that requests media devices, which in turn checks for media
// A guest that requests media sources, which in turn checks for media
// access permission.
// Notifies the embedder when done via post message. Note that the
// embedder has to initiate a postMessage first so that guest has a
Expand All @@ -23,7 +23,7 @@
notifyEmbedder(JSON.stringify(['got-sources']));
};
var startTest = function() {
navigator.mediaDevices.enumerateDevices().then(onSourceInfo);
MediaStreamTrack.getSources(onSourceInfo);
};
var onPostMessageReceived = function(e) {
var data = JSON.parse(e.data);
Expand Down
14 changes: 13 additions & 1 deletion chrome/test/data/webrtc/media_devices.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,19 @@
* Returns the list of devices available.
*/
function getMediaDevices() {
navigator.mediaDevices.enumerateDevices().then(function(devices) {
navigator.getMediaDevices(function(devices) {
returnToTest(JSON.stringify(devices));
});
}

/**
* Queries for media sources on the current system using the getSources API.
*
* Returns the list of sources available.
*/
function getSources() {
MediaStreamTrack.getSources(function(sources) {
returnToTest(JSON.stringify(sources));
});
}

2 changes: 2 additions & 0 deletions components/test_runner/mock_web_media_stream_center.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
#include "third_party/WebKit/public/platform/WebMediaStreamCenterClient.h"
#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h"
#include "third_party/WebKit/public/platform/WebSourceInfo.h"
#include "third_party/WebKit/public/platform/WebVector.h"

namespace test_runner {
Expand Down
39 changes: 39 additions & 0 deletions components/test_runner/mock_web_user_media_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
#include "third_party/WebKit/public/platform/WebMediaStream.h"
#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h"
#include "third_party/WebKit/public/platform/WebSourceInfo.h"
#include "third_party/WebKit/public/platform/WebVector.h"
#include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/public/web/WebMediaDevicesRequest.h"
Expand All @@ -27,6 +29,8 @@ using blink::WebMediaDevicesRequest;
using blink::WebMediaStream;
using blink::WebMediaStreamSource;
using blink::WebMediaStreamTrack;
using blink::WebMediaStreamTrackSourcesRequest;
using blink::WebSourceInfo;
using blink::WebString;
using blink::WebUserMediaRequest;
using blink::WebVector;
Expand Down Expand Up @@ -147,6 +151,41 @@ void MockWebUserMediaClient::requestMediaDevices(
media_device_change_observer_.didChangeMediaDevices();
}

void MockWebUserMediaClient::requestSources(
const blink::WebMediaStreamTrackSourcesRequest& request) {
struct {
const char* id;
WebSourceInfo::SourceKind kind;
const char* label;
WebSourceInfo::VideoFacingMode facing;
} test_sources[] = {
{
"device1",
WebSourceInfo::SourceKindAudio,
"Built-in microphone",
WebSourceInfo::VideoFacingModeNone,
},
{
"device2",
WebSourceInfo::SourceKindVideo,
"Build-in webcam",
WebSourceInfo::VideoFacingModeEnvironment,
},
};

WebVector<WebSourceInfo> sources(arraysize(test_sources));
for (size_t i = 0; i < arraysize(test_sources); ++i) {
sources[i].initialize(WebString::fromUTF8(test_sources[i].id),
test_sources[i].kind,
WebString::fromUTF8(test_sources[i].label),
test_sources[i].facing);
}

delegate_->PostTask(base::Bind(
&WebMediaStreamTrackSourcesRequest::requestSucceeded,
base::Owned(new WebMediaStreamTrackSourcesRequest(request)), sources));
}

void MockWebUserMediaClient::setMediaDeviceChangeObserver(
const blink::WebMediaDeviceChangeObserver& observer) {
media_device_change_observer_ = observer;
Expand Down
1 change: 1 addition & 0 deletions components/test_runner/mock_web_user_media_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class MockWebUserMediaClient : public blink::WebUserMediaClient {
void requestUserMedia(const blink::WebUserMediaRequest&) override;
void cancelUserMediaRequest(const blink::WebUserMediaRequest&) override;
void requestMediaDevices(const blink::WebMediaDevicesRequest&) override;
void requestSources(const blink::WebMediaStreamTrackSourcesRequest&) override;
void setMediaDeviceChangeObserver(
const blink::WebMediaDeviceChangeObserver&) override;

Expand Down
2 changes: 2 additions & 0 deletions content/renderer/media/media_stream_center.cc
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
#include "third_party/WebKit/public/platform/WebMediaStreamCenterClient.h"
#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h"
#include "third_party/WebKit/public/platform/WebSourceInfo.h"
#include "third_party/WebKit/public/platform/WebVector.h"
#include "third_party/WebKit/public/web/WebFrame.h"

Expand Down
1 change: 1 addition & 0 deletions content/renderer/media/media_stream_center.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include "third_party/WebKit/public/platform/WebMediaStream.h"
#include "third_party/WebKit/public/platform/WebMediaStreamCenter.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h"

namespace blink {
class WebAudioSourceProvider;
Expand Down
66 changes: 66 additions & 0 deletions content/renderer/media/user_media_client_impl.cc
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
#include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h"
#include "third_party/WebKit/public/web/WebDocument.h"
#include "third_party/WebKit/public/web/WebLocalFrame.h"

Expand Down Expand Up @@ -146,6 +147,18 @@ blink::WebMediaDeviceInfo::MediaDeviceKind ToMediaDeviceKind(
}
}

blink::WebSourceInfo::VideoFacingMode ToVideoFacingMode(
const std::string& device_label) {
#if defined(OS_ANDROID)
if (device_label.find("front") != std::string::npos) {
return blink::WebSourceInfo::VideoFacingModeUser;
} else if (device_label.find("back") != std::string::npos) {
return blink::WebSourceInfo::VideoFacingModeEnvironment;
}
#endif
return blink::WebSourceInfo::VideoFacingModeNone;
}

static int g_next_request_id = 0;

} // namespace
Expand Down Expand Up @@ -283,6 +296,25 @@ void UserMediaClientImpl::requestMediaDevices(
weak_factory_.GetWeakPtr(), media_devices_request));
}

void UserMediaClientImpl::requestSources(
const blink::WebMediaStreamTrackSourcesRequest& sources_request) {
// We don't call UpdateWebRTCMethodCount() here to track the API count in UMA
// stats. This is instead counted in MediaStreamTrack::getSources in blink.
DCHECK(CalledOnValidThread());

// |sources_request| can't be mocked, so in tests it will be empty (the
// underlying pointer is null). In order to use this function in a test we
// need to check if it isNull.
url::Origin security_origin;
if (!sources_request.isNull())
security_origin = sources_request.origin();

GetMediaDevicesDispatcher()->EnumerateDevices(
true /* audio input */, true /* video input */, false /* audio output */,
security_origin, base::Bind(&UserMediaClientImpl::FinalizeGetSources,
weak_factory_.GetWeakPtr(), sources_request));
}

void UserMediaClientImpl::setMediaDeviceChangeObserver(
const blink::WebMediaDeviceChangeObserver& observer) {
media_device_change_observer_ = observer;
Expand Down Expand Up @@ -408,6 +440,34 @@ void UserMediaClientImpl::FinalizeEnumerateDevices(
EnumerateDevicesSucceded(&request, devices);
}

void UserMediaClientImpl::FinalizeGetSources(
blink::WebMediaStreamTrackSourcesRequest request,
const EnumerationResult& result) {
DCHECK_EQ(static_cast<size_t>(NUM_MEDIA_DEVICE_TYPES), result.size());

blink::WebVector<blink::WebSourceInfo> sources(
result[MEDIA_DEVICE_TYPE_AUDIO_INPUT].size() +
result[MEDIA_DEVICE_TYPE_VIDEO_INPUT].size());
size_t index = 0;
for (const auto& device_info : result[MEDIA_DEVICE_TYPE_AUDIO_INPUT]) {
sources[index++].initialize(
blink::WebString::fromUTF8(device_info.device_id),
blink::WebSourceInfo::SourceKindAudio,
blink::WebString::fromUTF8(device_info.label),
blink::WebSourceInfo::VideoFacingModeNone);
}

for (const auto& device_info : result[MEDIA_DEVICE_TYPE_VIDEO_INPUT]) {
sources[index++].initialize(
blink::WebString::fromUTF8(device_info.device_id),
blink::WebSourceInfo::SourceKindVideo,
blink::WebString::fromUTF8(device_info.label),
ToVideoFacingMode(device_info.label));
}

EnumerateSourcesSucceded(&request, sources);
}

// Callback from MediaStreamDispatcher.
// The requested stream failed to be generated.
void UserMediaClientImpl::OnStreamGenerationFailed(
Expand Down Expand Up @@ -744,6 +804,12 @@ void UserMediaClientImpl::EnumerateDevicesSucceded(
request->requestSucceeded(devices);
}

void UserMediaClientImpl::EnumerateSourcesSucceded(
blink::WebMediaStreamTrackSourcesRequest* request,
blink::WebVector<blink::WebSourceInfo>& sources) {
request->requestSucceeded(sources);
}

const blink::WebMediaStreamSource* UserMediaClientImpl::FindLocalSource(
const StreamDeviceInfo& device) const {
for (LocalStreamSources::const_iterator it = local_sources_.begin();
Expand Down
8 changes: 8 additions & 0 deletions content/renderer/media/user_media_client_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/WebKit/public/platform/WebMediaStream.h"
#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
#include "third_party/WebKit/public/platform/WebSourceInfo.h"
#include "third_party/WebKit/public/platform/WebVector.h"
#include "third_party/WebKit/public/web/WebMediaDeviceChangeObserver.h"
#include "third_party/WebKit/public/web/WebMediaDevicesRequest.h"
Expand Down Expand Up @@ -66,6 +67,8 @@ class CONTENT_EXPORT UserMediaClientImpl
const blink::WebUserMediaRequest& user_media_request) override;
void requestMediaDevices(
const blink::WebMediaDevicesRequest& media_devices_request) override;
void requestSources(
const blink::WebMediaStreamTrackSourcesRequest& sources_request) override;
void setMediaDeviceChangeObserver(
const blink::WebMediaDeviceChangeObserver& observer) override;

Expand Down Expand Up @@ -117,6 +120,9 @@ class CONTENT_EXPORT UserMediaClientImpl
virtual void EnumerateDevicesSucceded(
blink::WebMediaDevicesRequest* request,
blink::WebVector<blink::WebMediaDeviceInfo>& devices);
virtual void EnumerateSourcesSucceded(
blink::WebMediaStreamTrackSourcesRequest* request,
blink::WebVector<blink::WebSourceInfo>& sources);

// Creates a MediaStreamAudioSource/MediaStreamVideoSource objects.
// These are virtual for test purposes.
Expand Down Expand Up @@ -228,6 +234,8 @@ class CONTENT_EXPORT UserMediaClientImpl
using EnumerationResult = std::vector<MediaDeviceInfoArray>;
void FinalizeEnumerateDevices(blink::WebMediaDevicesRequest request,
const EnumerationResult& result);
void FinalizeGetSources(blink::WebMediaStreamTrackSourcesRequest request,
const EnumerationResult& result);

void DeleteAllUserMediaRequests();

Expand Down
55 changes: 55 additions & 0 deletions content/renderer/media/user_media_client_impl_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
#include "third_party/WebKit/public/platform/WebMediaStream.h"
#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
#include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h"
#include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/platform/WebVector.h"
#include "third_party/WebKit/public/web/WebHeap.h"
Expand Down Expand Up @@ -123,6 +124,12 @@ class UserMediaClientImplUnderTest : public UserMediaClientImpl {
requestMediaDevices(media_devices_request);
}

void RequestSources() {
blink::WebMediaStreamTrackSourcesRequest sources_request;
state_ = REQUEST_NOT_COMPLETE;
requestSources(sources_request);
}

void SetMediaDeviceChangeObserver() {
blink::WebMediaDeviceChangeObserver observer(true);
setMediaDeviceChangeObserver(observer);
Expand Down Expand Up @@ -156,6 +163,13 @@ class UserMediaClientImplUnderTest : public UserMediaClientImpl {
last_devices_ = devices;
}

void EnumerateSourcesSucceded(
blink::WebMediaStreamTrackSourcesRequest* request,
blink::WebVector<blink::WebSourceInfo>& sources) override {
state_ = REQUEST_SUCCEEDED;
last_sources_ = sources;
}

void SetCreateSourceThatFails(bool should_fail) {
create_source_that_fails_ = should_fail;
}
Expand Down Expand Up @@ -199,6 +213,10 @@ class UserMediaClientImplUnderTest : public UserMediaClientImpl {
return last_devices_;
}

const blink::WebVector<blink::WebSourceInfo>& last_sources() {
return last_sources_;
}

void ClearLastGeneratedStream() {
last_generated_stream_.reset();
}
Expand Down Expand Up @@ -229,6 +247,7 @@ class UserMediaClientImplUnderTest : public UserMediaClientImpl {
content::MediaStreamRequestResult result_;
blink::WebString result_name_;
blink::WebVector<blink::WebMediaDeviceInfo> last_devices_;
blink::WebVector<blink::WebSourceInfo> last_sources_;
PeerConnectionDependencyFactory* factory_;
bool create_source_that_fails_;
MockMediaStreamVideoCapturerSource* video_source_;
Expand Down Expand Up @@ -625,6 +644,42 @@ TEST_F(UserMediaClientImplTest, EnumerateMediaDevices) {
used_media_impl_->last_devices()[4].groupId()));
}

TEST_F(UserMediaClientImplTest, EnumerateSources) {
used_media_impl_->RequestSources();
base::RunLoop().RunUntilIdle();

EXPECT_EQ(UserMediaClientImplUnderTest::REQUEST_SUCCEEDED,
used_media_impl_->request_state());
EXPECT_EQ(static_cast<size_t>(4), used_media_impl_->last_sources().size());

// Audio input devices.
const blink::WebSourceInfo* source = &used_media_impl_->last_sources()[0];
EXPECT_FALSE(source->id().isEmpty());
EXPECT_EQ(blink::WebSourceInfo::SourceKindAudio, source->kind());
EXPECT_FALSE(source->label().isEmpty());
EXPECT_EQ(blink::WebSourceInfo::VideoFacingModeNone, source->facing());

source = &used_media_impl_->last_sources()[1];
EXPECT_FALSE(source->id().isEmpty());
EXPECT_EQ(blink::WebSourceInfo::SourceKindAudio, source->kind());
EXPECT_FALSE(source->label().isEmpty());
EXPECT_EQ(blink::WebSourceInfo::VideoFacingModeNone, source->facing());

// Video input device user facing.
source = &used_media_impl_->last_sources()[2];
EXPECT_FALSE(source->id().isEmpty());
EXPECT_EQ(blink::WebSourceInfo::SourceKindVideo, source->kind());
EXPECT_FALSE(source->label().isEmpty());
EXPECT_EQ(blink::WebSourceInfo::VideoFacingModeNone, source->facing());

// Video input device environment facing.
source = &used_media_impl_->last_sources()[3];
EXPECT_FALSE(source->id().isEmpty());
EXPECT_EQ(blink::WebSourceInfo::SourceKindVideo, source->kind());
EXPECT_FALSE(source->label().isEmpty());
EXPECT_EQ(blink::WebSourceInfo::VideoFacingModeNone, source->facing());
}

TEST_F(UserMediaClientImplTest, RenderToAssociatedSinkConstraint) {
// For a null UserMediaRequest (no audio requested), we expect false.
used_media_impl_->RequestUserMedia();
Expand Down
Loading

0 comments on commit f29875a

Please sign in to comment.