test_eventTimeStamp.html (4017B)
1 <!doctype html> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=77992 5 --> 6 <head> 7 <meta charset="utf-8"> 8 <title>Test for Event.timeStamp (Bug 77992)</title> 9 <script src="/tests/SimpleTest/SimpleTest.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 11 </head> 12 <body> 13 <a target="_blank" 14 href="https://bugzilla.mozilla.org/show_bug.cgi?id=77992">Mozilla Bug 77992</a> 15 <p id="display"></p> 16 <pre id="test"> 17 <script type="text/js-worker" id="worker-src"> 18 // Simply returns the event timestamp 19 onmessage = function(evt) { 20 postMessage(evt.timeStamp + performance.timeOrigin); 21 } 22 </script> 23 <script type="text/js-worker" id="shared-worker-src"> 24 // Simply returns the event timestamp 25 onconnect = function(evt) { 26 var port = evt.ports[0]; 27 port.onmessage = function(messageEvt) { 28 port.postMessage(messageEvt.timeStamp + performance.timeOrigin); 29 }; 30 }; 31 </script> 32 <script type="application/javascript"> 33 "use strict"; 34 35 SimpleTest.waitForExplicitFinish(); 36 SimpleTest.requestFlakyTimeout("untriaged"); 37 38 // This file performs tests that normalize the timeOrigin within a worker 39 // and compare it to the page. When this occurs, time can appear to go backwards. 40 // This is a known (and accepted) regression of privacy.reduceTimerPrecision so 41 // we need to turn it off. 42 SpecialPowers.pushPrefEnv({ "set": [ 43 ["privacy.reduceTimerPrecision", false] 44 ]}, testRegularEvents); 45 46 // Event.timeStamp should be relative to the time origin which is: 47 // 48 // Non-worker context: navigation start 49 // Dedicated worker: navigation start of the document that created the worker 50 // Shared worker: creation time of the shared worker 51 // 52 // See: https://w3c.github.io/web-performance/specs/HighResolutionTime2/Overview.html#sec-time-origin 53 54 function testRegularEvents() { 55 var timeBeforeEvent = performance.now(); 56 document.getElementById('test').addEventListener("click", function(evt) { 57 var timeAfterEvent = performance.now(); 58 ok(evt.timeStamp >= timeBeforeEvent && 59 evt.timeStamp <= timeAfterEvent, 60 "Event timestamp (" + evt.timeStamp + ") is in expected range: [" + 61 timeBeforeEvent + ", " + timeAfterEvent + "]"); 62 testWorkerEvents(); 63 }); 64 document.getElementById('test').click(); 65 } 66 67 function testWorkerEvents() { 68 var blob = new Blob([ document.getElementById("worker-src").textContent ], 69 { type: "text/javascript" }); 70 var worker = new Worker(URL.createObjectURL(blob)); 71 worker.onmessage = function(evt) { 72 var timeAfterEvent = performance.now() + performance.timeOrigin; 73 ok(evt.data >= timeBeforeEvent && 74 evt.data <= timeAfterEvent, 75 "Event timestamp in dedicated worker (" + evt.data + 76 ") is in expected range: [" + 77 timeBeforeEvent + ", " + timeAfterEvent + "]"); 78 worker.terminate(); 79 testSharedWorkerEvents(); 80 }; 81 var timeBeforeEvent = performance.now() + performance.timeOrigin; 82 worker.postMessage(""); 83 } 84 85 function testSharedWorkerEvents() { 86 var blob = 87 new Blob([ document.getElementById("shared-worker-src").textContent ], 88 { type: "text/javascript" }); 89 // Delay creation of worker slightly so it is easier to distinguish 90 // shared worker creation time from this document's navigation start 91 setTimeout(function() { 92 var timeBeforeEvent = performance.now() + performance.timeOrigin; 93 var worker = new SharedWorker(URL.createObjectURL(blob)); 94 worker.port.onmessage = function(evt) { 95 var timeAfterEvent = performance.now() + performance.timeOrigin; 96 ok(evt.data >= timeBeforeEvent && 97 evt.data <= timeAfterEvent, 98 "Event timestamp in shared worker (" + evt.data + 99 ") is in expected range: [" + 100 timeBeforeEvent + ", " + timeAfterEvent + "]"); 101 worker.port.close(); 102 finishTests(); 103 }; 104 worker.port.start(); 105 worker.port.postMessage(""); 106 }, 500); 107 } 108 109 var finishTests = function() { 110 SimpleTest.finish(); 111 }; 112 113 </script> 114 </pre> 115 </body> 116 </html>