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 <memory> | 7 #include <memory> |
8 #include "core/dom/DOMNodeIds.h" | 8 #include "core/dom/DOMNodeIds.h" |
| 9 #include "core/dom/NodeComputedStyle.h" |
9 #include "core/events/GestureEvent.h" | 10 #include "core/events/GestureEvent.h" |
10 #include "core/frame/BrowserControls.h" | 11 #include "core/frame/BrowserControls.h" |
11 #include "core/frame/FrameView.h" | 12 #include "core/frame/FrameView.h" |
12 #include "core/html/HTMLFrameOwnerElement.h" | 13 #include "core/html/HTMLFrameOwnerElement.h" |
13 #include "core/input/EventHandler.h" | 14 #include "core/input/EventHandler.h" |
14 #include "core/input/EventHandlingUtil.h" | 15 #include "core/input/EventHandlingUtil.h" |
15 #include "core/layout/LayoutBlock.h" | 16 #include "core/layout/LayoutBlock.h" |
16 #include "core/layout/LayoutPart.h" | 17 #include "core/layout/LayoutPart.h" |
17 #include "core/layout/api/LayoutViewItem.h" | 18 #include "core/layout/api/LayoutViewItem.h" |
18 #include "core/loader/DocumentLoader.h" | 19 #include "core/loader/DocumentLoader.h" |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 GetAutoscrollController()->MiddleClickAutoscrollInProgress(); | 73 GetAutoscrollController()->MiddleClickAutoscrollInProgress(); |
73 } | 74 } |
74 | 75 |
75 AutoscrollController* ScrollManager::GetAutoscrollController() const { | 76 AutoscrollController* ScrollManager::GetAutoscrollController() const { |
76 if (Page* page = frame_->GetPage()) | 77 if (Page* page = frame_->GetPage()) |
77 return &page->GetAutoscrollController(); | 78 return &page->GetAutoscrollController(); |
78 return nullptr; | 79 return nullptr; |
79 } | 80 } |
80 | 81 |
81 void ScrollManager::RecomputeScrollChain(const Node& start_node, | 82 void ScrollManager::RecomputeScrollChain(const Node& start_node, |
| 83 const ScrollState& scroll_state, |
82 std::deque<int>& scroll_chain) { | 84 std::deque<int>& scroll_chain) { |
83 scroll_chain.clear(); | 85 scroll_chain.clear(); |
84 | 86 |
85 DCHECK(start_node.GetLayoutObject()); | 87 DCHECK(start_node.GetLayoutObject()); |
86 LayoutBox* cur_box = start_node.GetLayoutObject()->EnclosingBox(); | 88 LayoutBox* cur_box = start_node.GetLayoutObject()->EnclosingBox(); |
87 Element* document_element = frame_->GetDocument()->documentElement(); | 89 Element* document_element = frame_->GetDocument()->documentElement(); |
| 90 bool x_dominated = |
| 91 (std::abs(scroll_state.deltaX()) > std::abs(scroll_state.deltaY())); |
88 | 92 |
89 // Scrolling propagates along the containing block chain and ends at the | 93 // Scrolling propagates along the containing block chain and ends at the |
90 // RootScroller element. The RootScroller element will have a custom | 94 // RootScroller element. The RootScroller element will have a custom |
91 // applyScroll callback that scrolls the frame or element. | 95 // applyScroll callback that scrolls the frame or element. |
92 while (cur_box) { | 96 while (cur_box) { |
93 Node* cur_node = cur_box->GetNode(); | 97 Node* cur_node = cur_box->GetNode(); |
94 Element* cur_element = nullptr; | 98 Element* cur_element = nullptr; |
95 | 99 |
96 // FIXME: this should reject more elements, as part of crbug.com/410974. | 100 // FIXME: this should reject more elements, as part of crbug.com/410974. |
97 if (cur_node && cur_node->IsElementNode()) { | 101 if (cur_node && cur_node->IsElementNode()) { |
98 cur_element = ToElement(cur_node); | 102 cur_element = ToElement(cur_node); |
99 } else if (cur_node && cur_node->IsDocumentNode()) { | 103 } else if (cur_node && cur_node->IsDocumentNode()) { |
100 // In normal circumastances, the documentElement will be the root | 104 // In normal circumastances, the documentElement will be the root |
101 // scroller but the documentElement itself isn't a containing block, | 105 // scroller but the documentElement itself isn't a containing block, |
102 // that'll be the document node rather than the element. | 106 // that'll be the document node rather than the element. |
103 cur_element = document_element; | 107 cur_element = document_element; |
104 } | 108 } |
105 | 109 |
106 if (cur_element) { | 110 if (cur_element) { |
107 scroll_chain.push_front(DOMNodeIds::IdForNode(cur_element)); | 111 scroll_chain.push_front(DOMNodeIds::IdForNode(cur_element)); |
108 if (IsViewportScrollingElement(*cur_element) || | 112 if (IsViewportScrollingElement(*cur_element) || |
109 cur_element == document_element) | 113 cur_element == document_element) |
110 break; | 114 break; |
| 115 |
| 116 if ((x_dominated && |
| 117 cur_element->GetComputedStyle()->ScrollBoundaryBehaviorX() != |
| 118 EScrollBoundaryBehavior::kAuto) || |
| 119 (!x_dominated && |
| 120 cur_element->GetComputedStyle()->ScrollBoundaryBehaviorY() != |
| 121 EScrollBoundaryBehavior::kAuto)) |
| 122 break; |
111 } | 123 } |
112 | 124 |
113 cur_box = cur_box->ContainingBlock(); | 125 cur_box = cur_box->ContainingBlock(); |
114 } | 126 } |
115 } | 127 } |
116 | 128 |
117 bool ScrollManager::LogicalScroll(ScrollDirection direction, | 129 bool ScrollManager::LogicalScroll(ScrollDirection direction, |
118 ScrollGranularity granularity, | 130 ScrollGranularity granularity, |
119 Node* start_node, | 131 Node* start_node, |
120 Node* mouse_press_node) { | 132 Node* mouse_press_node) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 void ScrollManager::SetFrameWasScrolledByUser() { | 193 void ScrollManager::SetFrameWasScrolledByUser() { |
182 if (DocumentLoader* document_loader = frame_->Loader().GetDocumentLoader()) | 194 if (DocumentLoader* document_loader = frame_->Loader().GetDocumentLoader()) |
183 document_loader->GetInitialScrollState().was_scrolled_by_user = true; | 195 document_loader->GetInitialScrollState().was_scrolled_by_user = true; |
184 } | 196 } |
185 | 197 |
186 void ScrollManager::CustomizedScroll(const Node& start_node, | 198 void ScrollManager::CustomizedScroll(const Node& start_node, |
187 ScrollState& scroll_state) { | 199 ScrollState& scroll_state) { |
188 if (scroll_state.FullyConsumed()) | 200 if (scroll_state.FullyConsumed()) |
189 return; | 201 return; |
190 | 202 |
191 if (scroll_state.deltaX() || scroll_state.deltaY()) | 203 if (scroll_state.deltaX() || scroll_state.deltaY()) { |
192 frame_->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); | 204 frame_->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets(); |
| 205 if (current_scroll_chain_.empty()) |
| 206 RecomputeScrollChain(start_node, scroll_state, current_scroll_chain_); |
| 207 scroll_state.SetScrollChain(current_scroll_chain_); |
193 | 208 |
194 if (current_scroll_chain_.empty()) | 209 scroll_state.distributeToScrollChainDescendant(); |
195 RecomputeScrollChain(start_node, current_scroll_chain_); | 210 } |
196 scroll_state.SetScrollChain(current_scroll_chain_); | |
197 | |
198 scroll_state.distributeToScrollChainDescendant(); | |
199 } | 211 } |
200 | 212 |
201 void ScrollManager::ComputeScrollRelatedMetrics( | 213 void ScrollManager::ComputeScrollRelatedMetrics( |
202 uint32_t* non_composited_main_thread_scrolling_reasons, | 214 uint32_t* non_composited_main_thread_scrolling_reasons, |
203 int* scroller_size) { | 215 int* scroller_size) { |
204 // When scrolling on the main thread, the scrollableArea may or may not be | 216 // When scrolling on the main thread, the scrollableArea may or may not be |
205 // composited. Either way, we have recorded either the reasons stored in | 217 // composited. Either way, we have recorded either the reasons stored in |
206 // its layer or the reason NonFastScrollableRegion from the compositor | 218 // its layer or the reason NonFastScrollableRegion from the compositor |
207 // side. Here we record scrolls that occurred on main thread due to a | 219 // side. Here we record scrolls that occurred on main thread due to a |
208 // non-composited scroller. | 220 // non-composited scroller. |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
654 &should_update_capture)) { | 666 &should_update_capture)) { |
655 if (should_update_capture) | 667 if (should_update_capture) |
656 scrollbar_handling_scroll_gesture_ = scrollbar; | 668 scrollbar_handling_scroll_gesture_ = scrollbar; |
657 return true; | 669 return true; |
658 } | 670 } |
659 } | 671 } |
660 return false; | 672 return false; |
661 } | 673 } |
662 | 674 |
663 } // namespace blink | 675 } // namespace blink |
OLD | NEW |