Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(155)

Side by Side Diff: third_party/WebKit/Source/core/input/ScrollManager.cpp

Issue 2069713002: Make all gesture scrolls use customization path internally (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Gesture scrolls are now on scroll customization path Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/input/ScrollManager.h" 5 #include "core/input/ScrollManager.h"
6 6
7 #include "core/dom/DOMNodeIds.h" 7 #include "core/dom/DOMNodeIds.h"
8 #include "core/events/GestureEvent.h" 8 #include "core/events/GestureEvent.h"
9 #include "core/frame/FrameHost.h" 9 #include "core/frame/FrameHost.h"
10 #include "core/frame/FrameView.h" 10 #include "core/frame/FrameView.h"
11 #include "core/frame/TopControls.h" 11 #include "core/frame/TopControls.h"
12 #include "core/html/HTMLFrameOwnerElement.h" 12 #include "core/html/HTMLFrameOwnerElement.h"
13 #include "core/input/EventHandler.h" 13 #include "core/input/EventHandler.h"
14 #include "core/layout/LayoutPart.h" 14 #include "core/layout/LayoutPart.h"
15 #include "core/loader/DocumentLoader.h" 15 #include "core/loader/DocumentLoader.h"
16 #include "core/page/AutoscrollController.h" 16 #include "core/page/AutoscrollController.h"
17 #include "core/page/Page.h" 17 #include "core/page/Page.h"
18 #include "core/page/scrolling/OverscrollController.h" 18 #include "core/page/scrolling/OverscrollController.h"
19 #include "core/page/scrolling/ScrollState.h" 19 #include "core/page/scrolling/ScrollState.h"
20 #include "core/paint/PaintLayer.h" 20 #include "core/paint/PaintLayer.h"
21 #include "platform/PlatformGestureEvent.h" 21 #include "platform/PlatformGestureEvent.h"
22 22
23 23
24 namespace blink { 24 namespace blink {
25 25
26 namespace {
27
28 // TODO(bokan): This method can go away once all scrolls happen through the
29 // scroll customization path.
30 void computeScrollChainForSingleNode(Node& node, std::deque<int>& scrollChain)
31 {
32 scrollChain.clear();
33
34 DCHECK(node.layoutObject());
35 Element* element = toElement(&node);
36
37 scrollChain.push_front(DOMNodeIds::idForNode(element));
38 }
39
40 void recomputeScrollChain(const LocalFrame& frame, const Node& startNode,
41 std::deque<int>& scrollChain)
42 {
43 scrollChain.clear();
44
45 DCHECK(startNode.layoutObject());
46 LayoutBox* curBox = startNode.layoutObject()->enclosingBox();
47
48 // Scrolling propagates along the containing block chain.
49 while (curBox && !curBox->isLayoutView()) {
50 Node* curNode = curBox->node();
51 // FIXME: this should reject more elements, as part of crbug.com/410974.
52 if (curNode && curNode->isElementNode()) {
53 Element* curElement = toElement(curNode);
54 if (curElement == frame.document()->scrollingElement())
55 break;
56 scrollChain.push_front(DOMNodeIds::idForNode(curElement));
57 }
58 curBox = curBox->containingBlock();
59 }
60 // TODO(tdresser): this should sometimes be excluded, as part of crbug.com/4 10974.
61 // We need to ensure that the scrollingElement is always part of
62 // the scroll chain. In quirks mode, when the scrollingElement is
63 // the body, some elements may use the documentElement as their
64 // containingBlock, so we ensure the scrollingElement is added
65 // here.
66 scrollChain.push_front(DOMNodeIds::idForNode(frame.document()->scrollingElem ent()));
67 }
68
69 } // namespace
70
71 ScrollManager::ScrollManager(LocalFrame* frame) 26 ScrollManager::ScrollManager(LocalFrame* frame)
72 : m_frame(frame) 27 : m_frame(frame)
73 { 28 {
74 clear(); 29 clear();
75 } 30 }
76 31
77 ScrollManager::~ScrollManager() 32 ScrollManager::~ScrollManager()
78 { 33 {
79 } 34 }
80 35
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 return autoscrollController() && autoscrollController()->panScrollInProgress (); 67 return autoscrollController() && autoscrollController()->panScrollInProgress ();
113 } 68 }
114 69
115 AutoscrollController* ScrollManager::autoscrollController() const 70 AutoscrollController* ScrollManager::autoscrollController() const
116 { 71 {
117 if (Page* page = m_frame->page()) 72 if (Page* page = m_frame->page())
118 return &page->autoscrollController(); 73 return &page->autoscrollController();
119 return nullptr; 74 return nullptr;
120 } 75 }
121 76
122 ScrollResult ScrollManager::physicalScroll(ScrollGranularity granularity, 77 void ScrollManager::recomputeScrollChain(const Node& startNode,
123 const FloatSize& delta, const FloatPoint& position, 78 std::deque<int>& scrollChain)
124 const FloatSize& velocity, Node* startNode, Node** stopNode, bool* consumed)
125 { 79 {
126 if (consumed) 80 scrollChain.clear();
127 *consumed = false;
128 if (delta.isZero())
129 return ScrollResult();
130 81
131 Node* node = startNode; 82 DCHECK(startNode.layoutObject());
132 DCHECK(node && node->layoutObject()); 83 LayoutBox* curBox = startNode.layoutObject()->enclosingBox();
133 84
134 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); 85 // Scrolling propagates along the containing block chain and ends at the
86 // RootScroller element. The RootScroller element will have a custom
87 // applyScroll callback that scrolls the frame or element.
88 while (curBox) {
89 Node* curNode = curBox->node();
90 Element* curElement = nullptr;
135 91
136 ScrollResult result; 92 // FIXME: this should reject more elements, as part of crbug.com/410974.
93 if (curNode && curNode->isElementNode()) {
94 curElement = toElement(curNode);
95 } else if (curNode && curNode->isDocumentNode()) {
96 // In normal circumastances, the documentElement will be the root
97 // scroller but the documentElement itself isn't a containing block,
98 // that'll be the document node rather than the element.
99 curElement = m_frame->document()->documentElement();
100 DCHECK(!curElement || isEffectiveRootScroller(*curElement));
101 }
137 102
138 LayoutBox* curBox = node->layoutObject()->enclosingBox(); 103 if (curElement) {
139 while (curBox) { 104 scrollChain.push_front(DOMNodeIds::idForNode(curElement));
140 // If we're at the stopNode, we should try to scroll it but we shouldn't 105 if (isEffectiveRootScroller(*curElement))
141 // chain past it. 106 break;
142 bool shouldStopChaining =
143 stopNode && *stopNode && curBox->node() == *stopNode;
144 bool wasRootScroller = false;
145
146 result = scrollBox(
147 curBox,
148 granularity,
149 delta,
150 position,
151 velocity,
152 &wasRootScroller);
153
154 if (result.didScroll() && stopNode)
155 *stopNode = curBox->node();
156
157 if (result.didScroll() || shouldStopChaining) {
158 setFrameWasScrolledByUser();
159 if (consumed)
160 *consumed = true;
161 return result;
162 }
163 if (wasRootScroller) {
164 // Don't try to chain past the root scroller, even if there's
165 // eligible ancestors.
166 break;
167 } 107 }
168 108
169 curBox = curBox->containingBlock(); 109 curBox = curBox->containingBlock();
170 } 110 }
171
172 return result;
173 } 111 }
174 112
175 bool ScrollManager::logicalScroll(ScrollDirection direction, ScrollGranularity g ranularity, Node* startNode, Node* mousePressNode) 113 bool ScrollManager::logicalScroll(ScrollDirection direction, ScrollGranularity g ranularity, Node* startNode, Node* mousePressNode)
176 { 114 {
177 Node* node = startNode; 115 Node* node = startNode;
178 116
179 if (!node) 117 if (!node)
180 node = m_frame->document()->focusedElement(); 118 node = m_frame->document()->focusedElement();
181 119
182 if (!node) 120 if (!node)
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
219 if (logicalScroll(direction, granularity, startingNode, mousePressNode)) 157 if (logicalScroll(direction, granularity, startingNode, mousePressNode))
220 return true; 158 return true;
221 159
222 Frame* parentFrame = m_frame->tree().parent(); 160 Frame* parentFrame = m_frame->tree().parent();
223 if (!parentFrame || !parentFrame->isLocalFrame()) 161 if (!parentFrame || !parentFrame->isLocalFrame())
224 return false; 162 return false;
225 // FIXME: Broken for OOPI. 163 // FIXME: Broken for OOPI.
226 return toLocalFrame(parentFrame)->eventHandler().bubblingScroll(direction, g ranularity, m_frame->deprecatedLocalOwner()); 164 return toLocalFrame(parentFrame)->eventHandler().bubblingScroll(direction, g ranularity, m_frame->deprecatedLocalOwner());
227 } 165 }
228 166
229 ScrollResult ScrollManager::scrollBox(LayoutBox* box,
230 ScrollGranularity granularity, const FloatSize& delta,
231 const FloatPoint& position, const FloatSize& velocity,
232 bool* wasRootScroller)
233 {
234 DCHECK(box);
235 Node* node = box->node();
236
237 // If there's no ApplyScroll callback on the element, scroll as usuall in
238 // the non-scroll-customization case.
239 if (!node || !node->isElementNode() || !toElement(node)->getApplyScroll()) {
240 *wasRootScroller = false;
241 return box->scroll(granularity, delta);
242 }
243
244 // If there is an ApplyScroll callback, its because we placed one on the
245 // root scroller to control top controls and overscroll. Invoke a scroll
246 // using parts of the scroll customization framework on just this element.
247 computeScrollChainForSingleNode(*node, m_currentScrollChain);
248
249 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData());
250 scrollStateData->delta_x = delta.width();
251 scrollStateData->delta_y = delta.height();
252 scrollStateData->position_x = position.x();
253 scrollStateData->position_y = position.y();
254 // TODO(bokan): delta_granularity is meant to be the number of pixels per
255 // unit of delta but we can't determine that until we get to the area we'll
256 // scroll. This is a hack, we stuff the enum into the double value for
257 // now.
258 scrollStateData->delta_granularity = static_cast<double>(granularity);
259 scrollStateData->velocity_x = velocity.width();
260 scrollStateData->velocity_y = velocity.height();
261 scrollStateData->should_propagate = false;
262 scrollStateData->is_in_inertial_phase = false;
263 scrollStateData->from_user_input = true;
264 scrollStateData->delta_consumed_for_scroll_sequence = false;
265 ScrollState* scrollState =
266 ScrollState::create(std::move(scrollStateData));
267
268 customizedScroll(*node, *scrollState);
269
270 ScrollResult result(
271 scrollState->deltaX() != delta.width(),
272 scrollState->deltaY() != delta.height(),
273 scrollState->deltaX(),
274 scrollState->deltaY());
275
276 *wasRootScroller = true;
277 m_currentScrollChain.clear();
278
279 return result;
280 }
281
282 void ScrollManager::setFrameWasScrolledByUser() 167 void ScrollManager::setFrameWasScrolledByUser()
283 { 168 {
284 if (DocumentLoader* documentLoader = m_frame->loader().documentLoader()) 169 if (DocumentLoader* documentLoader = m_frame->loader().documentLoader())
285 documentLoader->initialScrollState().wasScrolledByUser = true; 170 documentLoader->initialScrollState().wasScrolledByUser = true;
286 } 171 }
287 172
288 void ScrollManager::customizedScroll(const Node& startNode, ScrollState& scrollS tate) 173 void ScrollManager::customizedScroll(const Node& startNode, ScrollState& scrollS tate)
289 { 174 {
290 if (scrollState.fullyConsumed()) 175 if (scrollState.fullyConsumed())
291 return; 176 return;
292 177
293 if (scrollState.deltaX() || scrollState.deltaY()) 178 if (scrollState.deltaX() || scrollState.deltaY())
294 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); 179 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets();
295 180
296 if (m_currentScrollChain.empty()) 181 if (m_currentScrollChain.empty())
297 recomputeScrollChain(*m_frame, startNode, m_currentScrollChain); 182 recomputeScrollChain(startNode, m_currentScrollChain);
298 scrollState.setScrollChain(m_currentScrollChain); 183 scrollState.setScrollChain(m_currentScrollChain);
299 184
300 scrollState.distributeToScrollChainDescendant(); 185 scrollState.distributeToScrollChainDescendant();
301 } 186 }
302 187
303 WebInputEventResult ScrollManager::handleGestureScrollBegin(const PlatformGestur eEvent& gestureEvent) 188 WebInputEventResult ScrollManager::handleGestureScrollBegin(const PlatformGestur eEvent& gestureEvent)
304 { 189 {
305 Document* document = m_frame->document(); 190 Document* document = m_frame->document();
191
306 if (document->layoutViewItem().isNull()) 192 if (document->layoutViewItem().isNull())
307 return WebInputEventResult::NotHandled; 193 return WebInputEventResult::NotHandled;
308 194
309 FrameView* view = m_frame->view(); 195 FrameView* view = m_frame->view();
310 if (!view) 196 if (!view)
311 return WebInputEventResult::NotHandled; 197 return WebInputEventResult::NotHandled;
312 198
313 // If there's no layoutObject on the node, send the event to the nearest anc estor with a layoutObject. 199 // If there's no layoutObject on the node, send the event to the nearest anc estor with a layoutObject.
314 // Needed for <option> and <optgroup> elements so we can touch scroll <selec t>s 200 // Needed for <option> and <optgroup> elements so we can touch scroll <selec t>s
315 while (m_scrollGestureHandlingNode && !m_scrollGestureHandlingNode->layoutOb ject()) 201 while (m_scrollGestureHandlingNode && !m_scrollGestureHandlingNode->layoutOb ject())
316 m_scrollGestureHandlingNode = m_scrollGestureHandlingNode->parentOrShado wHostNode(); 202 m_scrollGestureHandlingNode = m_scrollGestureHandlingNode->parentOrShado wHostNode();
317 203
318 if (!m_scrollGestureHandlingNode) { 204 if (!m_scrollGestureHandlingNode)
319 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) 205 m_scrollGestureHandlingNode = m_frame->document()->documentElement();
320 m_scrollGestureHandlingNode = m_frame->document()->documentElement() ; 206
321 else
322 return WebInputEventResult::NotHandled;
323 }
324 DCHECK(m_scrollGestureHandlingNode); 207 DCHECK(m_scrollGestureHandlingNode);
325 208
326 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la youtObject()); 209 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la youtObject());
327 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { 210
328 m_currentScrollChain.clear(); 211 m_currentScrollChain.clear();
329 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData() ); 212 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData());
330 scrollStateData->position_x = gestureEvent.position().x(); 213 scrollStateData->position_x = gestureEvent.position().x();
331 scrollStateData->position_y = gestureEvent.position().y(); 214 scrollStateData->position_y = gestureEvent.position().y();
332 scrollStateData->is_beginning = true; 215 scrollStateData->is_beginning = true;
333 scrollStateData->from_user_input = true; 216 scrollStateData->from_user_input = true;
334 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedFor ScrollSequence; 217 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedForScro llSequence;
335 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData )); 218 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData));
336 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState); 219 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState);
337 } else {
338 if (m_frame->isMainFrame())
339 m_frame->host()->topControls().scrollBegin();
340 }
341 return WebInputEventResult::HandledSystem; 220 return WebInputEventResult::HandledSystem;
342 } 221 }
343 222
344 WebInputEventResult ScrollManager::handleGestureScrollUpdate(const PlatformGestu reEvent& gestureEvent) 223 WebInputEventResult ScrollManager::handleGestureScrollUpdate(const PlatformGestu reEvent& gestureEvent)
345 { 224 {
346 DCHECK_EQ(gestureEvent.type(), PlatformEvent::GestureScrollUpdate); 225 DCHECK_EQ(gestureEvent.type(), PlatformEvent::GestureScrollUpdate);
347 226
348 // Negate the deltas since the gesture event stores finger movement and 227 // Negate the deltas since the gesture event stores finger movement and
349 // scrolling occurs in the direction opposite the finger's movement 228 // scrolling occurs in the direction opposite the finger's movement
350 // direction. e.g. Finger moving up has negative event delta but causes the 229 // direction. e.g. Finger moving up has negative event delta but causes the
351 // page to scroll down causing positive scroll delta. 230 // page to scroll down causing positive scroll delta.
352 FloatSize delta(-gestureEvent.deltaX(), -gestureEvent.deltaY()); 231 FloatSize delta(-gestureEvent.deltaX(), -gestureEvent.deltaY());
353 FloatSize velocity(-gestureEvent.velocityX(), -gestureEvent.velocityY()); 232 FloatSize velocity(-gestureEvent.velocityX(), -gestureEvent.velocityY());
233 FloatPoint position(gestureEvent.position());
234
354 if (delta.isZero()) 235 if (delta.isZero())
355 return WebInputEventResult::NotHandled; 236 return WebInputEventResult::NotHandled;
356 237
357 ScrollGranularity granularity = gestureEvent.deltaUnits();
358 Node* node = m_scrollGestureHandlingNode.get(); 238 Node* node = m_scrollGestureHandlingNode.get();
359 239
360 // Scroll customization is only available for touch. 240 if (!node)
361 bool handleScrollCustomization = RuntimeEnabledFeatures::scrollCustomization Enabled() && gestureEvent.source() == PlatformGestureSourceTouchscreen; 241 return WebInputEventResult::NotHandled;
362 if (node) {
363 LayoutObject* layoutObject = node->layoutObject();
364 if (!layoutObject)
365 return WebInputEventResult::NotHandled;
366 242
367 // Try to send the event to the correct view. 243 LayoutObject* layoutObject = node->layoutObject();
368 WebInputEventResult result = passScrollGestureEventToWidget(gestureEvent , layoutObject); 244 if (!layoutObject)
369 if (result != WebInputEventResult::NotHandled) { 245 return WebInputEventResult::NotHandled;
370 if (gestureEvent.preventPropagation()
371 && !RuntimeEnabledFeatures::scrollCustomizationEnabled()) {
372 // This is an optimization which doesn't apply with
373 // scroll customization enabled.
374 m_previousGestureScrolledNode = m_scrollGestureHandlingNode;
375 }
376 // FIXME: we should allow simultaneous scrolling of nested
377 // iframes along perpendicular axes. See crbug.com/466991.
378 m_deltaConsumedForScrollSequence = true;
379 return result;
380 }
381 246
382 if (handleScrollCustomization) { 247 // Try to send the event to the correct view.
383 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa ta()); 248 WebInputEventResult result = passScrollGestureEventToWidget(gestureEvent, la youtObject);
384 scrollStateData->delta_x = delta.width(); 249 if (result != WebInputEventResult::NotHandled) {
385 scrollStateData->delta_y = delta.height(); 250 // FIXME: we should allow simultaneous scrolling of nested
386 scrollStateData->delta_granularity = ScrollByPrecisePixel; 251 // iframes along perpendicular axes. See crbug.com/466991.
387 scrollStateData->velocity_x = velocity.width(); 252 m_deltaConsumedForScrollSequence = true;
388 scrollStateData->velocity_y = velocity.height(); 253 return result;
389 scrollStateData->should_propagate = !gestureEvent.preventPropagation (); 254 }
390 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase() == ScrollInertialPhaseMomentum;
391 scrollStateData->from_user_input = true;
392 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume dForScrollSequence;
393 ScrollState* scrollState = ScrollState::create(std::move(scrollState Data));
394 if (m_previousGestureScrolledNode) {
395 // The ScrollState needs to know what the current
396 // native scrolling element is, so that for an
397 // inertial scroll that shouldn't propagate, only the
398 // currently scrolling element responds.
399 DCHECK(m_previousGestureScrolledNode->isElementNode());
400 scrollState->setCurrentNativeScrollingElement(toElement(m_previo usGestureScrolledNode.get()));
401 }
402 customizedScroll(*node, *scrollState);
403 m_previousGestureScrolledNode = scrollState->currentNativeScrollingE lement();
404 m_deltaConsumedForScrollSequence = scrollState->deltaConsumedForScro llSequence();
405 if (scrollState->deltaX() != delta.width()
406 || scrollState->deltaY() != delta.height()) {
407 setFrameWasScrolledByUser();
408 return WebInputEventResult::HandledSystem;
409 }
410 } else {
411 Node* stopNode = nullptr;
412 if (gestureEvent.preventPropagation())
413 stopNode = m_previousGestureScrolledNode.get();
414 255
415 bool consumed = false; 256 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData());
416 ScrollResult result = physicalScroll( 257 scrollStateData->delta_x = delta.width();
417 granularity, 258 scrollStateData->delta_y = delta.height();
418 delta, 259 scrollStateData->delta_granularity = static_cast<double>(gestureEvent.deltaU nits());
419 FloatPoint(gestureEvent.position()), 260 scrollStateData->velocity_x = velocity.width();
420 velocity, 261 scrollStateData->velocity_y = velocity.height();
421 node, 262 scrollStateData->position_x = position.x();
422 &stopNode, 263 scrollStateData->position_y = position.y();
423 &consumed); 264 scrollStateData->should_propagate = !gestureEvent.preventPropagation();
265 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase() == Scro llInertialPhaseMomentum;
266 scrollStateData->from_user_input = true;
267 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedForScro llSequence;
268 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData));
269 if (m_previousGestureScrolledNode) {
270 // The ScrollState needs to know what the current
271 // native scrolling element is, so that for an
272 // inertial scroll that shouldn't propagate, only the
273 // currently scrolling element responds.
274 DCHECK(m_previousGestureScrolledNode->isElementNode());
275 scrollState->setCurrentNativeScrollingElement(toElement(m_previousGestur eScrolledNode.get()));
276 }
277 customizedScroll(*node, *scrollState);
278 m_previousGestureScrolledNode = scrollState->currentNativeScrollingElement() ;
279 m_deltaConsumedForScrollSequence = scrollState->deltaConsumedForScrollSequen ce();
424 280
425 if (gestureEvent.preventPropagation()) 281 bool didScrollX = scrollState->deltaX() != delta.width();
426 m_previousGestureScrolledNode = stopNode; 282 bool didScrollY = scrollState->deltaY() != delta.height();
427 283
428 if ((!stopNode || !isRootScroller(*stopNode)) && frameHost()) { 284 if ((!m_previousGestureScrolledNode || !isEffectiveRootScroller(*m_previousG estureScrolledNode)) && frameHost())
429 frameHost()->overscrollController().resetAccumulated( 285 frameHost()->overscrollController().resetAccumulated(didScrollX, didScro llY);
430 result.didScrollX, result.didScrollY);
431 }
432 286
433 if (consumed) 287 if (didScrollX || didScrollY) {
434 return WebInputEventResult::HandledSystem; 288 setFrameWasScrolledByUser();
435 } 289 return WebInputEventResult::HandledSystem;
436 } 290 }
437 291
438 return WebInputEventResult::NotHandled; 292 return WebInputEventResult::NotHandled;
439 } 293 }
440 294
441 WebInputEventResult ScrollManager::handleGestureScrollEnd(const PlatformGestureE vent& gestureEvent) 295 WebInputEventResult ScrollManager::handleGestureScrollEnd(const PlatformGestureE vent& gestureEvent)
442 { 296 {
443 Node* node = m_scrollGestureHandlingNode; 297 Node* node = m_scrollGestureHandlingNode;
444 298
445 if (node) { 299 if (node) {
446 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); 300 passScrollGestureEventToWidget(gestureEvent, node->layoutObject());
447 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { 301 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData() );
448 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa ta()); 302 scrollStateData->is_ending = true;
449 scrollStateData->is_ending = true; 303 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase() == ScrollInertialPhaseMomentum;
450 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase() == ScrollInertialPhaseMomentum; 304 scrollStateData->from_user_input = true;
451 scrollStateData->from_user_input = true; 305 scrollStateData->is_direct_manipulation = true;
452 scrollStateData->is_direct_manipulation = true; 306 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedFor ScrollSequence;
453 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume dForScrollSequence; 307 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData ));
454 ScrollState* scrollState = ScrollState::create(std::move(scrollState Data)); 308 customizedScroll(*node, *scrollState);
455 customizedScroll(*node, *scrollState);
456 }
457 } 309 }
458 310
459 clearGestureScrollState(); 311 clearGestureScrollState();
460 return WebInputEventResult::NotHandled; 312 return WebInputEventResult::NotHandled;
461 } 313 }
462 314
463 FrameHost* ScrollManager::frameHost() const 315 FrameHost* ScrollManager::frameHost() const
464 { 316 {
465 if (!m_frame->page()) 317 if (!m_frame->page())
466 return nullptr; 318 return nullptr;
467 319
468 return &m_frame->page()->frameHost(); 320 return &m_frame->page()->frameHost();
469 } 321 }
470 322
471 WebInputEventResult ScrollManager::passScrollGestureEventToWidget(const Platform GestureEvent& gestureEvent, LayoutObject* layoutObject) 323 WebInputEventResult ScrollManager::passScrollGestureEventToWidget(const Platform GestureEvent& gestureEvent, LayoutObject* layoutObject)
472 { 324 {
473 DCHECK(gestureEvent.isScrollEvent()); 325 DCHECK(gestureEvent.isScrollEvent());
474 326
475 if (!m_lastGestureScrollOverWidget || !layoutObject || !layoutObject->isLayo utPart()) 327 if (!m_lastGestureScrollOverWidget || !layoutObject || !layoutObject->isLayo utPart())
476 return WebInputEventResult::NotHandled; 328 return WebInputEventResult::NotHandled;
477 329
478 Widget* widget = toLayoutPart(layoutObject)->widget(); 330 Widget* widget = toLayoutPart(layoutObject)->widget();
479 331
480 if (!widget || !widget->isFrameView()) 332 if (!widget || !widget->isFrameView())
481 return WebInputEventResult::NotHandled; 333 return WebInputEventResult::NotHandled;
482 334
483 return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent( gestureEvent); 335 return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent( gestureEvent);
484 } 336 }
485 337
486 bool ScrollManager::isRootScroller(const Node& node) const 338 bool ScrollManager::isEffectiveRootScroller(const Node& node) const
487 { 339 {
488 // The root scroller is the one Element on the page designated to perform 340 // The root scroller is the one Element on the page designated to perform
489 // "viewport actions" like top controls movement and overscroll glow. 341 // "viewport actions" like top controls movement and overscroll glow.
490 if (!m_frame->document()) 342 if (!m_frame->document())
491 return false; 343 return false;
492 344
493 if (!node.isElementNode()) 345 if (!node.isElementNode())
494 return false; 346 return false;
495 347
496 return m_frame->document()->topDocument().isEffectiveRootScroller(toElement( node)); 348 return node.isSameNode(m_frame->document()->effectiveRootScroller());
497 } 349 }
498 350
499 351
500 WebInputEventResult ScrollManager::handleGestureScrollEvent(const PlatformGestur eEvent& gestureEvent) 352 WebInputEventResult ScrollManager::handleGestureScrollEvent(const PlatformGestur eEvent& gestureEvent)
501 { 353 {
502 Node* eventTarget = nullptr; 354 Node* eventTarget = nullptr;
503 Scrollbar* scrollbar = nullptr; 355 Scrollbar* scrollbar = nullptr;
504 if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) { 356 if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) {
505 scrollbar = m_scrollbarHandlingScrollGesture.get(); 357 scrollbar = m_scrollbarHandlingScrollGesture.get();
506 eventTarget = m_scrollGestureHandlingNode.get(); 358 eventTarget = m_scrollGestureHandlingNode.get();
507 } 359 }
508 360
509 if (!eventTarget) { 361 if (!eventTarget) {
510 Document* document = m_frame->document(); 362 Document* document = m_frame->document();
511 if (document->layoutViewItem().isNull()) 363 if (document->layoutViewItem().isNull())
512 return WebInputEventResult::NotHandled; 364 return WebInputEventResult::NotHandled;
513 365
514 FrameView* view = m_frame->view(); 366 FrameView* view = m_frame->view();
515 LayoutPoint viewPoint = view->rootFrameToContents(gestureEvent.position( )); 367 LayoutPoint viewPoint = view->rootFrameToContents(gestureEvent.position( ));
516 HitTestRequest request(HitTestRequest::ReadOnly); 368 HitTestRequest request(HitTestRequest::ReadOnly);
517 HitTestResult result(request, viewPoint); 369 HitTestResult result(request, viewPoint);
518 document->layoutViewItem().hitTest(result); 370 document->layoutViewItem().hitTest(result);
519 371
520 eventTarget = result.innerNode(); 372 eventTarget = result.innerNode();
521 373
522 m_lastGestureScrollOverWidget = result.isOverWidget(); 374 m_lastGestureScrollOverWidget = result.isOverWidget();
523 m_scrollGestureHandlingNode = eventTarget; 375 m_scrollGestureHandlingNode = eventTarget;
524 m_previousGestureScrolledNode = nullptr; 376 m_previousGestureScrolledNode = nullptr;
377 m_deltaConsumedForScrollSequence = false;
525 378
526 if (!scrollbar) 379 if (!scrollbar)
527 scrollbar = result.scrollbar(); 380 scrollbar = result.scrollbar();
528 } 381 }
529 382
530 if (scrollbar) { 383 if (scrollbar) {
531 bool shouldUpdateCapture = false; 384 bool shouldUpdateCapture = false;
532 if (scrollbar->gestureEvent(gestureEvent, &shouldUpdateCapture)) { 385 if (scrollbar->gestureEvent(gestureEvent, &shouldUpdateCapture)) {
533 if (shouldUpdateCapture) 386 if (shouldUpdateCapture)
534 m_scrollbarHandlingScrollGesture = scrollbar; 387 m_scrollbarHandlingScrollGesture = scrollbar;
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 DEFINE_TRACE(ScrollManager) 499 DEFINE_TRACE(ScrollManager)
647 { 500 {
648 visitor->trace(m_frame); 501 visitor->trace(m_frame);
649 visitor->trace(m_scrollGestureHandlingNode); 502 visitor->trace(m_scrollGestureHandlingNode);
650 visitor->trace(m_previousGestureScrolledNode); 503 visitor->trace(m_previousGestureScrolledNode);
651 visitor->trace(m_scrollbarHandlingScrollGesture); 504 visitor->trace(m_scrollbarHandlingScrollGesture);
652 visitor->trace(m_resizeScrollableArea); 505 visitor->trace(m_resizeScrollableArea);
653 } 506 }
654 507
655 } // namespace blink 508 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698