Skip to content

Commit ee3a5b1

Browse files
committed
Bug 1714703 - Promisify GamepadServiceTest r=tjr,peterv
make GamepadServiceTest's methods return promises, so to avoid testing with flaky setTimeout(). Differential Revision: https://phabricator.services.mozilla.com/D117258
1 parent 66ff038 commit ee3a5b1

13 files changed

+326
-255
lines changed

browser/components/resistfingerprinting/test/mochitest/test_hide_gamepad_info_iframe.html

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,42 @@
44
<script>
55
var SimpleTest = window.parent.SimpleTest;
66

7-
function gamepadEventHandler() {
8-
SimpleTest.ok(false, "privacy.resistFingerprinting is true, should not receive any gamepad events");
7+
function forceFail() {
8+
SimpleTest.ok(
9+
false,
10+
"privacy.resistFingerprinting is true, should not receive any gamepad events"
11+
);
912
}
1013

11-
window.addEventListener("gamepadconnected", gamepadEventHandler);
12-
window.addEventListener("gamepaddisconnected", gamepadEventHandler);
13-
window.addEventListener("gamepadbuttondown", gamepadEventHandler);
14+
window.addEventListener("gamepadconnected", forceFail);
15+
window.addEventListener("gamepaddisconnected", forceFail);
16+
window.addEventListener("gamepadbuttondown", forceFail);
1417

15-
var GamepadService = navigator.requestGamepadServiceTest();
16-
GamepadService.addGamepad(
18+
window.addEventListener("load", async () => {
19+
const service = navigator.requestGamepadServiceTest();
20+
const buttonIndex = await service.addGamepad(
1721
"test gamepad", // id
18-
GamepadService.standardMapping,
19-
GamepadService.noHand,
22+
service.standardMapping,
23+
service.noHand,
2024
4, // buttons
2125
2,
2226
0,
2327
0,
24-
0).then((aIndex) => new Promise((aResolve) => {
25-
// Press a button to make the gamepad visible to the page.
26-
GamepadService.newButtonEvent(aIndex, 0, true, true);
28+
0
29+
);
2730

28-
// Wait for a while in order to guarantee navigator.getGamepads() can
29-
// get up-to-date result.
30-
setTimeout(() => aResolve(aIndex), 1000);
31-
})).then((aIndex) => new Promise((aResolve) => {
32-
SimpleTest.is(navigator.getGamepads().length, 0,
33-
"privacy.resistFingerprinting is true, navigator.getGamepads() should always return an empty array");
34-
GamepadService.removeGamepad(aIndex);
31+
// Press a button to make the gamepad visible to the page.
32+
await service.newButtonEvent(buttonIndex, 0, true, true);
3533

36-
// Wait for gamepad events to be fired.
37-
setTimeout(() => aResolve(), 3000);
38-
})).then(() => {
39-
SimpleTest.finish();
40-
});
34+
const { length } = navigator.getGamepads();
35+
SimpleTest.is(
36+
length,
37+
0,
38+
"privacy.resistFingerprinting is true, navigator.getGamepads() should always return an empty array"
39+
);
40+
41+
// Attempt to force gamepad events to be fired, by simulating gamepad disconnect
42+
await service.removeGamepad(buttonIndex);
43+
SimpleTest.finish();
44+
});
4145
</script>

dom/gamepad/GamepadServiceTest.cpp

Lines changed: 72 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ already_AddRefed<Promise> GamepadServiceTest::AddGamepad(
133133
return p.forget();
134134
}
135135

136-
void GamepadServiceTest::RemoveGamepad(uint32_t aHandleSlot) {
136+
already_AddRefed<Promise> GamepadServiceTest::RemoveGamepad(
137+
uint32_t aHandleSlot, ErrorResult& aRv) {
137138
if (mShuttingDown) {
138-
return;
139+
return nullptr;
139140
}
140141

141142
GamepadHandle gamepadHandle = GetHandleInSlot(aHandleSlot);
@@ -145,13 +146,24 @@ void GamepadServiceTest::RemoveGamepad(uint32_t aHandleSlot) {
145146
GamepadChangeEvent e(gamepadHandle, body);
146147

147148
uint32_t id = ++mEventNumber;
149+
150+
RefPtr<Promise> p = Promise::Create(mWindow->AsGlobal(), aRv);
151+
if (aRv.Failed()) {
152+
return nullptr;
153+
}
154+
155+
MOZ_ASSERT(!mPromiseList.Contains(id));
156+
mPromiseList.InsertOrUpdate(id, RefPtr{p});
157+
148158
mChild->SendGamepadTestEvent(id, e);
159+
return p.forget();
149160
}
150161

151-
void GamepadServiceTest::NewButtonEvent(uint32_t aHandleSlot, uint32_t aButton,
152-
bool aPressed, bool aTouched) {
162+
already_AddRefed<Promise> GamepadServiceTest::NewButtonEvent(
163+
uint32_t aHandleSlot, uint32_t aButton, bool aPressed, bool aTouched,
164+
ErrorResult& aRv) {
153165
if (mShuttingDown) {
154-
return;
166+
return nullptr;
155167
}
156168

157169
GamepadHandle gamepadHandle = GetHandleInSlot(aHandleSlot);
@@ -161,14 +173,22 @@ void GamepadServiceTest::NewButtonEvent(uint32_t aHandleSlot, uint32_t aButton,
161173
GamepadChangeEvent e(gamepadHandle, body);
162174

163175
uint32_t id = ++mEventNumber;
176+
RefPtr<Promise> p = Promise::Create(mWindow->AsGlobal(), aRv);
177+
if (aRv.Failed()) {
178+
return nullptr;
179+
}
180+
181+
MOZ_ASSERT(!mPromiseList.Contains(id));
182+
mPromiseList.InsertOrUpdate(id, RefPtr{p});
164183
mChild->SendGamepadTestEvent(id, e);
184+
return p.forget();
165185
}
166186

167-
void GamepadServiceTest::NewButtonValueEvent(uint32_t aHandleSlot,
168-
uint32_t aButton, bool aPressed,
169-
bool aTouched, double aValue) {
187+
already_AddRefed<Promise> GamepadServiceTest::NewButtonValueEvent(
188+
uint32_t aHandleSlot, uint32_t aButton, bool aPressed, bool aTouched,
189+
double aValue, ErrorResult& aRv) {
170190
if (mShuttingDown) {
171-
return;
191+
return nullptr;
172192
}
173193

174194
GamepadHandle gamepadHandle = GetHandleInSlot(aHandleSlot);
@@ -178,13 +198,21 @@ void GamepadServiceTest::NewButtonValueEvent(uint32_t aHandleSlot,
178198
GamepadChangeEvent e(gamepadHandle, body);
179199

180200
uint32_t id = ++mEventNumber;
201+
RefPtr<Promise> p = Promise::Create(mWindow->AsGlobal(), aRv);
202+
if (aRv.Failed()) {
203+
return nullptr;
204+
}
205+
206+
MOZ_ASSERT(!mPromiseList.Contains(id));
207+
mPromiseList.InsertOrUpdate(id, RefPtr{p});
181208
mChild->SendGamepadTestEvent(id, e);
209+
return p.forget();
182210
}
183211

184-
void GamepadServiceTest::NewAxisMoveEvent(uint32_t aHandleSlot, uint32_t aAxis,
185-
double aValue) {
212+
already_AddRefed<Promise> GamepadServiceTest::NewAxisMoveEvent(
213+
uint32_t aHandleSlot, uint32_t aAxis, double aValue, ErrorResult& aRv) {
186214
if (mShuttingDown) {
187-
return;
215+
return nullptr;
188216
}
189217

190218
GamepadHandle gamepadHandle = GetHandleInSlot(aHandleSlot);
@@ -194,18 +222,26 @@ void GamepadServiceTest::NewAxisMoveEvent(uint32_t aHandleSlot, uint32_t aAxis,
194222
GamepadChangeEvent e(gamepadHandle, body);
195223

196224
uint32_t id = ++mEventNumber;
225+
RefPtr<Promise> p = Promise::Create(mWindow->AsGlobal(), aRv);
226+
if (aRv.Failed()) {
227+
return nullptr;
228+
}
229+
230+
MOZ_ASSERT(!mPromiseList.Contains(id));
231+
mPromiseList.InsertOrUpdate(id, RefPtr{p});
197232
mChild->SendGamepadTestEvent(id, e);
233+
return p.forget();
198234
}
199235

200-
void GamepadServiceTest::NewPoseMove(
236+
already_AddRefed<Promise> GamepadServiceTest::NewPoseMove(
201237
uint32_t aHandleSlot, const Nullable<Float32Array>& aOrient,
202238
const Nullable<Float32Array>& aPos,
203239
const Nullable<Float32Array>& aAngVelocity,
204240
const Nullable<Float32Array>& aAngAcceleration,
205241
const Nullable<Float32Array>& aLinVelocity,
206-
const Nullable<Float32Array>& aLinAcceleration) {
242+
const Nullable<Float32Array>& aLinAcceleration, ErrorResult& aRv) {
207243
if (mShuttingDown) {
208-
return;
244+
return nullptr;
209245
}
210246

211247
GamepadHandle gamepadHandle = GetHandleInSlot(aHandleSlot);
@@ -272,15 +308,23 @@ void GamepadServiceTest::NewPoseMove(
272308
GamepadChangeEvent e(gamepadHandle, body);
273309

274310
uint32_t id = ++mEventNumber;
311+
RefPtr<Promise> p = Promise::Create(mWindow->AsGlobal(), aRv);
312+
if (aRv.Failed()) {
313+
return nullptr;
314+
}
315+
316+
MOZ_ASSERT(!mPromiseList.Contains(id));
317+
mPromiseList.InsertOrUpdate(id, RefPtr{p});
275318
mChild->SendGamepadTestEvent(id, e);
319+
return p.forget();
276320
}
277321

278-
void GamepadServiceTest::NewTouch(uint32_t aHandleSlot,
279-
uint32_t aTouchArrayIndex, uint32_t aTouchId,
280-
uint8_t aSurfaceId, const Float32Array& aPos,
281-
const Nullable<Float32Array>& aSurfDim) {
322+
already_AddRefed<Promise> GamepadServiceTest::NewTouch(
323+
uint32_t aHandleSlot, uint32_t aTouchArrayIndex, uint32_t aTouchId,
324+
uint8_t aSurfaceId, const Float32Array& aPos,
325+
const Nullable<Float32Array>& aSurfDim, ErrorResult& aRv) {
282326
if (mShuttingDown) {
283-
return;
327+
return nullptr;
284328
}
285329

286330
GamepadHandle gamepadHandle = GetHandleInSlot(aHandleSlot);
@@ -308,7 +352,15 @@ void GamepadServiceTest::NewTouch(uint32_t aHandleSlot,
308352
GamepadChangeEvent e(gamepadHandle, body);
309353

310354
uint32_t id = ++mEventNumber;
355+
RefPtr<Promise> p = Promise::Create(mWindow->AsGlobal(), aRv);
356+
if (aRv.Failed()) {
357+
return nullptr;
358+
}
359+
360+
MOZ_ASSERT(!mPromiseList.Contains(id));
361+
mPromiseList.InsertOrUpdate(id, RefPtr{p});
311362
mChild->SendGamepadTestEvent(id, e);
363+
return p.forget();
312364
}
313365

314366
JSObject* GamepadServiceTest::WrapObject(JSContext* aCx,

dom/gamepad/GamepadServiceTest.h

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,27 +37,46 @@ class GamepadServiceTest final : public DOMEventTargetHelper,
3737
GamepadHand LeftHand() const { return GamepadHand::Left; }
3838
GamepadHand RightHand() const { return GamepadHand::Right; }
3939

40+
// IPC receiver
41+
void ReplyGamepadHandle(uint32_t aPromiseId, const GamepadHandle& aHandle);
42+
43+
// Methods from GamepadServiceTest.webidl
4044
already_AddRefed<Promise> AddGamepad(
4145
const nsAString& aID, GamepadMappingType aMapping, GamepadHand aHand,
4246
uint32_t aNumButtons, uint32_t aNumAxes, uint32_t aNumHaptics,
4347
uint32_t aNumLightIndicator, uint32_t aNumTouchEvents, ErrorResult& aRv);
44-
void ReplyGamepadHandle(uint32_t aPromiseId, const GamepadHandle& aHandle);
4548

46-
void RemoveGamepad(uint32_t aHandleSlot);
47-
void NewButtonEvent(uint32_t aHandleSlot, uint32_t aButton, bool aPressed,
48-
bool aTouched);
49-
void NewButtonValueEvent(uint32_t aHandleSlot, uint32_t aButton,
50-
bool aPressed, bool aTouched, double aValue);
51-
void NewAxisMoveEvent(uint32_t aHandleSlot, uint32_t aAxis, double aValue);
52-
void NewPoseMove(uint32_t aHandleSlot, const Nullable<Float32Array>& aOrient,
53-
const Nullable<Float32Array>& aPos,
54-
const Nullable<Float32Array>& aAngVelocity,
55-
const Nullable<Float32Array>& aAngAcceleration,
56-
const Nullable<Float32Array>& aLinVelocity,
57-
const Nullable<Float32Array>& aLinAcceleration);
58-
void NewTouch(uint32_t aHandleSlot, uint32_t aTouchArrayIndex,
59-
uint32_t aTouchId, uint8_t aSurfaceId, const Float32Array& aPos,
60-
const Nullable<Float32Array>& aSurfDim);
49+
already_AddRefed<Promise> RemoveGamepad(uint32_t aHandleSlot,
50+
ErrorResult& aRv);
51+
52+
already_AddRefed<Promise> NewButtonEvent(uint32_t aHandleSlot,
53+
uint32_t aButton, bool aPressed,
54+
bool aTouched, ErrorResult& aRv);
55+
56+
already_AddRefed<Promise> NewButtonValueEvent(uint32_t aHandleSlot,
57+
uint32_t aButton, bool aPressed,
58+
bool aTouched, double aValue,
59+
ErrorResult& aRv);
60+
61+
already_AddRefed<Promise> NewAxisMoveEvent(uint32_t aHandleSlot,
62+
uint32_t aAxis, double aValue,
63+
ErrorResult& aRv);
64+
65+
already_AddRefed<Promise> NewPoseMove(
66+
uint32_t aHandleSlot, const Nullable<Float32Array>& aOrient,
67+
const Nullable<Float32Array>& aPos,
68+
const Nullable<Float32Array>& aAngVelocity,
69+
const Nullable<Float32Array>& aAngAcceleration,
70+
const Nullable<Float32Array>& aLinVelocity,
71+
const Nullable<Float32Array>& aLinAcceleration, ErrorResult& aRv);
72+
73+
already_AddRefed<Promise> NewTouch(uint32_t aHandleSlot,
74+
uint32_t aTouchArrayIndex,
75+
uint32_t aTouchId, uint8_t aSurfaceId,
76+
const Float32Array& aPos,
77+
const Nullable<Float32Array>& aSurfDim,
78+
ErrorResult& aRv);
79+
6180
void Shutdown();
6281

6382
static already_AddRefed<GamepadServiceTest> CreateTestService(

dom/gamepad/ipc/GamepadTestChannelParent.cpp

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -87,34 +87,37 @@ mozilla::ipc::IPCResult GamepadTestChannelParent::RecvGamepadTestEvent(
8787

8888
GamepadHandle handle = aEvent.handle();
8989

90-
if (body.type() == GamepadChangeEventBody::TGamepadRemoved) {
91-
service->RemoveGamepad(handle);
92-
return IPC_OK();
93-
}
94-
if (body.type() == GamepadChangeEventBody::TGamepadButtonInformation) {
95-
const GamepadButtonInformation& a = body.get_GamepadButtonInformation();
96-
service->NewButtonEvent(handle, a.button(), a.pressed(), a.touched(),
97-
a.value());
98-
return IPC_OK();
99-
}
100-
if (body.type() == GamepadChangeEventBody::TGamepadAxisInformation) {
101-
const GamepadAxisInformation& a = body.get_GamepadAxisInformation();
102-
service->NewAxisMoveEvent(handle, a.axis(), a.value());
103-
return IPC_OK();
104-
}
105-
if (body.type() == GamepadChangeEventBody::TGamepadPoseInformation) {
106-
const GamepadPoseInformation& a = body.get_GamepadPoseInformation();
107-
service->NewPoseEvent(handle, a.pose_state());
108-
return IPC_OK();
109-
}
110-
if (body.type() == GamepadChangeEventBody::TGamepadTouchInformation) {
111-
const GamepadTouchInformation& a = body.get_GamepadTouchInformation();
112-
service->NewMultiTouchEvent(handle, a.index(), a.touch_state());
113-
return IPC_OK();
90+
switch (body.type()) {
91+
case GamepadChangeEventBody::TGamepadRemoved:
92+
service->RemoveGamepad(handle);
93+
break;
94+
case GamepadChangeEventBody::TGamepadButtonInformation: {
95+
const GamepadButtonInformation& a = body.get_GamepadButtonInformation();
96+
service->NewButtonEvent(handle, a.button(), a.pressed(), a.touched(),
97+
a.value());
98+
break;
99+
}
100+
case GamepadChangeEventBody::TGamepadAxisInformation: {
101+
const GamepadAxisInformation& a = body.get_GamepadAxisInformation();
102+
service->NewAxisMoveEvent(handle, a.axis(), a.value());
103+
break;
104+
}
105+
case GamepadChangeEventBody::TGamepadPoseInformation: {
106+
const GamepadPoseInformation& a = body.get_GamepadPoseInformation();
107+
service->NewPoseEvent(handle, a.pose_state());
108+
break;
109+
}
110+
case GamepadChangeEventBody::TGamepadTouchInformation: {
111+
const GamepadTouchInformation& a = body.get_GamepadTouchInformation();
112+
service->NewMultiTouchEvent(handle, a.index(), a.touch_state());
113+
break;
114+
}
115+
default:
116+
NS_WARNING("Unknown event type.");
117+
return IPC_FAIL_NO_REASON(this);
114118
}
115-
116-
NS_WARNING("Unknown event type.");
117-
return IPC_FAIL_NO_REASON(this);
119+
Unused << SendReplyGamepadHandle(aID, handle);
120+
return IPC_OK();
118121
}
119122

120123
} // namespace mozilla::dom

0 commit comments

Comments
 (0)