OLD | NEW |
---|---|
1 /* | 1 /* |
2 * Copyright (C) 2001 Peter Kelly (pmk@post.com) | 2 * Copyright (C) 2001 Peter Kelly (pmk@post.com) |
3 * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de) | 3 * Copyright (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de) |
4 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) | 4 * Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) |
5 * Copyright (C) 2003, 2005, 2006, 2008 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003, 2005, 2006, 2008 Apple Inc. All rights reserved. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 15 matching lines...) Expand all Loading... | |
26 #include "core/dom/StaticNodeList.h" | 26 #include "core/dom/StaticNodeList.h" |
27 #include "core/events/EventDispatchMediator.h" | 27 #include "core/events/EventDispatchMediator.h" |
28 #include "core/events/EventTarget.h" | 28 #include "core/events/EventTarget.h" |
29 #include "core/frame/OriginsUsingFeatures.h" | 29 #include "core/frame/OriginsUsingFeatures.h" |
30 #include "core/frame/UseCounter.h" | 30 #include "core/frame/UseCounter.h" |
31 #include "core/svg/SVGElement.h" | 31 #include "core/svg/SVGElement.h" |
32 #include "wtf/CurrentTime.h" | 32 #include "wtf/CurrentTime.h" |
33 | 33 |
34 namespace blink { | 34 namespace blink { |
35 | 35 |
36 static const double millisPerSecond = 1000.0; | |
37 | |
38 static double monotonicTimeWithSafePrecision() | |
Rick Byers
2015/09/18 15:56:32
Can you share this logic with the usage in Perform
majidvp
2015/09/18 17:43:33
Acknowledged.
| |
39 { | |
40 // Reduce the resolution to 5us similar to Performance.now() to prevent | |
41 // precise timing attacks. | |
42 static const double precision = 0.005 / millisPerSecond; // in seconds | |
43 return floor(monotonicallyIncreasingTime() / precision) * precision; | |
44 } | |
45 | |
36 Event::Event() | 46 Event::Event() |
37 : Event("", false, false) | 47 : Event("", false, false) |
38 { | 48 { |
39 } | 49 } |
40 | 50 |
41 Event::Event(const AtomicString& eventType, bool canBubbleArg, bool cancelableAr g) | 51 Event::Event(const AtomicString& eventType, bool canBubbleArg, bool cancelableAr g) |
42 : m_type(eventType) | 52 : m_type(eventType) |
43 , m_canBubble(canBubbleArg) | 53 , m_canBubble(canBubbleArg) |
44 , m_cancelable(cancelableArg) | 54 , m_cancelable(cancelableArg) |
45 , m_propagationStopped(false) | 55 , m_propagationStopped(false) |
46 , m_immediatePropagationStopped(false) | 56 , m_immediatePropagationStopped(false) |
47 , m_defaultPrevented(false) | 57 , m_defaultPrevented(false) |
48 , m_defaultHandled(false) | 58 , m_defaultHandled(false) |
49 , m_cancelBubble(false) | 59 , m_cancelBubble(false) |
50 , m_isTrusted(false) | 60 , m_isTrusted(false) |
51 , m_eventPhase(0) | 61 , m_eventPhase(0) |
52 , m_currentTarget(nullptr) | 62 , m_currentTarget(nullptr) |
53 , m_createTime(convertSecondsToDOMTimeStamp(currentTime())) | 63 , m_createTime(convertSecondsToDOMTimeStamp(currentTime())) |
54 , m_uiCreateTime(0) | 64 , m_uiCreateTime(monotonicTimeWithSafePrecision()) |
55 { | 65 { |
56 } | 66 } |
57 | 67 |
58 Event::Event(const AtomicString& eventType, const EventInit& initializer) | 68 Event::Event(const AtomicString& eventType, const EventInit& initializer) |
59 : Event(eventType, initializer.bubbles(), initializer.cancelable()) | 69 : Event(eventType, initializer.bubbles(), initializer.cancelable()) |
60 { | 70 { |
61 } | 71 } |
62 | 72 |
63 Event::~Event() | 73 Event::~Event() |
64 { | 74 { |
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
250 if (!m_currentTarget) | 260 if (!m_currentTarget) |
251 return 0; | 261 return 0; |
252 Node* node = m_currentTarget->toNode(); | 262 Node* node = m_currentTarget->toNode(); |
253 if (node && node->isSVGElement()) { | 263 if (node && node->isSVGElement()) { |
254 if (SVGElement* svgElement = toSVGElement(node)->correspondingElement()) | 264 if (SVGElement* svgElement = toSVGElement(node)->correspondingElement()) |
255 return svgElement; | 265 return svgElement; |
256 } | 266 } |
257 return m_currentTarget.get(); | 267 return m_currentTarget.get(); |
258 } | 268 } |
259 | 269 |
270 double Event::timeStamp() const | |
271 { | |
272 double timeStamp = 0; | |
273 // TODO(majidvp): Get rid of m_createTime once the flag is enabled by defaul t; | |
274 if (UNLIKELY(RuntimeEnabledFeatures::hiResEventTimeStampEnabled())) { | |
275 // Only expose monotonic time after changing its origin to its target | |
276 // document's time origin. | |
277 // TODO(majidvp): We do not reduce precision of user generated | |
278 // events here but perhaps we should to avoid any accidental leakage of | |
279 // hiResTime | |
Rick Byers
2015/09/18 16:17:29
By user-generated you mean real events, not script
majidvp
2015/09/18 17:43:33
User generated = real events. It will definitely b
Rick Byers
2015/09/21 15:44:37
5us is really short, in practice the variability i
| |
280 if (m_target && m_target->toNode()) | |
281 timeStamp = m_target->toNode()->document().monotonicTimeToZeroBased DocumentTime(m_uiCreateTime) * millisPerSecond; | |
dtapuska
2015/09/18 16:04:42
How does this work when the m_currentNode and the
Rick Byers
2015/09/18 16:17:29
Event::m_uiCreateTime is poorly defined (and perha
Rick Byers
2015/09/18 16:17:29
Does the conversion really have to be done based o
majidvp
2015/09/18 17:43:33
I agree that the target node's document may not be
Rick Byers
2015/09/21 15:44:37
Ah, sorry! I assumed EventInitDict had a timestam
| |
282 } else { | |
283 timeStamp = m_createTime; | |
284 } | |
285 | |
286 return timeStamp; | |
287 } | |
288 | |
289 double Event::timeStampForPlatformInSeconds() const | |
290 { | |
291 return RuntimeEnabledFeatures::hiResEventTimeStampEnabled() ? m_uiCreateTime : (m_createTime / millisPerSecond); | |
292 } | |
293 | |
260 DEFINE_TRACE(Event) | 294 DEFINE_TRACE(Event) |
261 { | 295 { |
262 visitor->trace(m_currentTarget); | 296 visitor->trace(m_currentTarget); |
263 visitor->trace(m_target); | 297 visitor->trace(m_target); |
264 visitor->trace(m_underlyingEvent); | 298 visitor->trace(m_underlyingEvent); |
265 visitor->trace(m_eventPath); | 299 visitor->trace(m_eventPath); |
266 } | 300 } |
267 | 301 |
268 } // namespace blink | 302 } // namespace blink |
OLD | NEW |