Skip to content

Commit 188a9ef

Browse files
authored
Listen to vrdisplayconnect/vrdisplaydisconnect to enter/exit VR when a headset is plugged/unplugged (#2900)
t push -f dmarcos# Date: Tue Jul 25 17:49:24 2017 -0700
1 parent a21848c commit 188a9ef

File tree

2 files changed

+51
-4
lines changed

2 files changed

+51
-4
lines changed

src/core/scene/a-scene.js

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,22 @@ module.exports.AScene = registerElement('a-scene', {
117117
this.onVRPresentChangeBound = bind(this.onVRPresentChange, this);
118118
window.addEventListener('vrdisplaypresentchange', this.onVRPresentChangeBound);
119119

120+
// bind functions
121+
this.enterVRBound = function () { self.enterVR(); };
122+
this.exitVRBound = function () { self.exitVR(); };
123+
this.exitVRTrueBound = function () { self.exitVR(true); };
124+
120125
// Enter VR on `vrdisplayactivate` (e.g. putting on Rift headset).
121-
window.addEventListener('vrdisplayactivate', function () { self.enterVR(); });
126+
window.addEventListener('vrdisplayactivate', this.enterVRBound);
122127

123128
// Exit VR on `vrdisplaydeactivate` (e.g. taking off Rift headset).
124-
window.addEventListener('vrdisplaydeactivate', function () { self.exitVR(); });
129+
window.addEventListener('vrdisplaydeactivate', this.exitVRBound);
130+
131+
// Enter VR on `vrdisplayconnect` (e.g. plugging on Rift headset).
132+
window.addEventListener('vrdisplayconnect', this.enterVRBound);
133+
134+
// Exit VR on `vrdisplaydisconnect` (e.g. unplugging Rift headset).
135+
window.addEventListener('vrdisplaydisconnect', this.exitVRTrueBound);
125136
},
126137
writable: window.debug
127138
},
@@ -165,6 +176,10 @@ module.exports.AScene = registerElement('a-scene', {
165176
scenes.splice(sceneIndex, 1);
166177

167178
window.removeEventListener('vrdisplaypresentchange', this.onVRPresentChangeBound);
179+
window.removeEventListener('vrdisplayactivate', this.enterVRBound);
180+
window.removeEventListener('vrdisplaydeactivate', this.exitVRBound);
181+
window.removeEventListener('vrdisplayconnect', this.enterVRBound);
182+
window.removeEventListener('vrdisplaydisconnect', this.exitVRTrueBound);
168183
}
169184
},
170185

@@ -249,7 +264,8 @@ module.exports.AScene = registerElement('a-scene', {
249264
throw new Error('Failed to enter VR mode (`requestPresent`).');
250265
}
251266
}
252-
}
267+
},
268+
writable: window.debug
253269
},
254270
/**
255271
* Call `exitPresent` if WebVR or WebVR polyfill.
@@ -298,7 +314,8 @@ module.exports.AScene = registerElement('a-scene', {
298314
throw new Error('Failed to exit VR mode (`exitPresent`).');
299315
}
300316
}
301-
}
317+
},
318+
writable: window.debug
302319
},
303320

304321
/**

tests/core/scene/a-scene.test.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,36 @@ suite('a-scene (without renderer)', function () {
6060
});
6161
});
6262

63+
suite('vrdisplayconnect', function () {
64+
test('tells A-Frame about entering VR when the headset is connected', function (done) {
65+
var event;
66+
var sceneEl = this.el;
67+
var enterVRStub = this.sinon.stub(sceneEl, 'enterVR');
68+
sceneEl.effect = {requestPresent: function () { return Promise.resolve(); }};
69+
event = new CustomEvent('vrdisplayconnect');
70+
window.dispatchEvent(event);
71+
process.nextTick(function () {
72+
assert.ok(enterVRStub.called);
73+
done();
74+
});
75+
});
76+
});
77+
78+
suite('vrdisplaydisconnect', function () {
79+
test('tells A-Frame about entering VR when the headset is disconnected', function (done) {
80+
var event;
81+
var sceneEl = this.el;
82+
var exitVRStub = this.sinon.stub(sceneEl, 'exitVR');
83+
sceneEl.effect = {requestPresent: function () { return Promise.resolve(); }};
84+
event = new CustomEvent('vrdisplaydisconnect');
85+
window.dispatchEvent(event);
86+
process.nextTick(function () {
87+
assert.ok(exitVRStub.calledWith(true));
88+
done();
89+
});
90+
});
91+
});
92+
6393
suite('vrdisplaypresentchange', function () {
6494
test('tells A-Frame about entering VR if now presenting', function (done) {
6595
var event;

0 commit comments

Comments
 (0)