Changeset 171283 in webkit
- Timestamp:
- Jul 20, 2014 1:11:57 PM (10 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r171282 r171283 1 2014-07-20 Darin Adler <darin@apple.com> 2 3 Crashes seen in wheel event handling 4 https://bugs.webkit.org/show_bug.cgi?id=135102 5 6 Reviewed by Beth Dakin. 7 8 Speculative fix based on guesses about what could be crashing. 9 The crash seems to be calling ref on an event target, and my guess is that this 10 has something to do with latching. 11 12 * page/EventHandler.cpp: 13 (WebCore::EventHandler::platformPrepareForWheelEvents): Updated argument types. 14 (WebCore::EventHandler::handleWheelEvent): Refactored a little and made some local 15 variables use RefPtr instead of raw pointers. Also added some comments. 16 17 * page/EventHandler.h: Changed argument types to RefPtr. 18 19 * page/mac/EventHandlerMac.mm: 20 (WebCore::EventHandler::platformPrepareForWheelEvents): Updated argument types. 21 Also added a FIXME. 22 1 23 2014-07-20 Simon Fraser <simon.fraser@apple.com> 2 24 -
trunk/Source/WebCore/page/EventHandler.cpp
r170765 r171283 2506 2506 2507 2507 #if !PLATFORM(GTK) 2508 2508 2509 bool EventHandler::shouldTurnVerticalTicksIntoHorizontal(const HitTestResult&, const PlatformWheelEvent&) const 2509 2510 { 2510 2511 return false; 2511 2512 } 2513 2512 2514 #endif 2513 2515 2514 2516 #if !PLATFORM(MAC) 2515 void EventHandler::platformPrepareForWheelEvents(const PlatformWheelEvent&, const HitTestResult&, Element*&, ContainerNode*&, ScrollableArea*&, bool&) 2517 2518 void EventHandler::platformPrepareForWheelEvents(const PlatformWheelEvent&, const HitTestResult&, RefPtr<Element>&, RefPtr<ContainerNode>&, ScrollableArea*&, bool&) 2516 2519 { 2517 2520 } … … 2536 2539 return true; 2537 2540 } 2538 #endif 2539 2540 bool EventHandler::handleWheelEvent(const PlatformWheelEvent& e) 2541 2542 #endif 2543 2544 bool EventHandler::handleWheelEvent(const PlatformWheelEvent& event) 2541 2545 { 2542 2546 Document* document = m_frame.document(); 2543 2544 2547 if (!document->renderView()) 2545 2548 return false; 2546 2549 2547 2550 RefPtr<FrameView> protector(m_frame.view()); 2548 2551 … … 2553 2556 m_isHandlingWheelEvent = true; 2554 2557 setFrameWasScrolledByUser(); 2555 LayoutPoint vPoint = view->windowToContents(e.position());2556 2558 2557 2559 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::DisallowShadowContent); 2558 HitTestResult result(v Point);2560 HitTestResult result(view->windowToContents(event.position())); 2559 2561 document->renderView()->hitTest(request, result); 2560 2562 2561 Element* element = result.innerElement(); 2562 2563 RefPtr<Element> element = result.innerElement(); 2564 RefPtr<ContainerNode> scrollableContainer; 2565 ScrollableArea* scrollableArea = nullptr; 2563 2566 bool isOverWidget = result.isOverWidget(); 2564 2565 ContainerNode* scrollableContainer = nullptr; 2566 ScrollableArea* scrollableArea = nullptr; 2567 platformPrepareForWheelEvents(e, result, element, scrollableContainer, scrollableArea, isOverWidget); 2567 platformPrepareForWheelEvents(event, result, element, scrollableContainer, scrollableArea, isOverWidget); 2568 2568 2569 2569 #if PLATFORM(COCOA) 2570 if (e.phase() == PlatformWheelEventPhaseNone && e.momentumPhase() == PlatformWheelEventPhaseNone) { 2571 #else 2572 if (!e.useLatchedEventElement()) { 2573 #endif 2570 if (event.phase() == PlatformWheelEventPhaseNone && event.momentumPhase() == PlatformWheelEventPhaseNone) 2571 #endif 2572 { 2574 2573 m_latchedWheelEventElement = nullptr; 2575 2574 m_previousWheelScrolledElement = nullptr; … … 2577 2576 2578 2577 // FIXME: It should not be necessary to do this mutation here. 2579 // Instead, the handlers should know convert vertical scrolls 2580 // appropriately. 2581 PlatformWheelEvent event = e; 2582 if (m_baseEventType == PlatformEvent::NoType && shouldTurnVerticalTicksIntoHorizontal(result, e)) 2583 event = event.copyTurningVerticalTicksIntoHorizontalTicks(); 2584 2585 platformRecordWheelEvent(event); 2578 // Instead, the handlers should know convert vertical scrolls appropriately. 2579 PlatformWheelEvent adjustedEvent = event; 2580 if (m_baseEventType == PlatformEvent::NoType && shouldTurnVerticalTicksIntoHorizontal(result, event)) 2581 adjustedEvent = event.copyTurningVerticalTicksIntoHorizontalTicks(); 2582 2583 platformRecordWheelEvent(adjustedEvent); 2586 2584 2587 2585 if (element) { 2588 // Figure out which view to send the event to.2589 RenderElement* target = element->renderer();2590 2591 if (isOverWidget && target && target->isWidget()) {2592 Widget* widget = toRenderWidget(target)->widget();2593 if (widget && passWheelEventToWidget(e, widget)) {2594 m_isHandlingWheelEvent = false;2595 if (scrollableArea)2596 scrollableArea->setScrolledProgrammatically(false);2597 if (widget->platformWidget())2598 return platformCompletePlatformWidgetWheelEvent(e , scrollableContainer);2599 return true;2586 if (isOverWidget) { 2587 RenderElement* target = element->renderer(); 2588 if (target && target->isWidget()) { 2589 Widget* widget = toRenderWidget(target)->widget(); 2590 if (widget && passWheelEventToWidget(event, widget)) { 2591 m_isHandlingWheelEvent = false; 2592 if (scrollableArea) 2593 scrollableArea->setScrolledProgrammatically(false); 2594 if (!widget->platformWidget()) 2595 return true; 2596 return platformCompletePlatformWidgetWheelEvent(event, scrollableContainer.get()); 2597 } 2600 2598 } 2601 2599 } 2602 2600 2603 if (!element->dispatchWheelEvent( event)) {2601 if (!element->dispatchWheelEvent(adjustedEvent)) { 2604 2602 m_isHandlingWheelEvent = false; 2605 2606 2603 if (scrollableArea && scrollableArea->isScrolledProgrammatically()) { 2607 // Web developer is controlling scrolling . Don't attempt to latch ourselves:2604 // Web developer is controlling scrolling, so don't attempt to latch. 2608 2605 clearLatchedState(); 2609 2606 scrollableArea->setScrolledProgrammatically(false); 2610 2607 } 2611 2612 2608 return true; 2613 2609 } … … 2617 2613 scrollableArea->setScrolledProgrammatically(false); 2618 2614 2619 return platformCompleteWheelEvent(e , element, scrollableContainer, scrollableArea);2615 return platformCompleteWheelEvent(event, element.get(), scrollableContainer.get(), scrollableArea); 2620 2616 } 2621 2617 -
trunk/Source/WebCore/page/EventHandler.h
r170765 r171283 198 198 bool handlePasteGlobalSelection(const PlatformMouseEvent&); 199 199 200 void platformPrepareForWheelEvents(const PlatformWheelEvent& wheelEvent, const HitTestResult& result, Element*& wheelEventTarget, ContainerNode*& scrollableContainer, ScrollableArea*& scrollableArea, bool& isOverWidget);200 void platformPrepareForWheelEvents(const PlatformWheelEvent&, const HitTestResult&, RefPtr<Element>& eventTarget, RefPtr<ContainerNode>& scrollableContainer, ScrollableArea*&, bool& isOverWidget); 201 201 void platformRecordWheelEvent(const PlatformWheelEvent&); 202 bool platformCompleteWheelEvent(const PlatformWheelEvent&, Element* wheelEventTarget, ContainerNode* scrollableContainer, ScrollableArea*);202 bool platformCompleteWheelEvent(const PlatformWheelEvent&, Element* eventTarget, ContainerNode* scrollableContainer, ScrollableArea*); 203 203 bool platformCompletePlatformWidgetWheelEvent(const PlatformWheelEvent&, ContainerNode* scrollableContainer); 204 204 -
trunk/Source/WebCore/page/mac/EventHandlerMac.mm
r170765 r171283 816 816 } 817 817 818 void EventHandler::platformPrepareForWheelEvents(const PlatformWheelEvent& wheelEvent, const HitTestResult& result, Element*& wheelEventTarget, ContainerNode*& scrollableContainer, ScrollableArea*& scrollableArea, bool& isOverWidget)818 void EventHandler::platformPrepareForWheelEvents(const PlatformWheelEvent& wheelEvent, const HitTestResult& result, RefPtr<Element>& wheelEventTarget, RefPtr<ContainerNode>& scrollableContainer, ScrollableArea*& scrollableArea, bool& isOverWidget) 819 819 { 820 820 FrameView* view = m_frame.view(); … … 826 826 scrollableArea = view; 827 827 } else { 828 if (eventTargetIsPlatformWidget(wheelEventTarget )) {828 if (eventTargetIsPlatformWidget(wheelEventTarget.get())) { 829 829 scrollableContainer = wheelEventTarget; 830 scrollableArea = scrollViewForEventTarget(wheelEventTarget );830 scrollableArea = scrollViewForEventTarget(wheelEventTarget.get()); 831 831 } else { 832 832 scrollableContainer = findEnclosingScrollableContainer(*wheelEventTarget); … … 848 848 m_startedGestureAtScrollLimit = false; 849 849 m_latchedWheelEventElement = wheelEventTarget; 850 // FIXME: What prevents us from deleting this scrollable container while still holding a pointer to it? 850 851 m_latchedScrollableContainer = scrollableContainer; 851 852 m_widgetIsLatched = result.isOverWidget();
Note: See TracChangeset
for help on using the changeset viewer.