146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// found in the LICENSE file.
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/shell/renderer/test_runner/mock_web_user_media_client.h"
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "base/logging.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/macros.h"
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/shell/renderer/test_runner/mock_constraints.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/shell/renderer/test_runner/web_test_delegate.h"
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaConstraints.h"
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h"
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStream.h"
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/platform/WebMediaStreamTrackSourcesRequest.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/platform/WebSourceInfo.h"
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h"
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/web/WebMediaDevicesRequest.h"
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/web/WebMediaStreamRegistry.h"
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "third_party/WebKit/public/web/WebUserMediaRequest.h"
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebMediaConstraints;
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebMediaDeviceInfo;
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebMediaDevicesRequest;
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebMediaStream;
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebMediaStreamSource;
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebMediaStreamTrack;
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing blink::WebMediaStreamTrackSourcesRequest;
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing blink::WebSourceInfo;
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebString;
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebUserMediaRequest;
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)using blink::WebVector;
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)namespace content {
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class UserMediaRequestTask : public WebMethodTask<MockWebUserMediaClient> {
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UserMediaRequestTask(MockWebUserMediaClient* object,
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       const WebUserMediaRequest& request,
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                       const WebMediaStream result)
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : WebMethodTask<MockWebUserMediaClient>(object),
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request_(request),
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        result_(result) {
4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DCHECK(!result_.isNull());
4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void RunIfValid() OVERRIDE { request_.requestSucceeded(result_); }
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WebUserMediaRequest request_;
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WebMediaStream result_;
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(UserMediaRequestTask);
5646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
5746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class UserMediaRequestConstraintFailedTask
5946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : public WebMethodTask<MockWebUserMediaClient> {
6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
6146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UserMediaRequestConstraintFailedTask(MockWebUserMediaClient* object,
6246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       const WebUserMediaRequest& request,
6346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       const WebString& constraint)
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : WebMethodTask<MockWebUserMediaClient>(object),
6546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request_(request),
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        constraint_(constraint) {}
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void RunIfValid() OVERRIDE {
6946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    request_.requestFailedConstraint(constraint_);
7046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WebUserMediaRequest request_;
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WebString constraint_;
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(UserMediaRequestConstraintFailedTask);
7746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
7846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
7946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class UserMediaRequestPermissionDeniedTask
8046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : public WebMethodTask<MockWebUserMediaClient> {
8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  UserMediaRequestPermissionDeniedTask(MockWebUserMediaClient* object,
8346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                       const WebUserMediaRequest& request)
8446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : WebMethodTask<MockWebUserMediaClient>(object),
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request_(request) {}
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void RunIfValid() OVERRIDE { request_.requestFailed(); }
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
8946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
9046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WebUserMediaRequest request_;
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(UserMediaRequestPermissionDeniedTask);
9346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
9446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class MediaDevicesRequestTask : public WebMethodTask<MockWebUserMediaClient> {
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  MediaDevicesRequestTask(MockWebUserMediaClient* object,
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          const WebMediaDevicesRequest& request,
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                          const WebVector<WebMediaDeviceInfo>& result)
10046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      : WebMethodTask<MockWebUserMediaClient>(object),
10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        request_(request),
10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        result_(result) {}
10346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void RunIfValid() OVERRIDE { request_.requestSucceeded(result_); }
10546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
10646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) private:
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WebMediaDevicesRequest request_;
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  WebVector<WebMediaDeviceInfo> result_;
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(MediaDevicesRequestTask);
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass SourcesRequestTask : public WebMethodTask<MockWebUserMediaClient> {
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SourcesRequestTask(MockWebUserMediaClient* object,
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const WebMediaStreamTrackSourcesRequest& request,
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                     const WebVector<WebSourceInfo>& result)
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : WebMethodTask<MockWebUserMediaClient>(object),
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        request_(request),
1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        result_(result) {}
1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void RunIfValid() OVERRIDE { request_.requestSucceeded(result_); }
1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebMediaStreamTrackSourcesRequest request_;
1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebVector<WebSourceInfo> result_;
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DISALLOW_COPY_AND_ASSIGN(SourcesRequestTask);
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class MockExtraData : public WebMediaStream::ExtraData {
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) public:
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  int foo;
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)MockWebUserMediaClient::MockWebUserMediaClient(WebTestDelegate* delegate)
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : delegate_(delegate) {}
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MockWebUserMediaClient::requestUserMedia(
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const WebUserMediaRequest& stream_request) {
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    DCHECK(!stream_request.isNull());
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    WebUserMediaRequest request = stream_request;
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (request.ownerDocument().isNull() || !request.ownerDocument().frame()) {
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PostTask(
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          new UserMediaRequestPermissionDeniedTask(this, request));
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        return;
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
14946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
15046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    WebMediaConstraints constraints = request.audioConstraints();
15146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    WebString failed_constraint;
15246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!constraints.isNull() &&
15346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        !MockConstraints::VerifyConstraints(constraints, &failed_constraint)) {
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PostTask(new UserMediaRequestConstraintFailedTask(
15546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          this, request, failed_constraint));
15646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
15746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
15846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    constraints = request.videoConstraints();
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (!constraints.isNull() &&
16046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        !MockConstraints::VerifyConstraints(constraints, &failed_constraint)) {
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      delegate_->PostTask(new UserMediaRequestConstraintFailedTask(
16246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)          this, request, failed_constraint));
16346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      return;
16446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
16546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
16646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const size_t zero = 0;
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const size_t one = 1;
16846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    WebVector<WebMediaStreamTrack> audio_tracks(request.audio() ? one : zero);
16946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    WebVector<WebMediaStreamTrack> video_tracks(request.video() ? one : zero);
17046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (request.audio()) {
17246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      WebMediaStreamSource source;
17346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      source.initialize("MockAudioDevice#1",
17446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        WebMediaStreamSource::TypeAudio,
17546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        "Mock audio device");
17646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      audio_tracks[0].initialize(source);
17746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
17846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
17946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    if (request.video()) {
18046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      WebMediaStreamSource source;
18146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      source.initialize("MockVideoDevice#1",
18246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        WebMediaStreamSource::TypeVideo,
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                        "Mock video device");
18446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      video_tracks[0].initialize(source);
18546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    }
18646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
18746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    WebMediaStream stream;
18846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    stream.initialize(audio_tracks, video_tracks);
18946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    stream.setExtraData(new MockExtraData());
19146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    delegate_->PostTask(new UserMediaRequestTask(this, request, stream));
19346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
19446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MockWebUserMediaClient::cancelUserMediaRequest(
19646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const WebUserMediaRequest&) {
19746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
19846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
19946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MockWebUserMediaClient::requestMediaDevices(
20046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const WebMediaDevicesRequest& request) {
2011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct {
2021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char* device_id;
2031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WebMediaDeviceInfo::MediaDeviceKind kind;
2041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char* label;
2051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char* group_id;
2061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } test_devices[] = {
2071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
2081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "device1",
2091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WebMediaDeviceInfo::MediaDeviceKindAudioInput,
2101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "Built-in microphone",
2111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "group1",
2121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
2141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "device2",
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WebMediaDeviceInfo::MediaDeviceKindAudioOutput,
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "Built-in speakers",
2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "group1",
2181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "device3",
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WebMediaDeviceInfo::MediaDeviceKindVideoInput,
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "Build-in webcam",
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "group2",
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebVector<WebMediaDeviceInfo> devices(ARRAYSIZE_UNSAFE(test_devices));
2281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_devices); ++i) {
2291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    devices[i].initialize(WebString::fromUTF8(test_devices[i].device_id),
2301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          test_devices[i].kind,
2311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          WebString::fromUTF8(test_devices[i].label),
2321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          WebString::fromUTF8(test_devices[i].group_id));
2331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->PostTask(new MediaDevicesRequestTask(this, request, devices));
23646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
23846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void MockWebUserMediaClient::cancelMediaDevicesRequest(
23946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const WebMediaDevicesRequest&) {
24046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
24146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MockWebUserMediaClient::requestSources(
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const blink::WebMediaStreamTrackSourcesRequest& request) {
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct {
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char* id;
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WebSourceInfo::SourceKind kind;
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const char* label;
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    WebSourceInfo::VideoFacingMode facing;
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } test_sources[] = {
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "device1",
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WebSourceInfo::SourceKindAudio,
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "Built-in microphone",
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WebSourceInfo::VideoFacingModeNone,
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    {
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "device2",
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WebSourceInfo::SourceKindVideo,
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      "Build-in webcam",
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      WebSourceInfo::VideoFacingModeEnvironment,
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    },
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
2631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WebVector<WebSourceInfo> sources(ARRAYSIZE_UNSAFE(test_sources));
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_sources); ++i) {
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  sources[i].initialize(WebString::fromUTF8(test_sources[i].id),
2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        test_sources[i].kind,
2681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        WebString::fromUTF8(test_sources[i].label),
2691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        test_sources[i].facing);
2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_->PostTask(new SourcesRequestTask(this, request, sources));
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}  // namespace content
276