Coverage Report

Created: 2018-09-25 14:53

/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