diff options
Diffstat (limited to 'dom/tests/mochitest/general/test_vibrator.html')
-rw-r--r-- | dom/tests/mochitest/general/test_vibrator.html | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/dom/tests/mochitest/general/test_vibrator.html b/dom/tests/mochitest/general/test_vibrator.html new file mode 100644 index 0000000000..e7085fc987 --- /dev/null +++ b/dom/tests/mochitest/general/test_vibrator.html @@ -0,0 +1,148 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Test for Vibrator</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> +</head> +<body> + +<!-- Although we can't test that the vibrator works properly, we can test that + navigator.vibrate throws an exception where appropriate. --> + +<script class="testbody" type="text/javascript"> +function testNavigatorVibrate(testCase) { + result = navigator.vibrate(testCase.value); + is(result, true, `vibrate(${testCase.value}) must succeed.`); +} + +function testNotificationVibrate(testCase) { + var notification = new Notification('Test notification', { + body: 'test vibrate', + vibrate: testCase.value, + }); + + isDeeply(notification.vibrate, testCase.expected, `vibrate = ${testCase.value} should be accepted.`); +} + +const MAX_VIBRATE_MS = SpecialPowers.getIntPref('dom.vibrator.max_vibrate_ms'); +const MAX_VIBRATE_LIST_LEN = SpecialPowers.getIntPref('dom.vibrator.max_vibrate_list_len'); +const TESTCASES = [ + { + value: null, + expected: [0], + },{ + value: undefined, + expected: [], + },{ + // -1 will be converted to the highest unsigned long then clamped. + value: -1, + expected: [MAX_VIBRATE_MS], + },{ + value: 'a', + expected: [0], + },{ + // -1 will be converted to the highest unsigned long then clamped. + value: [100, -1], + expected: [100, MAX_VIBRATE_MS], + },{ + value: [100, 'a'], + expected: [100, 0], + },{ + // If we pass a vibration pattern with a value higher than max_vibrate_ms or a + // pattern longer than max_vibrate_list_len, the call should succeed but the + // pattern should be modified to match the restrictions. + + // Values will be clamped to dom.vibrator.max_vibrate_ms. + value: MAX_VIBRATE_MS + 1, + expected: [MAX_VIBRATE_MS], + },{ + value: [MAX_VIBRATE_MS + 1], + expected: [MAX_VIBRATE_MS], + },{ + // The array will be truncated to have a length equal to dom.vibrator.max_vibrate_list_len. + value: new Array(MAX_VIBRATE_LIST_LEN + 1).fill(0), + expected: new Array(MAX_VIBRATE_LIST_LEN).fill(0), + },{ + value: 0, + expected: [0], + },{ + value: [], + expected: [], + },{ + value: '1000', + expected: [1000], + },{ + value: 1000, + expected: [1000], + },{ + value: 1000.1, + expected: [1000], + },{ + value: [0, 0, 0], + expected: [0, 0, 0], + },{ + value: ['1000', 1000], + expected: [1000, 1000], + },{ + value: [1000, 1000], + expected: [1000, 1000], + },{ + value: [1000, 1000.1], + expected: [1000, 1000], + } +]; + +function testWith(tester) { + for (let testCase of TESTCASES) { + tester(testCase); + } +} + +add_task(async function test_notification_vibrate_enabled() { + await SpecialPowers.pushPrefEnv({"set": [['dom.webnotifications.vibrate.enabled', true]]}); + + testWith(testNotificationVibrate); +}); + +add_task(async function test_vibrator_vibrate() { + await SpecialPowers.pushPermissions([{type: 'vibration', allow: true, context: document}]); + await SpecialPowers.pushPrefEnv({"set": [['dom.vibrator.enabled', true]]}); + + testWith(testNavigatorVibrate); + + await SpecialPowers.pushPrefEnv({"set": [['dom.vibrator.enabled', false]]}); + + testWith(testNavigatorVibrate); +}); + +add_task(async function test_vibrate_many_times() { + await SpecialPowers.pushPermissions([{type: 'vibration', allow: true, context: document}]); + await SpecialPowers.pushPrefEnv({"set": [['dom.vibrator.enabled', true]]}); + + // The following loop shouldn't cause us to crash. See bug 701716. + for (var i = 0; i < 10000; i++) { + navigator.vibrate([100, 100]); + } + ok(true, "Didn't crash after issuing a lot of vibrate() calls."); +}); + +add_task(async function test_notification_vibrate_silent() { + await SpecialPowers.pushPrefEnv({"set": [['dom.webnotifications.vibrate.enabled', true], + ['dom.webnotifications.silent.enabled', true]]}); + + try { + var notification = new Notification('Test notification', { + body: 'test vibrate', + vibrate: [100, 100], + silent: true, + }); + ok(false, "The above should throw if vibrate is enabled"); + } catch (error) { + is(error.name, "TypeError", "A silent notification with a vibrate param should throw a TypeError"); + } +}); + +</script> +</body> +</html> |