Index: third_party/WebKit/Source/core/layout/ScrollAnchor.cpp |
diff --git a/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp b/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp |
index 8d1de54353f6f1b6df13ce4e08afc9fb9725ba54..928a3f14dffd6dc7beb585f98b6007b515ec1743 100644 |
--- a/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp |
+++ b/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp |
@@ -14,9 +14,12 @@ namespace blink { |
using Corner = ScrollAnchor::Corner; |
+static const int kMaxAdjustments = 20; |
+ |
ScrollAnchor::ScrollAnchor(ScrollableArea* scroller) |
: m_scroller(scroller) |
, m_hasBounced(false) |
+ , m_adjustmentCount(0) |
{ |
ASSERT(m_scroller); |
ASSERT(m_scroller->isFrameView() || m_scroller->isPaintLayerScrollableArea()); |
@@ -251,7 +254,10 @@ void ScrollAnchor::restore() |
m_lastAdjusted.clear(); |
return; |
} |
- adjust(adjustment); |
+ // We impose a limit on the number of adjustments between user scrolls, to |
+ // mitigate the impact of pathological feedback loops with event handlers. |
+ if (++m_adjustmentCount <= kMaxAdjustments) |
+ adjust(adjustment); |
} |
void ScrollAnchor::adjust(IntSize adjustment) |
@@ -274,6 +280,7 @@ void ScrollAnchor::adjust(IntSize adjustment) |
void ScrollAnchor::clear() |
{ |
+ m_adjustmentCount = 0; |
m_current.clear(); |
} |