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