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 passScrollGestureEvent(gestureEvent, |
223 m_scrollGestureHandlingNode->layoutObject()); | 223 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 passScrollGestureEvent(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 passScrollGestureEvent(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::passScrollGestureEvent( |
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)->frameViewBase(); | 364 FrameViewBase* frameViewBase = toLayoutPart(layoutObject)->frameViewBase(); |
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 |