<!
DOCTYPE HTML>
<
html>
<
head>
<
title>Test for High Resolution Timer</
title>
<
script src=
"/tests/SimpleTest/SimpleTest.js"></
script>
<
link rel=
"stylesheet" type=
"text/css" href=
"/tests/SimpleTest/test.css" />
</
head>
<
body>
<
script>
ok(window.performance,
"Performance object should exist.");
ok(typeof window.performance.now ==
'function',
"Performance object should have a 'now' method.");
var n = window.performance.now(), d = Date.now();
ok(n >= 0,
"The value of now() should be equal to or greater than 0.");
ok(window.performance.now() >= n,
"The value of now() should monotonically increase.");
SimpleTest.waitForExplicitFinish();
SimpleTest.requestFlakyTimeout(
"using setTimeout() to measure performance.now()");
// Spin on setTimeout() until performance.now() increases. Due to recent
// security developments, the hr-time working group has not yet reached
// consensus on what the recommend minimum clock resolution should be:
//
https://w3c.github.io/hr-time/#clock-resolution
// Since setTimeout might return too early/late, our goal is for
// performance.now() to increase before a 2 ms deadline rather than specific
// number of setTimeout(N) invocations.
// See bug 749894 (intermittent failures of this test)
var checks = 0;
function checkAfterTimeout() {
checks++;
var d2 = Date.now();
var n2 = window.performance.now();
// Spin on setTimeout() until performance.now() increases. Abort the
// test if it runs for more than 2 ms or 50 timeouts.
let elapsedTime = d2 - d;
let elapsedPerf = n2 - n;
if (elapsedPerf == 0 && elapsedTime < 2 && checks < 50) {
setTimeout(checkAfterTimeout, 1);
return;
}
// Our implementation provides 1 ms resolution (bug 1451790).
ok(elapsedPerf >= 1,
`Loose - the value of now() should increase by no less than 1 ms ` +
`after 2 ms. delta now(): ${elapsedPerf} ms`);
// If we need more than 1 iteration, then either performance.now()
// resolution is shorter than 1 ms or setTimeout() is returning too early.
ok(checks == 1,
`Strict - the value of now() should increase after one setTimeout. ` +
`iters: ${checks},
dt: ${elapsedTime}, now(): ${n2}`);
SimpleTest.finish();
};
setTimeout(checkAfterTimeout, 1);
</
script>
</
body>
</
html>