Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / content / shell / renderer / test_runner / WebUserMediaClientMock.cpp
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/shell/renderer/test_runner/WebUserMediaClientMock.h"
6
7 #include "base/logging.h"
8 #include "content/shell/renderer/test_runner/MockConstraints.h"
9 #include "content/shell/renderer/test_runner/WebTestDelegate.h"
10 #include "third_party/WebKit/public/platform/WebMediaConstraints.h"
11 #include "third_party/WebKit/public/platform/WebMediaDeviceInfo.h"
12 #include "third_party/WebKit/public/platform/WebMediaStream.h"
13 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
14 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
15 #include "third_party/WebKit/public/platform/WebVector.h"
16 #include "third_party/WebKit/public/web/WebDocument.h"
17 #include "third_party/WebKit/public/web/WebMediaDevicesRequest.h"
18 #include "third_party/WebKit/public/web/WebMediaStreamRegistry.h"
19 #include "third_party/WebKit/public/web/WebUserMediaRequest.h"
20
21 using namespace blink;
22
23 namespace content {
24
25 class UserMediaRequestTask : public WebMethodTask<WebUserMediaClientMock> {
26 public:
27     UserMediaRequestTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request, const WebMediaStream result)
28         : WebMethodTask<WebUserMediaClientMock>(object)
29         , m_request(request)
30         , m_result(result)
31     {
32         DCHECK(!m_result.isNull());
33     }
34
35     virtual void runIfValid() OVERRIDE
36     {
37         m_request.requestSucceeded(m_result);
38     }
39
40 private:
41     WebUserMediaRequest m_request;
42     WebMediaStream m_result;
43 };
44
45 class UserMediaRequestConstraintFailedTask : public WebMethodTask<WebUserMediaClientMock> {
46 public:
47     UserMediaRequestConstraintFailedTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request, const WebString& constraint)
48         : WebMethodTask<WebUserMediaClientMock>(object)
49         , m_request(request)
50         , m_constraint(constraint)
51     {
52     }
53
54     virtual void runIfValid() OVERRIDE
55     {
56         m_request.requestFailedConstraint(m_constraint);
57     }
58
59 private:
60     WebUserMediaRequest m_request;
61     WebString m_constraint;
62 };
63
64 class UserMediaRequestPermissionDeniedTask : public WebMethodTask<WebUserMediaClientMock> {
65 public:
66     UserMediaRequestPermissionDeniedTask(WebUserMediaClientMock* object, const WebUserMediaRequest& request)
67         : WebMethodTask<WebUserMediaClientMock>(object)
68         , m_request(request)
69     {
70     }
71
72     virtual void runIfValid() OVERRIDE
73     {
74         m_request.requestFailed();
75     }
76
77 private:
78     WebUserMediaRequest m_request;
79 };
80
81 class MediaDevicesRequestTask : public WebMethodTask<WebUserMediaClientMock> {
82 public:
83     MediaDevicesRequestTask(WebUserMediaClientMock* object, const WebMediaDevicesRequest& request, const WebVector<WebMediaDeviceInfo>& result)
84         : WebMethodTask<WebUserMediaClientMock>(object)
85         , m_request(request)
86         , m_result(result)
87     {
88     }
89
90     virtual void runIfValid() OVERRIDE
91     {
92         m_request.requestSucceeded(m_result);
93     }
94
95 private:
96     WebMediaDevicesRequest m_request;
97     WebVector<WebMediaDeviceInfo> m_result;
98 };
99
100 ////////////////////////////////
101
102 class MockExtraData : public WebMediaStream::ExtraData {
103 public:
104     int foo;
105 };
106
107 WebUserMediaClientMock::WebUserMediaClientMock(WebTestDelegate* delegate)
108     : m_delegate(delegate)
109 {
110 }
111
112 void WebUserMediaClientMock::requestUserMedia(const WebUserMediaRequest& streamRequest)
113 {
114     DCHECK(!streamRequest.isNull());
115     WebUserMediaRequest request = streamRequest;
116
117     if (request.ownerDocument().isNull() || !request.ownerDocument().frame()) {
118         m_delegate->postTask(new UserMediaRequestPermissionDeniedTask(this, request));
119         return;
120     }
121
122     WebMediaConstraints constraints = request.audioConstraints();
123     WebString failedConstraint;
124     if (!constraints.isNull() && !MockConstraints::verifyConstraints(constraints, &failedConstraint)) {
125         m_delegate->postTask(new UserMediaRequestConstraintFailedTask(this, request, failedConstraint));
126         return;
127     }
128     constraints = request.videoConstraints();
129     if (!constraints.isNull() && !MockConstraints::verifyConstraints(constraints, &failedConstraint)) {
130         m_delegate->postTask(new UserMediaRequestConstraintFailedTask(this, request, failedConstraint));
131         return;
132     }
133
134     const size_t zero = 0;
135     const size_t one = 1;
136     WebVector<WebMediaStreamTrack> audioTracks(request.audio() ? one : zero);
137     WebVector<WebMediaStreamTrack> videoTracks(request.video() ? one : zero);
138
139     if (request.audio()) {
140         WebMediaStreamSource source;
141         source.initialize("MockAudioDevice#1", WebMediaStreamSource::TypeAudio, "Mock audio device");
142         audioTracks[0].initialize(source);
143     }
144
145     if (request.video()) {
146         WebMediaStreamSource source;
147         source.initialize("MockVideoDevice#1", WebMediaStreamSource::TypeVideo, "Mock video device");
148         videoTracks[0].initialize(source);
149     }
150
151     WebMediaStream stream;
152     stream.initialize(audioTracks, videoTracks);
153
154     stream.setExtraData(new MockExtraData());
155
156     m_delegate->postTask(new UserMediaRequestTask(this, request, stream));
157 }
158
159 void WebUserMediaClientMock::cancelUserMediaRequest(const WebUserMediaRequest&)
160 {
161 }
162
163 void WebUserMediaClientMock::requestMediaDevices(const WebMediaDevicesRequest& request)
164 {
165     const size_t three = 3;
166     WebVector<WebMediaDeviceInfo> devices(three);
167
168     devices[0].initialize("device1", WebMediaDeviceInfo::MediaDeviceKindAudioInput, "Built-in microphone", "group1");
169     devices[1].initialize("device2", WebMediaDeviceInfo::MediaDeviceKindAudioOutput, "Built-in speakers", "group1");
170     devices[2].initialize("device3", WebMediaDeviceInfo::MediaDeviceKindVideoInput, "Build-in webcam", "group2");
171
172     m_delegate->postTask(new MediaDevicesRequestTask(this, request, devices));
173 }
174
175 void WebUserMediaClientMock::cancelMediaDevicesRequest(const WebMediaDevicesRequest&)
176 {
177 }
178
179 }  // namespace content