From: Evan You Date: Thu, 24 Jan 2019 00:08:51 +0000 (-0500) Subject: refactor: also check for event timestamp X-Git-Tag: v3.0.0-alpha.0~1019 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=daf166553b5a2ebe2b95035c1fe1bb20b0178f03;p=thirdparty%2Fvuejs%2Fcore.git refactor: also check for event timestamp --- diff --git a/packages/runtime-dom/src/modules/events.ts b/packages/runtime-dom/src/modules/events.ts index 11b374545b..92b5914e7c 100644 --- a/packages/runtime-dom/src/modules/events.ts +++ b/packages/runtime-dom/src/modules/events.ts @@ -7,22 +7,31 @@ type EventValue = (Function | Function[]) & { invoker?: Invoker | null } -// async edge case fix requires storing an event listener's attach timestamp -// to avoid the overhead of repeatedly calling performance.now(), we cache +// Async edge case fix requires storing an event listener's attach timestamp. +let _getNow: () => number = Date.now + +// Determine what event timestamp the browser is using. Annoyingly, the +// timestamp can either be hi-res ( relative to poge load) or low-res +// (relative to UNIX epoch), so in order to compare time we have to use the +// same timestamp type when saving the flush timestamp. +if ( + typeof document !== 'undefined' && + _getNow() > document.createEvent('Event').timeStamp +) { + // if the low-res timestamp which is bigger than the event timestamp + // (which is evaluated AFTER) it means the event is using a hi-res timestamp, + // and we need to use the hi-res version for event listeners as well. + _getNow = () => performance.now() +} + +// To avoid the overhead of repeatedly calling performance.now(), we cache // and use the same timestamp for all event listners attached in the same tick. let cachedNow: number = 0 const p = Promise.resolve() - -function getNow() { - if (cachedNow) { - return cachedNow - } else { - p.then(() => { - cachedNow = 0 - }) - return (cachedNow = performance.now()) - } +const reset = () => { + cachedNow = 0 } +const getNow = () => cachedNow || (p.then(reset), (cachedNow = _getNow())) export function patchEvent( el: Element,