| 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" |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 // If there's no layoutObject on the node, send the event to the nearest ances
tor with a layoutObject. | 205 // If there's no layoutObject on the node, send the event to the nearest ances
tor with a layoutObject. |
| 206 // Needed for <option> and <optgroup> elements so we can touch scroll <select>
s | 206 // Needed for <option> and <optgroup> elements so we can touch scroll <select>
s |
| 207 while (m_scrollGestureHandlingNode && | 207 while (m_scrollGestureHandlingNode && |
| 208 !m_scrollGestureHandlingNode->layoutObject()) | 208 !m_scrollGestureHandlingNode->layoutObject()) |
| 209 m_scrollGestureHandlingNode = | 209 m_scrollGestureHandlingNode = |
| 210 m_scrollGestureHandlingNode->parentOrShadowHostNode(); | 210 m_scrollGestureHandlingNode->parentOrShadowHostNode(); |
| 211 | 211 |
| 212 if (!m_scrollGestureHandlingNode) | 212 if (!m_scrollGestureHandlingNode) |
| 213 m_scrollGestureHandlingNode = m_frame->document()->documentElement(); | 213 m_scrollGestureHandlingNode = m_frame->document()->documentElement(); |
| 214 | 214 |
| 215 if (!m_scrollGestureHandlingNode) | 215 if (!m_scrollGestureHandlingNode || |
| 216 !m_scrollGestureHandlingNode->layoutObject()) |
| 216 return WebInputEventResult::NotHandled; | 217 return WebInputEventResult::NotHandled; |
| 217 | 218 |
| 218 passScrollGestureEventToWidget(gestureEvent, | 219 passScrollGestureEventToWidget(gestureEvent, |
| 219 m_scrollGestureHandlingNode->layoutObject()); | 220 m_scrollGestureHandlingNode->layoutObject()); |
| 220 | 221 |
| 221 m_currentScrollChain.clear(); | 222 m_currentScrollChain.clear(); |
| 222 std::unique_ptr<ScrollStateData> scrollStateData = | 223 std::unique_ptr<ScrollStateData> scrollStateData = |
| 223 wrapUnique(new ScrollStateData()); | 224 wrapUnique(new ScrollStateData()); |
| 224 scrollStateData->position_x = gestureEvent.position().x(); | 225 scrollStateData->position_x = gestureEvent.position().x(); |
| 225 scrollStateData->position_y = gestureEvent.position().y(); | 226 scrollStateData->position_y = gestureEvent.position().y(); |
| 226 scrollStateData->is_beginning = true; | 227 scrollStateData->is_beginning = true; |
| 227 scrollStateData->from_user_input = true; | 228 scrollStateData->from_user_input = true; |
| 228 scrollStateData->is_direct_manipulation = | 229 scrollStateData->is_direct_manipulation = |
| 229 gestureEvent.source() == PlatformGestureSourceTouchscreen; | 230 gestureEvent.source() == PlatformGestureSourceTouchscreen; |
| 230 scrollStateData->delta_consumed_for_scroll_sequence = | 231 scrollStateData->delta_consumed_for_scroll_sequence = |
| 231 m_deltaConsumedForScrollSequence; | 232 m_deltaConsumedForScrollSequence; |
| 232 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData)); | 233 ScrollState* scrollState = ScrollState::create(std::move(scrollStateData)); |
| 233 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState); | 234 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState); |
| 234 return WebInputEventResult::HandledSystem; | 235 return WebInputEventResult::HandledSystem; |
| 235 } | 236 } |
| 236 | 237 |
| 237 WebInputEventResult ScrollManager::handleGestureScrollUpdate( | 238 WebInputEventResult ScrollManager::handleGestureScrollUpdate( |
| 238 const PlatformGestureEvent& gestureEvent) { | 239 const PlatformGestureEvent& gestureEvent) { |
| 239 DCHECK_EQ(gestureEvent.type(), PlatformEvent::GestureScrollUpdate); | 240 DCHECK_EQ(gestureEvent.type(), PlatformEvent::GestureScrollUpdate); |
| 240 | 241 |
| 242 Node* node = m_scrollGestureHandlingNode.get(); |
| 243 if (!node || !node->layoutObject()) |
| 244 return WebInputEventResult::NotHandled; |
| 245 |
| 241 // Negate the deltas since the gesture event stores finger movement and | 246 // Negate the deltas since the gesture event stores finger movement and |
| 242 // scrolling occurs in the direction opposite the finger's movement | 247 // scrolling occurs in the direction opposite the finger's movement |
| 243 // direction. e.g. Finger moving up has negative event delta but causes the | 248 // direction. e.g. Finger moving up has negative event delta but causes the |
| 244 // page to scroll down causing positive scroll delta. | 249 // page to scroll down causing positive scroll delta. |
| 245 FloatSize delta(-gestureEvent.deltaX(), -gestureEvent.deltaY()); | 250 FloatSize delta(-gestureEvent.deltaX(), -gestureEvent.deltaY()); |
| 246 FloatSize velocity(-gestureEvent.velocityX(), -gestureEvent.velocityY()); | 251 FloatSize velocity(-gestureEvent.velocityX(), -gestureEvent.velocityY()); |
| 247 FloatPoint position(gestureEvent.position()); | 252 FloatPoint position(gestureEvent.position()); |
| 248 | 253 |
| 249 if (delta.isZero()) | 254 if (delta.isZero()) |
| 250 return WebInputEventResult::NotHandled; | 255 return WebInputEventResult::NotHandled; |
| 251 | 256 |
| 252 Node* node = m_scrollGestureHandlingNode.get(); | |
| 253 | |
| 254 if (!node) | |
| 255 return WebInputEventResult::NotHandled; | |
| 256 | |
| 257 LayoutObject* layoutObject = node->layoutObject(); | 257 LayoutObject* layoutObject = node->layoutObject(); |
| 258 if (!layoutObject) | |
| 259 return WebInputEventResult::NotHandled; | |
| 260 | 258 |
| 261 // Try to send the event to the correct view. | 259 // Try to send the event to the correct view. |
| 262 WebInputEventResult result = | 260 WebInputEventResult result = |
| 263 passScrollGestureEventToWidget(gestureEvent, layoutObject); | 261 passScrollGestureEventToWidget(gestureEvent, layoutObject); |
| 264 if (result != WebInputEventResult::NotHandled) { | 262 if (result != WebInputEventResult::NotHandled) { |
| 265 // FIXME: we should allow simultaneous scrolling of nested | 263 // FIXME: we should allow simultaneous scrolling of nested |
| 266 // iframes along perpendicular axes. See crbug.com/466991. | 264 // iframes along perpendicular axes. See crbug.com/466991. |
| 267 m_deltaConsumedForScrollSequence = true; | 265 m_deltaConsumedForScrollSequence = true; |
| 268 return result; | 266 return result; |
| 269 } | 267 } |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 return WebInputEventResult::HandledSystem; | 313 return WebInputEventResult::HandledSystem; |
| 316 } | 314 } |
| 317 | 315 |
| 318 return WebInputEventResult::NotHandled; | 316 return WebInputEventResult::NotHandled; |
| 319 } | 317 } |
| 320 | 318 |
| 321 WebInputEventResult ScrollManager::handleGestureScrollEnd( | 319 WebInputEventResult ScrollManager::handleGestureScrollEnd( |
| 322 const PlatformGestureEvent& gestureEvent) { | 320 const PlatformGestureEvent& gestureEvent) { |
| 323 Node* node = m_scrollGestureHandlingNode; | 321 Node* node = m_scrollGestureHandlingNode; |
| 324 | 322 |
| 325 if (node) { | 323 if (node && node->layoutObject()) { |
| 326 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); | 324 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); |
| 327 std::unique_ptr<ScrollStateData> scrollStateData = | 325 std::unique_ptr<ScrollStateData> scrollStateData = |
| 328 wrapUnique(new ScrollStateData()); | 326 wrapUnique(new ScrollStateData()); |
| 329 scrollStateData->is_ending = true; | 327 scrollStateData->is_ending = true; |
| 330 scrollStateData->is_in_inertial_phase = | 328 scrollStateData->is_in_inertial_phase = |
| 331 gestureEvent.inertialPhase() == ScrollInertialPhaseMomentum; | 329 gestureEvent.inertialPhase() == ScrollInertialPhaseMomentum; |
| 332 scrollStateData->from_user_input = true; | 330 scrollStateData->from_user_input = true; |
| 333 scrollStateData->is_direct_manipulation = | 331 scrollStateData->is_direct_manipulation = |
| 334 gestureEvent.source() == PlatformGestureSourceTouchscreen; | 332 gestureEvent.source() == PlatformGestureSourceTouchscreen; |
| 335 scrollStateData->delta_consumed_for_scroll_sequence = | 333 scrollStateData->delta_consumed_for_scroll_sequence = |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 if (scrollbar->gestureEvent(targetedEvent.event(), &shouldUpdateCapture)) { | 530 if (scrollbar->gestureEvent(targetedEvent.event(), &shouldUpdateCapture)) { |
| 533 if (shouldUpdateCapture) | 531 if (shouldUpdateCapture) |
| 534 m_scrollbarHandlingScrollGesture = scrollbar; | 532 m_scrollbarHandlingScrollGesture = scrollbar; |
| 535 return true; | 533 return true; |
| 536 } | 534 } |
| 537 } | 535 } |
| 538 return false; | 536 return false; |
| 539 } | 537 } |
| 540 | 538 |
| 541 } // namespace blink | 539 } // namespace blink |
| OLD | NEW |