| 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/events/GestureEvent.h" | 9 #include "core/events/GestureEvent.h" |
| 10 #include "core/frame/BrowserControls.h" | 10 #include "core/frame/BrowserControls.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 #include "platform/RuntimeEnabledFeatures.h" | 26 #include "platform/RuntimeEnabledFeatures.h" |
| 27 #include "wtf/PtrUtil.h" | 27 #include "wtf/PtrUtil.h" |
| 28 | 28 |
| 29 namespace blink { | 29 namespace blink { |
| 30 | 30 |
| 31 ScrollManager::ScrollManager(LocalFrame& frame) : m_frame(frame) { | 31 ScrollManager::ScrollManager(LocalFrame& frame) : m_frame(frame) { |
| 32 clear(); | 32 clear(); |
| 33 } | 33 } |
| 34 | 34 |
| 35 void ScrollManager::clear() { | 35 void ScrollManager::clear() { |
| 36 m_lastGestureScrollOverWidget = false; | 36 m_lastGestureScrollOverFrameViewBase = false; |
| 37 m_scrollbarHandlingScrollGesture = nullptr; | 37 m_scrollbarHandlingScrollGesture = nullptr; |
| 38 m_resizeScrollableArea = nullptr; | 38 m_resizeScrollableArea = nullptr; |
| 39 m_offsetFromResizeCorner = LayoutSize(); | 39 m_offsetFromResizeCorner = LayoutSize(); |
| 40 clearGestureScrollState(); | 40 clearGestureScrollState(); |
| 41 } | 41 } |
| 42 | 42 |
| 43 DEFINE_TRACE(ScrollManager) { | 43 DEFINE_TRACE(ScrollManager) { |
| 44 visitor->trace(m_frame); | 44 visitor->trace(m_frame); |
| 45 visitor->trace(m_scrollGestureHandlingNode); | 45 visitor->trace(m_scrollGestureHandlingNode); |
| 46 visitor->trace(m_previousGestureScrolledElement); | 46 visitor->trace(m_previousGestureScrolledElement); |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 m_scrollGestureHandlingNode = | 212 m_scrollGestureHandlingNode = |
| 213 m_scrollGestureHandlingNode->parentOrShadowHostNode(); | 213 m_scrollGestureHandlingNode->parentOrShadowHostNode(); |
| 214 | 214 |
| 215 if (!m_scrollGestureHandlingNode) | 215 if (!m_scrollGestureHandlingNode) |
| 216 m_scrollGestureHandlingNode = m_frame->document()->documentElement(); | 216 m_scrollGestureHandlingNode = m_frame->document()->documentElement(); |
| 217 | 217 |
| 218 if (!m_scrollGestureHandlingNode || | 218 if (!m_scrollGestureHandlingNode || |
| 219 !m_scrollGestureHandlingNode->layoutObject()) | 219 !m_scrollGestureHandlingNode->layoutObject()) |
| 220 return WebInputEventResult::NotHandled; | 220 return WebInputEventResult::NotHandled; |
| 221 | 221 |
| 222 passScrollGestureEventToWidget(gestureEvent, | 222 passScrollGestureEventToFrameViewBase( |
| 223 m_scrollGestureHandlingNode->layoutObject()); | 223 gestureEvent, m_scrollGestureHandlingNode->layoutObject()); |
| 224 | 224 |
| 225 m_currentScrollChain.clear(); | 225 m_currentScrollChain.clear(); |
| 226 std::unique_ptr<ScrollStateData> scrollStateData = | 226 std::unique_ptr<ScrollStateData> scrollStateData = |
| 227 WTF::makeUnique<ScrollStateData>(); | 227 WTF::makeUnique<ScrollStateData>(); |
| 228 IntPoint position = flooredIntPoint(gestureEvent.positionInRootFrame()); | 228 IntPoint position = flooredIntPoint(gestureEvent.positionInRootFrame()); |
| 229 scrollStateData->position_x = position.x(); | 229 scrollStateData->position_x = position.x(); |
| 230 scrollStateData->position_y = position.y(); | 230 scrollStateData->position_y = position.y(); |
| 231 scrollStateData->is_beginning = true; | 231 scrollStateData->is_beginning = true; |
| 232 scrollStateData->from_user_input = true; | 232 scrollStateData->from_user_input = true; |
| 233 scrollStateData->is_direct_manipulation = | 233 scrollStateData->is_direct_manipulation = |
| (...skipping 22 matching lines...) Expand all Loading... |
| 256 FloatSize velocity(-gestureEvent.velocityX(), -gestureEvent.velocityY()); | 256 FloatSize velocity(-gestureEvent.velocityX(), -gestureEvent.velocityY()); |
| 257 FloatPoint position(gestureEvent.positionInRootFrame()); | 257 FloatPoint position(gestureEvent.positionInRootFrame()); |
| 258 | 258 |
| 259 if (delta.isZero()) | 259 if (delta.isZero()) |
| 260 return WebInputEventResult::NotHandled; | 260 return WebInputEventResult::NotHandled; |
| 261 | 261 |
| 262 LayoutObject* layoutObject = node->layoutObject(); | 262 LayoutObject* layoutObject = node->layoutObject(); |
| 263 | 263 |
| 264 // Try to send the event to the correct view. | 264 // Try to send the event to the correct view. |
| 265 WebInputEventResult result = | 265 WebInputEventResult result = |
| 266 passScrollGestureEventToWidget(gestureEvent, layoutObject); | 266 passScrollGestureEventToFrameViewBase(gestureEvent, layoutObject); |
| 267 if (result != WebInputEventResult::NotHandled) { | 267 if (result != WebInputEventResult::NotHandled) { |
| 268 // FIXME: we should allow simultaneous scrolling of nested | 268 // FIXME: we should allow simultaneous scrolling of nested |
| 269 // iframes along perpendicular axes. See crbug.com/466991. | 269 // iframes along perpendicular axes. See crbug.com/466991. |
| 270 m_deltaConsumedForScrollSequence = true; | 270 m_deltaConsumedForScrollSequence = true; |
| 271 return result; | 271 return result; |
| 272 } | 272 } |
| 273 | 273 |
| 274 std::unique_ptr<ScrollStateData> scrollStateData = | 274 std::unique_ptr<ScrollStateData> scrollStateData = |
| 275 WTF::makeUnique<ScrollStateData>(); | 275 WTF::makeUnique<ScrollStateData>(); |
| 276 scrollStateData->delta_x = delta.width(); | 276 scrollStateData->delta_x = delta.width(); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 319 } | 319 } |
| 320 | 320 |
| 321 return WebInputEventResult::NotHandled; | 321 return WebInputEventResult::NotHandled; |
| 322 } | 322 } |
| 323 | 323 |
| 324 WebInputEventResult ScrollManager::handleGestureScrollEnd( | 324 WebInputEventResult ScrollManager::handleGestureScrollEnd( |
| 325 const WebGestureEvent& gestureEvent) { | 325 const WebGestureEvent& gestureEvent) { |
| 326 Node* node = m_scrollGestureHandlingNode; | 326 Node* node = m_scrollGestureHandlingNode; |
| 327 | 327 |
| 328 if (node && node->layoutObject()) { | 328 if (node && node->layoutObject()) { |
| 329 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); | 329 passScrollGestureEventToFrameViewBase(gestureEvent, node->layoutObject()); |
| 330 std::unique_ptr<ScrollStateData> scrollStateData = | 330 std::unique_ptr<ScrollStateData> scrollStateData = |
| 331 WTF::makeUnique<ScrollStateData>(); | 331 WTF::makeUnique<ScrollStateData>(); |
| 332 scrollStateData->is_ending = true; | 332 scrollStateData->is_ending = true; |
| 333 scrollStateData->is_in_inertial_phase = | 333 scrollStateData->is_in_inertial_phase = |
| 334 gestureEvent.inertialPhase() == WebGestureEvent::MomentumPhase; | 334 gestureEvent.inertialPhase() == WebGestureEvent::MomentumPhase; |
| 335 scrollStateData->from_user_input = true; | 335 scrollStateData->from_user_input = true; |
| 336 scrollStateData->is_direct_manipulation = | 336 scrollStateData->is_direct_manipulation = |
| 337 gestureEvent.sourceDevice == WebGestureDeviceTouchscreen; | 337 gestureEvent.sourceDevice == WebGestureDeviceTouchscreen; |
| 338 scrollStateData->delta_consumed_for_scroll_sequence = | 338 scrollStateData->delta_consumed_for_scroll_sequence = |
| 339 m_deltaConsumedForScrollSequence; | 339 m_deltaConsumedForScrollSequence; |
| 340 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData)); | 340 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData)); |
| 341 customizedScroll(*node, *scrollState); | 341 customizedScroll(*node, *scrollState); |
| 342 } | 342 } |
| 343 | 343 |
| 344 clearGestureScrollState(); | 344 clearGestureScrollState(); |
| 345 return WebInputEventResult::NotHandled; | 345 return WebInputEventResult::NotHandled; |
| 346 } | 346 } |
| 347 | 347 |
| 348 FrameHost* ScrollManager::frameHost() const { | 348 FrameHost* ScrollManager::frameHost() const { |
| 349 if (!m_frame->page()) | 349 if (!m_frame->page()) |
| 350 return nullptr; | 350 return nullptr; |
| 351 | 351 |
| 352 return &m_frame->page()->frameHost(); | 352 return &m_frame->page()->frameHost(); |
| 353 } | 353 } |
| 354 | 354 |
| 355 WebInputEventResult ScrollManager::passScrollGestureEventToWidget( | 355 WebInputEventResult ScrollManager::passScrollGestureEventToFrameViewBase( |
| 356 const WebGestureEvent& gestureEvent, | 356 const WebGestureEvent& gestureEvent, |
| 357 LayoutObject* layoutObject) { | 357 LayoutObject* layoutObject) { |
| 358 DCHECK(gestureEvent.isScrollEvent()); | 358 DCHECK(gestureEvent.isScrollEvent()); |
| 359 | 359 |
| 360 if (!m_lastGestureScrollOverWidget || !layoutObject || | 360 if (!m_lastGestureScrollOverFrameViewBase || !layoutObject || |
| 361 !layoutObject->isLayoutPart()) | 361 !layoutObject->isLayoutPart()) |
| 362 return WebInputEventResult::NotHandled; | 362 return WebInputEventResult::NotHandled; |
| 363 | 363 |
| 364 FrameViewBase* frameViewBase = toLayoutPart(layoutObject)->widget(); | 364 FrameViewBase* frameViewBase = toLayoutPart(layoutObject)->widget(); |
| 365 | 365 |
| 366 if (!frameViewBase || !frameViewBase->isFrameView()) | 366 if (!frameViewBase || !frameViewBase->isFrameView()) |
| 367 return WebInputEventResult::NotHandled; | 367 return WebInputEventResult::NotHandled; |
| 368 | 368 |
| 369 return toFrameView(frameViewBase) | 369 return toFrameView(frameViewBase) |
| 370 ->frame() | 370 ->frame() |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 403 | 403 |
| 404 FrameView* view = m_frame->view(); | 404 FrameView* view = m_frame->view(); |
| 405 LayoutPoint viewPoint = view->rootFrameToContents( | 405 LayoutPoint viewPoint = view->rootFrameToContents( |
| 406 flooredIntPoint(gestureEvent.positionInRootFrame())); | 406 flooredIntPoint(gestureEvent.positionInRootFrame())); |
| 407 HitTestRequest request(HitTestRequest::ReadOnly); | 407 HitTestRequest request(HitTestRequest::ReadOnly); |
| 408 HitTestResult result(request, viewPoint); | 408 HitTestResult result(request, viewPoint); |
| 409 document->layoutViewItem().hitTest(result); | 409 document->layoutViewItem().hitTest(result); |
| 410 | 410 |
| 411 eventTarget = result.innerNode(); | 411 eventTarget = result.innerNode(); |
| 412 | 412 |
| 413 m_lastGestureScrollOverWidget = result.isOverWidget(); | 413 m_lastGestureScrollOverFrameViewBase = result.isOverFrameViewBase(); |
| 414 m_scrollGestureHandlingNode = eventTarget; | 414 m_scrollGestureHandlingNode = eventTarget; |
| 415 m_previousGestureScrolledElement = nullptr; | 415 m_previousGestureScrolledElement = nullptr; |
| 416 m_deltaConsumedForScrollSequence = false; | 416 m_deltaConsumedForScrollSequence = false; |
| 417 | 417 |
| 418 if (!scrollbar) | 418 if (!scrollbar) |
| 419 scrollbar = result.scrollbar(); | 419 scrollbar = result.scrollbar(); |
| 420 } | 420 } |
| 421 | 421 |
| 422 if (scrollbar) { | 422 if (scrollbar) { |
| 423 bool shouldUpdateCapture = false; | 423 bool shouldUpdateCapture = false; |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 if (scrollbar->gestureEvent(targetedEvent.event(), &shouldUpdateCapture)) { | 558 if (scrollbar->gestureEvent(targetedEvent.event(), &shouldUpdateCapture)) { |
| 559 if (shouldUpdateCapture) | 559 if (shouldUpdateCapture) |
| 560 m_scrollbarHandlingScrollGesture = scrollbar; | 560 m_scrollbarHandlingScrollGesture = scrollbar; |
| 561 return true; | 561 return true; |
| 562 } | 562 } |
| 563 } | 563 } |
| 564 return false; | 564 return false; |
| 565 } | 565 } |
| 566 | 566 |
| 567 } // namespace blink | 567 } // namespace blink |
| OLD | NEW |