Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: third_party/WebKit/Source/core/input/ScrollManager.cpp

Issue 2394263003: Make sure we don't try scrolling a node without a LayoutObject (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | third_party/WebKit/Source/web/tests/WebFrameTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/web/tests/WebFrameTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698