Diff
Modified: trunk/LayoutTests/ChangeLog (137213 => 137214)
--- trunk/LayoutTests/ChangeLog 2012-12-10 23:30:36 UTC (rev 137213)
+++ trunk/LayoutTests/ChangeLog 2012-12-10 23:34:32 UTC (rev 137214)
@@ -1,3 +1,17 @@
+2012-12-10 Ojan Vafai <o...@chromium.org>
+
+ Unreviewed, rolling out r134150.
+ http://trac.webkit.org/changeset/134150
+ https://bugs.webkit.org/show_bug.cgi?id=99940
+
+ Caused JS-based tooltips to remain during scroll on Facebook
+ and Gmail. Rollout until I have time to experiment with less
+ aggresive approaches.
+
+ * fast/scrolling/fake-mouse-event-throttling-expected.txt: Removed.
+ * fast/scrolling/fake-mouse-event-throttling.html: Removed.
+ * platform/mac/TestExpectations:
+
2012-12-10 Yi Shen <max.hong.s...@gmail.com>
Keyboard caret movement in textarea with RTL Override Character can make tab unresponsive
Deleted: trunk/LayoutTests/fast/scrolling/fake-mouse-event-throttling-expected.txt (137213 => 137214)
--- trunk/LayoutTests/fast/scrolling/fake-mouse-event-throttling-expected.txt 2012-12-10 23:30:36 UTC (rev 137213)
+++ trunk/LayoutTests/fast/scrolling/fake-mouse-event-throttling-expected.txt 2012-12-10 23:34:32 UTC (rev 137214)
@@ -1,4 +0,0 @@
-PASS numberOfMouseMoves is 0
-PASS numberOfMouseMoves is 1
-PASS numberOfMouseMoves is 2
-
Deleted: trunk/LayoutTests/fast/scrolling/fake-mouse-event-throttling.html (137213 => 137214)
--- trunk/LayoutTests/fast/scrolling/fake-mouse-event-throttling.html 2012-12-10 23:30:36 UTC (rev 137213)
+++ trunk/LayoutTests/fast/scrolling/fake-mouse-event-throttling.html 2012-12-10 23:34:32 UTC (rev 137214)
@@ -1,63 +0,0 @@
-<!DOCTYPE html>
-<style>
-body {
- overflow: scroll;
-}
-div {
- height: 100px;
-}
-.pointer {
- cursor: pointer;
- background-color: salmon;
-}
-.plain {
- background-color: orange;
-}
-</style>
-<script src=""
-<body _onload_="runNextTest()">
-
-<script>
-for (var i = 0; i < 100; i++) {
- document.write('<div class=pointer></div><div class=plain></div>');
-}
-
-if (window.testRunner)
- testRunner.waitUntilDone();
-if (window.eventSender)
- eventSender.mouseMoveTo(100, 50);
-
-var numberOfMouseMoves = 0;
-document.body._onmousemove_ = function() {
- var start = Date.now();
- while (Date.now() - start < mouseMoveDuration) {
- }
- numberOfMouseMoves++;
-
- if (delays.length)
- runNextTest();
- else {
- shouldBe("numberOfMouseMoves", String(expectedNumberOfMouseMoves));
- if (window.testRunner)
- testRunner.notifyDone();
- }
-
-}
-
-var delays = [5, 200];
-var expectedNumberOfMouseMoves = delays.length;
-
-function runNextTest()
-{
- shouldBe("numberOfMouseMoves", String(expectedNumberOfMouseMoves - delays.length));
- mouseMoveDuration = delays.shift();
- var position = 75 * delays.length;
- window.scrollTo(0, position);
- window.scrollTo(0, position + 25);
- setTimeout(function() {
- window.scrollTo(0, position + 50);
- }, 0);
-}
-</script>
-</body>
-
Modified: trunk/LayoutTests/platform/mac/TestExpectations (137213 => 137214)
--- trunk/LayoutTests/platform/mac/TestExpectations 2012-12-10 23:30:36 UTC (rev 137213)
+++ trunk/LayoutTests/platform/mac/TestExpectations 2012-12-10 23:34:32 UTC (rev 137214)
@@ -1214,9 +1214,6 @@
# TileCache tests that don't apply to WK1 (they are re-enabled via the WK2 TestExpectations file)
platform/mac/tiled-drawing/ [ Skip ]
-# DRT is not firing fake mouse events. Safari fires them fine. Looks like a bug with Apple's Mac DRT.
-webkit.org/b/101808 fast/scrolling/fake-mouse-event-throttling.html [ Skip ]
-
webkit.org/b/100846 inspector-protocol/debugger-pause-dedicated-worker.html [ Skip ]
webkit.org/b/100846 inspector-protocol/debugger-terminate-dedicated-worker-while-paused.html [ Skip ]
Modified: trunk/Source/WebCore/ChangeLog (137213 => 137214)
--- trunk/Source/WebCore/ChangeLog 2012-12-10 23:30:36 UTC (rev 137213)
+++ trunk/Source/WebCore/ChangeLog 2012-12-10 23:34:32 UTC (rev 137214)
@@ -1,3 +1,27 @@
+2012-12-10 Ojan Vafai <o...@chromium.org>
+
+ Unreviewed, rolling out r134150.
+ http://trac.webkit.org/changeset/134150
+ https://bugs.webkit.org/show_bug.cgi?id=99940
+
+ Caused JS-based tooltips to remain during scroll on Facebook
+ and Gmail. Rollout until I have time to experiment with less
+ aggresive approaches.
+
+ * page/EventHandler.cpp:
+ (WebCore):
+ (WebCore::MaximumDurationTracker::MaximumDurationTracker):
+ (WebCore::MaximumDurationTracker::~MaximumDurationTracker):
+ (MaximumDurationTracker):
+ (WebCore::EventHandler::EventHandler):
+ (WebCore::EventHandler::clear):
+ (WebCore::EventHandler::mouseMoved):
+ (WebCore::EventHandler::dispatchFakeMouseMoveEventSoon):
+ (WebCore::EventHandler::fakeMouseMoveEventTimerFired):
+ * page/EventHandler.h:
+ (EventHandler):
+ * platform/Timer.h:
+
2012-12-10 Yi Shen <max.hong.s...@gmail.com>
Keyboard caret movement in textarea with RTL Override Character can make tab unresponsive
Modified: trunk/Source/WebCore/page/EventHandler.cpp (137213 => 137214)
--- trunk/Source/WebCore/page/EventHandler.cpp 2012-12-10 23:30:36 UTC (rev 137213)
+++ trunk/Source/WebCore/page/EventHandler.cpp 2012-12-10 23:34:32 UTC (rev 137214)
@@ -140,17 +140,11 @@
// When the autoscroll or the panScroll is triggered when do the scroll every 0.05s to make it smooth
const double autoscrollInterval = 0.05;
-// The amount of time to wait before sending a fake mouse event, triggered during a scroll.
-const double fakeMouseMoveMinimumInterval = 0.1;
-// Amount to increase the fake mouse event throttling when the running average exceeds the delay.
-// Picked fairly arbitrarily.
-const double fakeMouseMoveIntervalIncrease = 0.05;
-const double fakeMouseMoveRunningAverageCount = 10;
-// Decrease the fakeMouseMoveInterval when the current delay is >2x the running average,
-// but only decrease to 3/4 the current delay to avoid too much thrashing.
-// Not sure this distinction really matters in practice.
-const double fakeMouseMoveIntervalReductionLimit = 0.5;
-const double fakeMouseMoveIntervalReductionFraction = 0.75;
+// The amount of time to wait before sending a fake mouse event, triggered
+// during a scroll. The short interval is used if the content responds to the mouse events quickly enough,
+// otherwise the long interval is used.
+const double fakeMouseMoveShortInterval = 0.1;
+const double fakeMouseMoveLongInterval = 0.250;
const int maximumCursorSize = 128;
#if ENABLE(MOUSE_CURSOR_SCALE)
@@ -175,28 +169,21 @@
Cursor m_cursor;
};
-class RunningAverageDurationTracker {
+class MaximumDurationTracker {
public:
- RunningAverageDurationTracker(double* average, unsigned numberOfRunsToTrack)
- : m_average(average)
- , m_numberOfRunsToTrack(numberOfRunsToTrack)
+ explicit MaximumDurationTracker(double *maxDuration)
+ : m_maxDuration(maxDuration)
, m_start(monotonicallyIncreasingTime())
{
}
- ~RunningAverageDurationTracker()
+ ~MaximumDurationTracker()
{
- double duration = monotonicallyIncreasingTime() - m_start;
- if (!*m_average) {
- *m_average = duration;
- return;
- }
- *m_average = (*m_average * (m_numberOfRunsToTrack - 1) + (duration)) / m_numberOfRunsToTrack;
+ *m_maxDuration = max(*m_maxDuration, monotonicallyIncreasingTime() - m_start);
}
private:
- double* m_average;
- unsigned m_numberOfRunsToTrack;
+ double* m_maxDuration;
double m_start;
};
@@ -353,7 +340,7 @@
, m_autoscrollInProgress(false)
, m_mouseDownMayStartAutoscroll(false)
, m_mouseDownWasInSubframe(false)
- , m_fakeMouseMoveEventTimer(this, &EventHandler::fakeMouseMoveEventTimerFired, fakeMouseMoveMinimumInterval)
+ , m_fakeMouseMoveEventTimer(this, &EventHandler::fakeMouseMoveEventTimerFired)
#if ENABLE(SVG)
, m_svgPan(false)
#endif
@@ -370,7 +357,7 @@
#if ENABLE(TOUCH_EVENTS)
, m_touchPressed(false)
#endif
- , m_mouseMovedDurationRunningAverage(0)
+ , m_maxMouseMovedDuration(0)
, m_baseEventType(PlatformEvent::NoType)
, m_didStartDrag(false)
, m_didLongPressInvokeContextMenu(false)
@@ -425,7 +412,7 @@
m_scrollGestureHandlingNode = 0;
m_scrollbarHandlingScrollGesture = 0;
#endif
- m_mouseMovedDurationRunningAverage = 0;
+ m_maxMouseMovedDuration = 0;
m_baseEventType = PlatformEvent::NoType;
m_didStartDrag = false;
m_didLongPressInvokeContextMenu = false;
@@ -1791,7 +1778,7 @@
bool EventHandler::mouseMoved(const PlatformMouseEvent& event)
{
RefPtr<FrameView> protector(m_frame->view());
- RunningAverageDurationTracker durationTracker(&m_mouseMovedDurationRunningAverage, fakeMouseMoveRunningAverageCount);
+ MaximumDurationTracker maxDurationTracker(&m_maxMouseMovedDuration);
#if ENABLE(TOUCH_EVENTS)
@@ -3007,15 +2994,18 @@
if (settings && !settings->deviceSupportsMouse())
return;
- // Adjust the mouse move throttling so that it's roughly around our running average of the duration of mousemove events.
- // This will cause the content to receive these moves only after the user is done scrolling, reducing pauses during the scroll.
- // This will only measure the duration of the mousemove event though (not for example layouts),
- // so maintain at least a minimum interval.
- if (m_mouseMovedDurationRunningAverage > m_fakeMouseMoveEventTimer.delay())
- m_fakeMouseMoveEventTimer.setDelay(m_mouseMovedDurationRunningAverage + fakeMouseMoveIntervalIncrease);
- else if (m_mouseMovedDurationRunningAverage < fakeMouseMoveIntervalReductionLimit * m_fakeMouseMoveEventTimer.delay())
- m_fakeMouseMoveEventTimer.setDelay(max(fakeMouseMoveMinimumInterval, fakeMouseMoveIntervalReductionFraction * m_fakeMouseMoveEventTimer.delay()));
- m_fakeMouseMoveEventTimer.restart();
+ // If the content has ever taken longer than fakeMouseMoveShortInterval we
+ // reschedule the timer and use a longer time. This will cause the content
+ // to receive these moves only after the user is done scrolling, reducing
+ // pauses during the scroll.
+ if (m_maxMouseMovedDuration > fakeMouseMoveShortInterval) {
+ if (m_fakeMouseMoveEventTimer.isActive())
+ m_fakeMouseMoveEventTimer.stop();
+ m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveLongInterval);
+ } else {
+ if (!m_fakeMouseMoveEventTimer.isActive())
+ m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveShortInterval);
+ }
}
void EventHandler::dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad& quad)
@@ -3035,7 +3025,7 @@
m_fakeMouseMoveEventTimer.stop();
}
-void EventHandler::fakeMouseMoveEventTimerFired(DeferrableOneShotTimer<EventHandler>* timer)
+void EventHandler::fakeMouseMoveEventTimerFired(Timer<EventHandler>* timer)
{
ASSERT_UNUSED(timer, timer == &m_fakeMouseMoveEventTimer);
ASSERT(!m_mousePressed);
Modified: trunk/Source/WebCore/page/EventHandler.h (137213 => 137214)
--- trunk/Source/WebCore/page/EventHandler.h 2012-12-10 23:30:36 UTC (rev 137213)
+++ trunk/Source/WebCore/page/EventHandler.h 2012-12-10 23:34:32 UTC (rev 137214)
@@ -287,7 +287,7 @@
static bool isKeyboardOptionTab(KeyboardEvent*);
static bool eventInvertsTabsToLinksClientCallResult(KeyboardEvent*);
- void fakeMouseMoveEventTimerFired(DeferrableOneShotTimer<EventHandler>*);
+ void fakeMouseMoveEventTimerFired(Timer<EventHandler>*);
void cancelFakeMouseMoveEvent();
bool isInsideScrollbar(const IntPoint&) const;
@@ -412,7 +412,7 @@
bool m_mouseDownMayStartAutoscroll;
bool m_mouseDownWasInSubframe;
- DeferrableOneShotTimer<EventHandler> m_fakeMouseMoveEventTimer;
+ Timer<EventHandler> m_fakeMouseMoveEventTimer;
#if ENABLE(SVG)
bool m_svgPan;
@@ -470,7 +470,7 @@
RefPtr<Scrollbar> m_scrollbarHandlingScrollGesture;
#endif
- double m_mouseMovedDurationRunningAverage;
+ double m_maxMouseMovedDuration;
PlatformEvent::Type m_baseEventType;
bool m_didStartDrag;
bool m_didLongPressInvokeContextMenu;
Modified: trunk/Source/WebCore/platform/Timer.h (137213 => 137214)
--- trunk/Source/WebCore/platform/Timer.h 2012-12-10 23:30:36 UTC (rev 137213)
+++ trunk/Source/WebCore/platform/Timer.h 2012-12-10 23:34:32 UTC (rev 137214)
@@ -140,17 +140,6 @@
startOneShot(m_delay);
}
- void setDelay(double delay)
- {
- m_delay = delay;
- if (isActive()) {
- stop();
- restart();
- }
- }
-
- double delay() const { return m_delay; }
-
using TimerBase::stop;
using TimerBase::isActive;
private: