Changeset 196837 in webkit


Ignore:
Timestamp:
Feb 19, 2016 2:59:25 PM (8 years ago)
Author:
Simon Fraser
Message:

Wheel event callback removing the window causes crash in WebCore.
https://bugs.webkit.org/show_bug.cgi?id=150871

Reviewed by Brent Fulgham.

Source/WebCore:

Null check the FrameView before using it, since the iframe may have been removed
from its parent document inside the event handler.

The new test triggered a cross-load side-effect, where wheel event filtering wasn't
reset between page loads. Fix by calling clearLatchedState() in EventHandler::clear(),
which resets the filtering.

Test: fast/events/wheel-event-destroys-frame.html

  • page/EventHandler.cpp:

(WebCore::EventHandler::clear):

  • page/WheelEventDeltaFilter.cpp:

(WebCore::WheelEventDeltaFilter::filteredDelta):

  • page/mac/EventHandlerMac.mm:

(WebCore::EventHandler::platformCompleteWheelEvent):

  • rendering/RenderLayer.cpp:

(WebCore::RenderLayer::scrollTo):

LayoutTests:

  • fast/events/wheel-event-destroys-frame-expected.txt: Added.
  • fast/events/wheel-event-destroys-frame.html: Added.
Location:
trunk
Files:
2 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r196833 r196837  
     12016-02-19  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Wheel event callback removing the window causes crash in WebCore.
     4        https://bugs.webkit.org/show_bug.cgi?id=150871
     5
     6        Reviewed by Brent Fulgham.
     7
     8        * fast/events/wheel-event-destroys-frame-expected.txt: Added.
     9        * fast/events/wheel-event-destroys-frame.html: Added.
     10
    1112016-02-19  Antti Koivisto  <antti@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r196835 r196837  
     12016-02-19  Simon Fraser  <simon.fraser@apple.com>
     2
     3        Wheel event callback removing the window causes crash in WebCore.
     4        https://bugs.webkit.org/show_bug.cgi?id=150871
     5
     6        Reviewed by Brent Fulgham.
     7
     8        Null check the FrameView before using it, since the iframe may have been removed
     9        from its parent document inside the event handler.
     10       
     11        The new test triggered a cross-load side-effect, where wheel event filtering wasn't
     12        reset between page loads. Fix by calling clearLatchedState() in EventHandler::clear(),
     13        which resets the filtering.
     14
     15        Test: fast/events/wheel-event-destroys-frame.html
     16
     17        * page/EventHandler.cpp:
     18        (WebCore::EventHandler::clear):
     19        * page/WheelEventDeltaFilter.cpp:
     20        (WebCore::WheelEventDeltaFilter::filteredDelta):
     21        * page/mac/EventHandlerMac.mm:
     22        (WebCore::EventHandler::platformCompleteWheelEvent):
     23        * rendering/RenderLayer.cpp:
     24        (WebCore::RenderLayer::scrollTo):
     25
    1262016-02-19  Myles C. Maxfield  <mmaxfield@apple.com>
    227
  • trunk/Source/WebCore/page/EventHandler.cpp

    r196640 r196837  
    453453    m_capturesDragging = false;
    454454    m_capturingMouseEventsElement = nullptr;
    455 #if PLATFORM(MAC)
    456     m_frame.mainFrame().resetLatchingState();
    457 #endif
     455    clearLatchedState();
    458456#if ENABLE(TOUCH_EVENTS) && !ENABLE(IOS_TOUCH_EVENTS)
    459457    m_originatingTouchPointTargets.clear();
     
    26652663    m_frame.mainFrame().resetLatchingState();
    26662664#endif
    2667     m_frame.mainFrame().wheelEventDeltaFilter()->endFilteringDeltas();
     2665    if (WheelEventDeltaFilter* filter = m_frame.mainFrame().wheelEventDeltaFilter())
     2666        filter->endFilteringDeltas();
    26682667}
    26692668
  • trunk/Source/WebCore/page/WheelEventDeltaFilter.cpp

    r188869 r196837  
    3232
    3333#include "FloatSize.h"
     34#include "Logging.h"
     35#include "TextStream.h"
    3436
    3537namespace WebCore {
     
    5961FloatSize WheelEventDeltaFilter::filteredDelta() const
    6062{
     63    LOG_WITH_STREAM(Scrolling, stream << "BasicWheelEventDeltaFilter::filteredDelta returning " << m_currentFilteredDelta);
    6164    return m_currentFilteredDelta;
    6265}
  • trunk/Source/WebCore/page/mac/EventHandlerMac.mm

    r196801 r196837  
    10091009bool EventHandler::platformCompleteWheelEvent(const PlatformWheelEvent& wheelEvent, ContainerNode* scrollableContainer, ScrollableArea* scrollableArea)
    10101010{
     1011    FrameView* view = m_frame.view();
    10111012    // We do another check on the frame view because the event handler can run JS which results in the frame getting destroyed.
    1012     ASSERT(m_frame.view());
    1013     FrameView* view = m_frame.view();
     1013    if (!view)
     1014        return false;
    10141015
    10151016    ScrollLatchingState* latchingState = m_frame.mainFrame().latchingState();
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r196688 r196837  
    23502350        return;
    23512351
     2352    LOG_WITH_STREAM(Scrolling, stream << "RenderLayer::scrollTo " << position);
     2353
    23522354    ScrollPosition newPosition = position;
    23532355    if (box->style().overflowX() != OMARQUEE) {
Note: See TracChangeset for help on using the changeset viewer.