1<!DOCTYPE html> 2<script src="/resources/testharness.js"></script> 3<script src="/resources/testharnessreport.js"></script> 4<script type="text/javascript"> 5'use strict'; 6 7// Computes greatest common divisor of a and b using Euclid's algorithm 8function computeGCD(a, b) { 9 if (!Number.isInteger(a) || !Number.isInteger(b)) { 10 throw new Error('Parameters must be integer numbers'); 11 } 12 13 var r; 14 while (b != 0) { 15 r = a % b; 16 a = b; 17 b = r; 18 } 19 return (a < 0) ? -a : a; 20} 21 22// Finds minimum resolution Δ given a set of samples which are known to be in the form of N*Δ. 23// We use GCD of all samples as a simple estimator. 24function estimateMinimumResolution(samples) { 25 var gcd; 26 for (const sample of samples) { 27 gcd = gcd ? computeGCD(gcd, sample) : sample; 28 } 29 30 return gcd; 31} 32 33test(function() { 34 const samples = []; 35 for (var i = 0; i < 1e3; i++) { 36 var deltaInMicroSeconds = 0; 37 const e1 = new MouseEvent('test1'); 38 do { 39 const e2 = new MouseEvent('test2'); 40 deltaInMicroSeconds = Math.round((e2.timeStamp - e1.timeStamp) * 1000); 41 } while (deltaInMicroSeconds == 0) // only collect non-zero samples 42 43 samples.push(deltaInMicroSeconds); 44 } 45 46 const minResolution = estimateMinimumResolution(samples); 47 assert_greater_than_equal(minResolution, 5); 48}, 'Event timestamp should not have a resolution better than 5 microseconds'); 49</script>