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