/src/mozilla-central/dom/vr/VRServiceTest.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ |
2 | | /* vim: set ts=8 sts=2 et sw=2 tw=80: */ |
3 | | /* This Source Code Form is subject to the terms of the Mozilla Public |
4 | | * License, v. 2.0. If a copy of the MPL was not distributed with this file, |
5 | | * You can obtain one at http://mozilla.org/MPL/2.0/. */ |
6 | | |
7 | | #include "mozilla/dom/VRServiceTest.h" |
8 | | #include "mozilla/dom/VRServiceTestBinding.h" |
9 | | |
10 | | namespace mozilla { |
11 | | namespace dom { |
12 | | |
13 | | NS_IMPL_CYCLE_COLLECTION_CLASS(VRMockDisplay) |
14 | | |
15 | 0 | NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(VRMockDisplay, |
16 | 0 | DOMEventTargetHelper) |
17 | 0 | NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END |
18 | | |
19 | 0 | NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(VRMockDisplay, |
20 | 0 | DOMEventTargetHelper) |
21 | 0 | NS_IMPL_CYCLE_COLLECTION_UNLINK_END |
22 | | |
23 | 0 | NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(VRMockDisplay) |
24 | 0 | NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) |
25 | | |
26 | | NS_IMPL_ADDREF_INHERITED(VRMockDisplay, DOMEventTargetHelper) |
27 | | NS_IMPL_RELEASE_INHERITED(VRMockDisplay, DOMEventTargetHelper) |
28 | | |
29 | | VRMockDisplay::VRMockDisplay(const nsCString& aID, uint32_t aDeviceID) |
30 | | : mDeviceID(aDeviceID) |
31 | | , mDisplayInfo{} |
32 | | , mSensorState{} |
33 | | , mTimestamp(TimeStamp::Now()) |
34 | 0 | { |
35 | 0 | VRDisplayState& state = mDisplayInfo.mDisplayState; |
36 | 0 | strncpy(state.mDisplayName, aID.BeginReading(), kVRDisplayNameMaxLen); |
37 | 0 | mDisplayInfo.mType = VRDeviceType::Puppet; |
38 | 0 | state.mIsConnected = true; |
39 | 0 | state.mIsMounted = false; |
40 | 0 | state.mCapabilityFlags = VRDisplayCapabilityFlags::Cap_None | |
41 | 0 | VRDisplayCapabilityFlags::Cap_Orientation | |
42 | 0 | VRDisplayCapabilityFlags::Cap_AngularAcceleration | |
43 | 0 | VRDisplayCapabilityFlags::Cap_Position | |
44 | 0 | VRDisplayCapabilityFlags::Cap_LinearAcceleration | |
45 | 0 | VRDisplayCapabilityFlags::Cap_External | |
46 | 0 | VRDisplayCapabilityFlags::Cap_Present | |
47 | 0 | VRDisplayCapabilityFlags::Cap_StageParameters | |
48 | 0 | VRDisplayCapabilityFlags::Cap_MountDetection; |
49 | 0 | } |
50 | | |
51 | | JSObject* |
52 | | VRMockDisplay::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) |
53 | 0 | { |
54 | 0 | return VRMockDisplay_Binding::Wrap(aCx, this, aGivenProto); |
55 | 0 | } |
56 | | |
57 | | void VRMockDisplay::SetEyeResolution(unsigned long aRenderWidth, unsigned long aRenderHeight) |
58 | 0 | { |
59 | 0 | mDisplayInfo.mDisplayState.mEyeResolution.width = aRenderWidth; |
60 | 0 | mDisplayInfo.mDisplayState.mEyeResolution.height = aRenderHeight; |
61 | 0 | } |
62 | | |
63 | | void |
64 | | VRMockDisplay::SetEyeParameter(VREye aEye, double aOffsetX, double aOffsetY, |
65 | | double aOffsetZ, double aUpDegree, double aRightDegree, |
66 | | double aDownDegree, double aLeftDegree) |
67 | 0 | { |
68 | 0 | uint32_t eye = static_cast<uint32_t>(aEye); |
69 | 0 | mDisplayInfo.mDisplayState.mEyeFOV[eye] = gfx ::VRFieldOfView(aUpDegree, aRightDegree, |
70 | 0 | aRightDegree, aLeftDegree); |
71 | 0 | mDisplayInfo.mDisplayState.mEyeTranslation[eye].x = aOffsetX; |
72 | 0 | mDisplayInfo.mDisplayState.mEyeTranslation[eye].y = aOffsetY; |
73 | 0 | mDisplayInfo.mDisplayState.mEyeTranslation[eye].z = aOffsetZ; |
74 | 0 | } |
75 | | |
76 | | void |
77 | | VRMockDisplay::SetPose(const Nullable<Float32Array>& aPosition, |
78 | | const Nullable<Float32Array>& aLinearVelocity, |
79 | | const Nullable<Float32Array>& aLinearAcceleration, |
80 | | const Nullable<Float32Array>& aOrientation, |
81 | | const Nullable<Float32Array>& aAngularVelocity, |
82 | | const Nullable<Float32Array>& aAngularAcceleration) |
83 | 0 | { |
84 | 0 | mSensorState.Clear(); |
85 | 0 | mSensorState.timestamp = (TimeStamp::Now() - mTimestamp).ToSeconds(); |
86 | 0 | mSensorState.flags = VRDisplayCapabilityFlags::Cap_Orientation | |
87 | 0 | VRDisplayCapabilityFlags::Cap_Position | |
88 | 0 | VRDisplayCapabilityFlags::Cap_AngularAcceleration | |
89 | 0 | VRDisplayCapabilityFlags::Cap_LinearAcceleration | |
90 | 0 | VRDisplayCapabilityFlags::Cap_External | |
91 | 0 | VRDisplayCapabilityFlags::Cap_MountDetection | |
92 | 0 | VRDisplayCapabilityFlags::Cap_Present; |
93 | 0 |
|
94 | 0 | if (!aOrientation.IsNull()) { |
95 | 0 | const Float32Array& value = aOrientation.Value(); |
96 | 0 | value.ComputeLengthAndData(); |
97 | 0 | MOZ_ASSERT(value.Length() == 4); |
98 | 0 | mSensorState.pose.orientation[0] = value.Data()[0]; |
99 | 0 | mSensorState.pose.orientation[1] = value.Data()[1]; |
100 | 0 | mSensorState.pose.orientation[2] = value.Data()[2]; |
101 | 0 | mSensorState.pose.orientation[3] = value.Data()[3]; |
102 | 0 | } |
103 | 0 | if (!aAngularVelocity.IsNull()) { |
104 | 0 | const Float32Array& value = aAngularVelocity.Value(); |
105 | 0 | value.ComputeLengthAndData(); |
106 | 0 | MOZ_ASSERT(value.Length() == 3); |
107 | 0 | mSensorState.pose.angularVelocity[0] = value.Data()[0]; |
108 | 0 | mSensorState.pose.angularVelocity[1] = value.Data()[1]; |
109 | 0 | mSensorState.pose.angularVelocity[2] = value.Data()[2]; |
110 | 0 | } |
111 | 0 | if (!aAngularAcceleration.IsNull()) { |
112 | 0 | const Float32Array& value = aAngularAcceleration.Value(); |
113 | 0 | value.ComputeLengthAndData(); |
114 | 0 | MOZ_ASSERT(value.Length() == 3); |
115 | 0 | mSensorState.pose.angularAcceleration[0] = value.Data()[0]; |
116 | 0 | mSensorState.pose.angularAcceleration[1] = value.Data()[1]; |
117 | 0 | mSensorState.pose.angularAcceleration[2] = value.Data()[2]; |
118 | 0 | } |
119 | 0 | if (!aPosition.IsNull()) { |
120 | 0 | const Float32Array& value = aPosition.Value(); |
121 | 0 | value.ComputeLengthAndData(); |
122 | 0 | MOZ_ASSERT(value.Length() == 3); |
123 | 0 | mSensorState.pose.position[0] = value.Data()[0]; |
124 | 0 | mSensorState.pose.position[1] = value.Data()[1]; |
125 | 0 | mSensorState.pose.position[2] = value.Data()[2]; |
126 | 0 | } |
127 | 0 | if (!aLinearVelocity.IsNull()) { |
128 | 0 | const Float32Array& value = aLinearVelocity.Value(); |
129 | 0 | value.ComputeLengthAndData(); |
130 | 0 | MOZ_ASSERT(value.Length() == 3); |
131 | 0 | mSensorState.pose.linearVelocity[0] = value.Data()[0]; |
132 | 0 | mSensorState.pose.linearVelocity[1] = value.Data()[1]; |
133 | 0 | mSensorState.pose.linearVelocity[2] = value.Data()[2]; |
134 | 0 | } |
135 | 0 | if (!aLinearAcceleration.IsNull()) { |
136 | 0 | const Float32Array& value = aLinearAcceleration.Value(); |
137 | 0 | value.ComputeLengthAndData(); |
138 | 0 | MOZ_ASSERT(value.Length() == 3); |
139 | 0 | mSensorState.pose.linearAcceleration[0] = value.Data()[0]; |
140 | 0 | mSensorState.pose.linearAcceleration[1] = value.Data()[1]; |
141 | 0 | mSensorState.pose.linearAcceleration[2] = value.Data()[2]; |
142 | 0 | } |
143 | 0 | } |
144 | | |
145 | | void |
146 | | VRMockDisplay::Update() |
147 | 0 | { |
148 | 0 | gfx::VRManagerChild* vm = gfx::VRManagerChild::Get(); |
149 | 0 |
|
150 | 0 | vm->SendSetSensorStateToMockDisplay(mDeviceID, mSensorState); |
151 | 0 | vm->SendSetDisplayInfoToMockDisplay(mDeviceID, mDisplayInfo); |
152 | 0 | } |
153 | | |
154 | | NS_IMPL_CYCLE_COLLECTION_CLASS(VRMockController) |
155 | | |
156 | 0 | NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(VRMockController, |
157 | 0 | DOMEventTargetHelper) |
158 | 0 | NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END |
159 | | |
160 | 0 | NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(VRMockController, |
161 | 0 | DOMEventTargetHelper) |
162 | 0 | NS_IMPL_CYCLE_COLLECTION_UNLINK_END |
163 | | |
164 | 0 | NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(VRMockController) |
165 | 0 | NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) |
166 | | |
167 | | NS_IMPL_ADDREF_INHERITED(VRMockController, DOMEventTargetHelper) |
168 | | NS_IMPL_RELEASE_INHERITED(VRMockController, DOMEventTargetHelper) |
169 | | |
170 | | VRMockController::VRMockController(const nsCString& aID, uint32_t aDeviceID) |
171 | | : mID(aID), mDeviceID(aDeviceID) |
172 | 0 | { |
173 | 0 | } |
174 | | |
175 | | JSObject* |
176 | | VRMockController::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) |
177 | 0 | { |
178 | 0 | return VRMockController_Binding::Wrap(aCx, this, aGivenProto); |
179 | 0 | } |
180 | | |
181 | | void |
182 | | VRMockController::NewButtonEvent(unsigned long aButton, bool aPressed) |
183 | 0 | { |
184 | 0 | gfx::VRManagerChild* vm = gfx::VRManagerChild::Get(); |
185 | 0 | vm->SendNewButtonEventToMockController(mDeviceID, aButton, aPressed); |
186 | 0 | } |
187 | | |
188 | | void |
189 | | VRMockController::NewAxisMoveEvent(unsigned long aAxis, double aValue) |
190 | 0 | { |
191 | 0 | gfx::VRManagerChild* vm = gfx::VRManagerChild::Get(); |
192 | 0 | vm->SendNewAxisMoveEventToMockController(mDeviceID, aAxis, aValue); |
193 | 0 | } |
194 | | |
195 | | void |
196 | | VRMockController::NewPoseMove(const Nullable<Float32Array>& aPosition, |
197 | | const Nullable<Float32Array>& aLinearVelocity, |
198 | | const Nullable<Float32Array>& aLinearAcceleration, |
199 | | const Nullable<Float32Array>& aOrientation, |
200 | | const Nullable<Float32Array>& aAngularVelocity, |
201 | | const Nullable<Float32Array>& aAngularAcceleration) |
202 | 0 | { |
203 | 0 | gfx::VRManagerChild* vm = gfx::VRManagerChild::Get(); |
204 | 0 | GamepadPoseState poseState; |
205 | 0 |
|
206 | 0 | poseState.flags = GamepadCapabilityFlags::Cap_Orientation | |
207 | 0 | GamepadCapabilityFlags::Cap_Position | |
208 | 0 | GamepadCapabilityFlags::Cap_AngularAcceleration | |
209 | 0 | GamepadCapabilityFlags::Cap_LinearAcceleration; |
210 | 0 | if (!aOrientation.IsNull()) { |
211 | 0 | const Float32Array& value = aOrientation.Value(); |
212 | 0 | value.ComputeLengthAndData(); |
213 | 0 | MOZ_ASSERT(value.Length() == 4); |
214 | 0 | poseState.orientation[0] = value.Data()[0]; |
215 | 0 | poseState.orientation[1] = value.Data()[1]; |
216 | 0 | poseState.orientation[2] = value.Data()[2]; |
217 | 0 | poseState.orientation[3] = value.Data()[3]; |
218 | 0 | poseState.isOrientationValid = true; |
219 | 0 | } |
220 | 0 | if (!aPosition.IsNull()) { |
221 | 0 | const Float32Array& value = aPosition.Value(); |
222 | 0 | value.ComputeLengthAndData(); |
223 | 0 | MOZ_ASSERT(value.Length() == 3); |
224 | 0 | poseState.position[0] = value.Data()[0]; |
225 | 0 | poseState.position[1] = value.Data()[1]; |
226 | 0 | poseState.position[2] = value.Data()[2]; |
227 | 0 | poseState.isPositionValid = true; |
228 | 0 | } |
229 | 0 | if (!aAngularVelocity.IsNull()) { |
230 | 0 | const Float32Array& value = aAngularVelocity.Value(); |
231 | 0 | value.ComputeLengthAndData(); |
232 | 0 | MOZ_ASSERT(value.Length() == 3); |
233 | 0 | poseState.angularVelocity[0] = value.Data()[0]; |
234 | 0 | poseState.angularVelocity[1] = value.Data()[1]; |
235 | 0 | poseState.angularVelocity[2] = value.Data()[2]; |
236 | 0 | } |
237 | 0 | if (!aAngularAcceleration.IsNull()) { |
238 | 0 | const Float32Array& value = aAngularAcceleration.Value(); |
239 | 0 | value.ComputeLengthAndData(); |
240 | 0 | MOZ_ASSERT(value.Length() == 3); |
241 | 0 | poseState.angularAcceleration[0] = value.Data()[0]; |
242 | 0 | poseState.angularAcceleration[1] = value.Data()[1]; |
243 | 0 | poseState.angularAcceleration[2] = value.Data()[2]; |
244 | 0 | } |
245 | 0 | if (!aLinearVelocity.IsNull()) { |
246 | 0 | const Float32Array& value = aLinearVelocity.Value(); |
247 | 0 | value.ComputeLengthAndData(); |
248 | 0 | MOZ_ASSERT(value.Length() == 3); |
249 | 0 | poseState.linearVelocity[0] = value.Data()[0]; |
250 | 0 | poseState.linearVelocity[1] = value.Data()[1]; |
251 | 0 | poseState.linearVelocity[2] = value.Data()[2]; |
252 | 0 | } |
253 | 0 | if (!aLinearAcceleration.IsNull()) { |
254 | 0 | const Float32Array& value = aLinearAcceleration.Value(); |
255 | 0 | value.ComputeLengthAndData(); |
256 | 0 | MOZ_ASSERT(value.Length() == 3); |
257 | 0 | poseState.linearAcceleration[0] = value.Data()[0]; |
258 | 0 | poseState.linearAcceleration[1] = value.Data()[1]; |
259 | 0 | poseState.linearAcceleration[2] = value.Data()[2]; |
260 | 0 | } |
261 | 0 | vm->SendNewPoseMoveToMockController(mDeviceID, poseState); |
262 | 0 | } |
263 | | |
264 | | NS_IMPL_CYCLE_COLLECTION_CLASS(VRServiceTest) |
265 | | |
266 | 0 | NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(VRServiceTest, |
267 | 0 | DOMEventTargetHelper) |
268 | 0 | NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END |
269 | | |
270 | 0 | NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(VRServiceTest, |
271 | 0 | DOMEventTargetHelper) |
272 | 0 | NS_IMPL_CYCLE_COLLECTION_UNLINK_END |
273 | | |
274 | 0 | NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(VRServiceTest) |
275 | 0 | NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) |
276 | | |
277 | | NS_IMPL_ADDREF_INHERITED(VRServiceTest, DOMEventTargetHelper) |
278 | | NS_IMPL_RELEASE_INHERITED(VRServiceTest, DOMEventTargetHelper) |
279 | | |
280 | | |
281 | | JSObject* |
282 | | VRServiceTest::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) |
283 | 0 | { |
284 | 0 | return VRServiceTest_Binding::Wrap(aCx, this, aGivenProto); |
285 | 0 | } |
286 | | |
287 | | // static |
288 | | already_AddRefed<VRServiceTest> |
289 | | VRServiceTest::CreateTestService(nsPIDOMWindowInner* aWindow) |
290 | 0 | { |
291 | 0 | MOZ_ASSERT(aWindow); |
292 | 0 | RefPtr<VRServiceTest> service = new VRServiceTest(aWindow); |
293 | 0 | return service.forget(); |
294 | 0 | } |
295 | | |
296 | | VRServiceTest::VRServiceTest(nsPIDOMWindowInner* aWindow) |
297 | | : mWindow(aWindow), |
298 | | mShuttingDown(false) |
299 | 0 | { |
300 | 0 | gfx::VRManagerChild* vm = gfx::VRManagerChild::Get(); |
301 | 0 | vm->SendCreateVRTestSystem(); |
302 | 0 | } |
303 | | |
304 | | void |
305 | | VRServiceTest::Shutdown() |
306 | 0 | { |
307 | 0 | MOZ_ASSERT(!mShuttingDown); |
308 | 0 | mShuttingDown = true; |
309 | 0 | mWindow = nullptr; |
310 | 0 | } |
311 | | |
312 | | already_AddRefed<Promise> |
313 | | VRServiceTest::AttachVRDisplay(const nsAString& aID, ErrorResult& aRv) |
314 | 0 | { |
315 | 0 | if (mShuttingDown) { |
316 | 0 | return nullptr; |
317 | 0 | } |
318 | 0 | |
319 | 0 | RefPtr<Promise> p = Promise::Create(mWindow->AsGlobal(), aRv); |
320 | 0 | if (NS_WARN_IF(aRv.Failed())) { |
321 | 0 | return nullptr; |
322 | 0 | } |
323 | 0 | |
324 | 0 | gfx::VRManagerChild* vm = gfx::VRManagerChild::Get(); |
325 | 0 | vm->CreateVRServiceTestDisplay(NS_ConvertUTF16toUTF8(aID), p); |
326 | 0 |
|
327 | 0 | return p.forget(); |
328 | 0 | } |
329 | | |
330 | | already_AddRefed<Promise> |
331 | | VRServiceTest::AttachVRController(const nsAString& aID, ErrorResult& aRv) |
332 | 0 | { |
333 | 0 | if (mShuttingDown) { |
334 | 0 | return nullptr; |
335 | 0 | } |
336 | 0 | |
337 | 0 | RefPtr<Promise> p = Promise::Create(mWindow->AsGlobal(), aRv); |
338 | 0 | if (NS_WARN_IF(aRv.Failed())) { |
339 | 0 | return nullptr; |
340 | 0 | } |
341 | 0 | |
342 | 0 | gfx::VRManagerChild* vm = gfx::VRManagerChild::Get(); |
343 | 0 | vm->CreateVRServiceTestController(NS_ConvertUTF16toUTF8(aID), p); |
344 | 0 |
|
345 | 0 | return p.forget(); |
346 | 0 | } |
347 | | |
348 | | } // namespace dom |
349 | | } // namespace mozilla |