| Index: third_party/WebKit/Source/core/input/ScrollManager.cpp
|
| diff --git a/third_party/WebKit/Source/core/input/ScrollManager.cpp b/third_party/WebKit/Source/core/input/ScrollManager.cpp
|
| index c858794fe836c173daa354c437ed73fef0562e7d..e32f759d83768562f7527091bc4a299fc34baacf 100644
|
| --- a/third_party/WebKit/Source/core/input/ScrollManager.cpp
|
| +++ b/third_party/WebKit/Source/core/input/ScrollManager.cpp
|
| @@ -6,6 +6,7 @@
|
|
|
| #include <memory>
|
| #include "core/dom/DOMNodeIds.h"
|
| +#include "core/dom/NodeComputedStyle.h"
|
| #include "core/events/GestureEvent.h"
|
| #include "core/frame/BrowserControls.h"
|
| #include "core/frame/FrameView.h"
|
| @@ -79,12 +80,15 @@ AutoscrollController* ScrollManager::GetAutoscrollController() const {
|
| }
|
|
|
| void ScrollManager::RecomputeScrollChain(const Node& start_node,
|
| + const ScrollState& scroll_state,
|
| std::deque<int>& scroll_chain) {
|
| scroll_chain.clear();
|
|
|
| DCHECK(start_node.GetLayoutObject());
|
| LayoutBox* cur_box = start_node.GetLayoutObject()->EnclosingBox();
|
| Element* document_element = frame_->GetDocument()->documentElement();
|
| + bool x_dominated =
|
| + (std::abs(scroll_state.deltaX()) > std::abs(scroll_state.deltaY()));
|
|
|
| // Scrolling propagates along the containing block chain and ends at the
|
| // RootScroller element. The RootScroller element will have a custom
|
| @@ -108,6 +112,14 @@ void ScrollManager::RecomputeScrollChain(const Node& start_node,
|
| if (IsViewportScrollingElement(*cur_element) ||
|
| cur_element == document_element)
|
| break;
|
| +
|
| + if ((x_dominated &&
|
| + cur_element->GetComputedStyle()->ScrollBoundaryBehaviorX() !=
|
| + EScrollBoundaryBehavior::kAuto) ||
|
| + (!x_dominated &&
|
| + cur_element->GetComputedStyle()->ScrollBoundaryBehaviorY() !=
|
| + EScrollBoundaryBehavior::kAuto))
|
| + break;
|
| }
|
|
|
| cur_box = cur_box->ContainingBlock();
|
| @@ -188,14 +200,14 @@ void ScrollManager::CustomizedScroll(const Node& start_node,
|
| if (scroll_state.FullyConsumed())
|
| return;
|
|
|
| - if (scroll_state.deltaX() || scroll_state.deltaY())
|
| + if (scroll_state.deltaX() || scroll_state.deltaY()) {
|
| frame_->GetDocument()->UpdateStyleAndLayoutIgnorePendingStylesheets();
|
| + if (current_scroll_chain_.empty())
|
| + RecomputeScrollChain(start_node, scroll_state, current_scroll_chain_);
|
| + scroll_state.SetScrollChain(current_scroll_chain_);
|
|
|
| - if (current_scroll_chain_.empty())
|
| - RecomputeScrollChain(start_node, current_scroll_chain_);
|
| - scroll_state.SetScrollChain(current_scroll_chain_);
|
| -
|
| - scroll_state.distributeToScrollChainDescendant();
|
| + scroll_state.distributeToScrollChainDescendant();
|
| + }
|
| }
|
|
|
| void ScrollManager::ComputeScrollRelatedMetrics(
|
|
|