OLD | NEW |
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 #include "wtf/PtrUtil.h" | |
23 #include <memory> | |
24 | 22 |
25 | 23 |
26 namespace blink { | 24 namespace blink { |
27 | 25 |
28 namespace { | 26 namespace { |
29 | 27 |
30 // TODO(bokan): This method can go away once all scrolls happen through the | 28 // TODO(bokan): This method can go away once all scrolls happen through the |
31 // scroll customization path. | 29 // scroll customization path. |
32 void computeScrollChainForSingleNode(Node& node, std::deque<int>& scrollChain) | 30 void computeScrollChainForSingleNode(Node& node, std::deque<int>& scrollChain) |
33 { | 31 { |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 if (!node || !node->isElementNode() || !toElement(node)->getApplyScroll()) { | 239 if (!node || !node->isElementNode() || !toElement(node)->getApplyScroll()) { |
242 *wasRootScroller = false; | 240 *wasRootScroller = false; |
243 return box->scroll(granularity, delta); | 241 return box->scroll(granularity, delta); |
244 } | 242 } |
245 | 243 |
246 // If there is an ApplyScroll callback, its because we placed one on the | 244 // If there is an ApplyScroll callback, its because we placed one on the |
247 // root scroller to control top controls and overscroll. Invoke a scroll | 245 // root scroller to control top controls and overscroll. Invoke a scroll |
248 // using parts of the scroll customization framework on just this element. | 246 // using parts of the scroll customization framework on just this element. |
249 computeScrollChainForSingleNode(*node, m_currentScrollChain); | 247 computeScrollChainForSingleNode(*node, m_currentScrollChain); |
250 | 248 |
251 std::unique_ptr<ScrollStateData> scrollStateData = wrapUnique(new ScrollStat
eData()); | 249 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData()); |
252 scrollStateData->delta_x = delta.width(); | 250 scrollStateData->delta_x = delta.width(); |
253 scrollStateData->delta_y = delta.height(); | 251 scrollStateData->delta_y = delta.height(); |
254 scrollStateData->position_x = position.x(); | 252 scrollStateData->position_x = position.x(); |
255 scrollStateData->position_y = position.y(); | 253 scrollStateData->position_y = position.y(); |
256 // TODO(bokan): delta_granularity is meant to be the number of pixels per | 254 // TODO(bokan): delta_granularity is meant to be the number of pixels per |
257 // unit of delta but we can't determine that until we get to the area we'll | 255 // unit of delta but we can't determine that until we get to the area we'll |
258 // scroll. This is a hack, we stuff the enum into the double value for | 256 // scroll. This is a hack, we stuff the enum into the double value for |
259 // now. | 257 // now. |
260 scrollStateData->delta_granularity = static_cast<double>(granularity); | 258 scrollStateData->delta_granularity = static_cast<double>(granularity); |
261 scrollStateData->velocity_x = velocity.width(); | 259 scrollStateData->velocity_x = velocity.width(); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
321 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) | 319 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) |
322 m_scrollGestureHandlingNode = m_frame->document()->documentElement()
; | 320 m_scrollGestureHandlingNode = m_frame->document()->documentElement()
; |
323 else | 321 else |
324 return WebInputEventResult::NotHandled; | 322 return WebInputEventResult::NotHandled; |
325 } | 323 } |
326 DCHECK(m_scrollGestureHandlingNode); | 324 DCHECK(m_scrollGestureHandlingNode); |
327 | 325 |
328 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la
youtObject()); | 326 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la
youtObject()); |
329 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { | 327 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { |
330 m_currentScrollChain.clear(); | 328 m_currentScrollChain.clear(); |
331 std::unique_ptr<ScrollStateData> scrollStateData = wrapUnique(new Scroll
StateData()); | 329 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData()
); |
332 scrollStateData->position_x = gestureEvent.position().x(); | 330 scrollStateData->position_x = gestureEvent.position().x(); |
333 scrollStateData->position_y = gestureEvent.position().y(); | 331 scrollStateData->position_y = gestureEvent.position().y(); |
334 scrollStateData->is_beginning = true; | 332 scrollStateData->is_beginning = true; |
335 scrollStateData->from_user_input = true; | 333 scrollStateData->from_user_input = true; |
336 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedFor
ScrollSequence; | 334 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedFor
ScrollSequence; |
337 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData
)); | 335 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData
)); |
338 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState); | 336 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState); |
339 } else { | 337 } else { |
340 if (m_frame->isMainFrame()) | 338 if (m_frame->isMainFrame()) |
341 m_frame->host()->topControls().scrollBegin(); | 339 m_frame->host()->topControls().scrollBegin(); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 // scroll customization enabled. | 373 // scroll customization enabled. |
376 m_previousGestureScrolledNode = m_scrollGestureHandlingNode; | 374 m_previousGestureScrolledNode = m_scrollGestureHandlingNode; |
377 } | 375 } |
378 // FIXME: we should allow simultaneous scrolling of nested | 376 // FIXME: we should allow simultaneous scrolling of nested |
379 // iframes along perpendicular axes. See crbug.com/466991. | 377 // iframes along perpendicular axes. See crbug.com/466991. |
380 m_deltaConsumedForScrollSequence = true; | 378 m_deltaConsumedForScrollSequence = true; |
381 return result; | 379 return result; |
382 } | 380 } |
383 | 381 |
384 if (handleScrollCustomization) { | 382 if (handleScrollCustomization) { |
385 std::unique_ptr<ScrollStateData> scrollStateData = wrapUnique(new Sc
rollStateData()); | 383 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa
ta()); |
386 scrollStateData->delta_x = delta.width(); | 384 scrollStateData->delta_x = delta.width(); |
387 scrollStateData->delta_y = delta.height(); | 385 scrollStateData->delta_y = delta.height(); |
388 scrollStateData->delta_granularity = ScrollByPrecisePixel; | 386 scrollStateData->delta_granularity = ScrollByPrecisePixel; |
389 scrollStateData->velocity_x = velocity.width(); | 387 scrollStateData->velocity_x = velocity.width(); |
390 scrollStateData->velocity_y = velocity.height(); | 388 scrollStateData->velocity_y = velocity.height(); |
391 scrollStateData->should_propagate = !gestureEvent.preventPropagation
(); | 389 scrollStateData->should_propagate = !gestureEvent.preventPropagation
(); |
392 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase()
== ScrollInertialPhaseMomentum; | 390 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase()
== ScrollInertialPhaseMomentum; |
393 scrollStateData->from_user_input = true; | 391 scrollStateData->from_user_input = true; |
394 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume
dForScrollSequence; | 392 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume
dForScrollSequence; |
395 ScrollState* scrollState = ScrollState::create(std::move(scrollState
Data)); | 393 ScrollState* scrollState = ScrollState::create(std::move(scrollState
Data)); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 return WebInputEventResult::NotHandled; | 438 return WebInputEventResult::NotHandled; |
441 } | 439 } |
442 | 440 |
443 WebInputEventResult ScrollManager::handleGestureScrollEnd(const PlatformGestureE
vent& gestureEvent) | 441 WebInputEventResult ScrollManager::handleGestureScrollEnd(const PlatformGestureE
vent& gestureEvent) |
444 { | 442 { |
445 Node* node = m_scrollGestureHandlingNode; | 443 Node* node = m_scrollGestureHandlingNode; |
446 | 444 |
447 if (node) { | 445 if (node) { |
448 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); | 446 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); |
449 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { | 447 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { |
450 std::unique_ptr<ScrollStateData> scrollStateData = wrapUnique(new Sc
rollStateData()); | 448 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa
ta()); |
451 scrollStateData->is_ending = true; | 449 scrollStateData->is_ending = true; |
452 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase()
== ScrollInertialPhaseMomentum; | 450 scrollStateData->is_in_inertial_phase = gestureEvent.inertialPhase()
== ScrollInertialPhaseMomentum; |
453 scrollStateData->from_user_input = true; | 451 scrollStateData->from_user_input = true; |
454 scrollStateData->is_direct_manipulation = true; | 452 scrollStateData->is_direct_manipulation = true; |
455 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume
dForScrollSequence; | 453 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume
dForScrollSequence; |
456 ScrollState* scrollState = ScrollState::create(std::move(scrollState
Data)); | 454 ScrollState* scrollState = ScrollState::create(std::move(scrollState
Data)); |
457 customizedScroll(*node, *scrollState); | 455 customizedScroll(*node, *scrollState); |
458 } | 456 } |
459 } | 457 } |
460 | 458 |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
648 DEFINE_TRACE(ScrollManager) | 646 DEFINE_TRACE(ScrollManager) |
649 { | 647 { |
650 visitor->trace(m_frame); | 648 visitor->trace(m_frame); |
651 visitor->trace(m_scrollGestureHandlingNode); | 649 visitor->trace(m_scrollGestureHandlingNode); |
652 visitor->trace(m_previousGestureScrolledNode); | 650 visitor->trace(m_previousGestureScrolledNode); |
653 visitor->trace(m_scrollbarHandlingScrollGesture); | 651 visitor->trace(m_scrollbarHandlingScrollGesture); |
654 visitor->trace(m_resizeScrollableArea); | 652 visitor->trace(m_resizeScrollableArea); |
655 } | 653 } |
656 | 654 |
657 } // namespace blink | 655 } // namespace blink |
OLD | NEW |