blob: 6cce422375abd7fd13bd60cff103ded4fca53fc8 [file] [log] [blame]
<!DOCTYPE html>
<html>
<body>
<script src="../resources/js-test.js"></script>
<script>
description("Tests that gamepad events are not fired when page is hidden but kept as pending and fired when the page becomes visible again.");
window.jsTestIsAsync = true;
var listeners;
function addListener(eventName, handler) {
if (!listeners)
listeners = new Array();
listeners.push({name: eventName, handler: handler});
window.addEventListener(eventName, handler);
}
function removeListeners() {
if (!listeners)
return;
listeners.forEach(function (l) {
window.removeEventListener(l.name, l.handler);
});
}
function finishSoon() {
setTimeout(finishJSTest, 50);
}
var eventCounter = 0;
var expectations = [
{ index: 0, connected: false, check: null },
{ index: 1, connected: false, check:
function(event) {
shouldBeEqualToString('event.gamepad.id', "old");
}
},
{ index: 1, connected: true, check:
function(event) {
shouldBeEqualToString('event.gamepad.id', "new");
}
},
{ index: 2, connected: true, check: null }
];
var expected;
function allTestsCompleted() {
return eventCounter == expectations.length;
}
function testWithPageVisibleAgain() {
shouldBeEqualToString('document.visibilityState', 'hidden');
removeListeners();
window.addEventListener('gamepadconnected', function(event) {
shouldBeTrue('eventCounter < expectations.length');
expected = expectations[eventCounter++];
shouldBeEqualToNumber('event.gamepad.index', expected.index);
shouldBeTrue('expected.connected');
shouldBeTrue('event.gamepad.connected');
if (expected.check)
expected.check(event);
if (allTestsCompleted())
finishSoon(); // Give some time to fail if unexpecteds events are coming.
});
window.addEventListener('gamepaddisconnected', function(event) {
shouldBeTrue('eventCounter < expectations.length');
expected = expectations[eventCounter++];
shouldBeEqualToNumber('event.gamepad.index', expected.index);
shouldBeFalse('expected.connected');
shouldBeFalse('event.gamepad.connected');
if (expected.check)
expected.check(event);
if (allTestsCompleted())
finishSoon(); // Give some time to fail if unexpecteds events are coming.
});
testRunner.setPageVisibility('visible');
}
function testWithPageHidden() {
testRunner.setPageVisibility('hidden');
var shouldNotReceive = function() {
testFailed('Should not have received gamepad events while the page was hidden');
finishJSTest();
};
addListener('gamepadconnected', shouldNotReceive);
addListener('gamepaddisconnected', shouldNotReceive);
gamepadController.disconnect(0);
// Both the disconnection and the connection should be dispatched.
gamepadController.disconnect(1);
gamepadController.setId(1, "new");
gamepadController.connect(1);
gamepadController.dispatchConnected(1);
// These should be suppressed.
gamepadController.connect(2);
gamepadController.dispatchConnected(2);
gamepadController.disconnect(2);
gamepadController.connect(2);
gamepadController.dispatchConnected(2);
setTimeout(testWithPageVisibleAgain, 0);
}
if (!window.testRunner || !window.gamepadController) {
debug("This test cannot work without testRunner and gamepadController.");
}
addListener('gamepadconnected', function() {
testPassed("Received a gamepadconnected event");
shouldBeEqualToNumber('event.gamepad.index', 0);
removeListeners();
setTimeout(testWithPageHidden, 0);
});
gamepadController.connect(0);
gamepadController.dispatchConnected(0);
gamepadController.setId(1, "old");
gamepadController.connect(1);
gamepadController.dispatchConnected(1);
</script>
</html>