chromium/third_party/blink/web_tests/vibration/cancel-vibration-during-pattern-vibrating.html

<html>
<head>
<script src="../resources/js-test.js"></script>
<script src="../resources/user-gesture-utils.js"></script>
<script src="vibration-utils.js"></script>
</head>
<body>
<h4 id="test"></h4>
<script>
description('Tests the cancelVibration during pattern vibration is working.');

// Simulates a user click for vibrate to be allowed.
var element = document.getElementById("test");
simulateUserClick(element.offsetLeft + 2, element.offsetTop + 2);

function vibrate(pattern) {
    navigator.vibrate(pattern);
    shouldBeTrue('internals.isVibrating(navigator)');
}

function cancelVibration(time) {
    setTimeout(function() {
        navigator.vibrate(0);
        shouldBeFalse('internals.isVibrating(navigator)');
        doNextTest();
    }, time);
}

function doNextTest() {
    if (count == 4)
        finishJSTest();
    doTest(++count);
}

function doTest(num) {
    switch(num) {
    case 1: // Test that cancelling works during a vibration in a pattern.
        vibrate([20, 20, 20]);
        // Progress time by 10ms so we are in the middle of the first vibration of the pattern.
        cancelVibration(10);
        break;
    case 2: // Test that cancelling works during a pause in a pattern.
        vibrate([10, 10, 10]);
        // Progress time by 15ms so we are in the middle of the first pause of the pattern.
        cancelVibration(15);
        break;
    case 3: // Test that the system stops thinking that it is vibrating when the pattern ends.
        vibrate([10, 10, 10]);
        // Progress time by 35ms so the pattern ends naturally without interruptions.
        cancelVibration(35);
        break;
    case 4: // Test that a trailing pause is stripped so isVibrating becomes false after the last vibration in the pattern.
        vibrate([10, 10, 10, 10]); // Even number of array entries, the trailing pause will be stripped.
        // Progress time by 35ms so the pattern ends naturally without interruptions.
        cancelVibration(35);
        break;
    }
}

var count = 1;
if (window.testRunner) {
    window.jsTestIsAsync = true;
    shouldBeFalse('internals.isVibrating(navigator)'); // Before vibration test.
    doTest(count);
} else {
    debug('This test can not be run without the TestRunner');
}
</script>
</body>
</html>