Changeset 149287 in webkit


Ignore:
Timestamp:
Apr 29, 2013 8:33:31 AM (11 years ago)
Author:
akling@apple.com
Message:

When updating geometry, send JavaScript resize before before layout/paint.
<http://webkit.org/b/115199>
<rdar://problem/13735535>

Reviewed by Geoffrey Garen.

Make the "resize" event synchronous and dispatch it before doing any automatic
resize-induced layout. This avoids unnecessary work in cases where an event handler
does something that dirties style.

It also avoids a kind of JS-side FOUC that happens if we drop out to the runloop
and paint before the resize event handler runs; for example, when viewing a popup
on <http://lokeshdhakar.com/projects/lightbox2/> and resizing the window, the dark
overlay sometimes resizes out of sync with the web view, since a paint may happen
between automatic layout and the resize event.

  • page/EventHandler.h:
  • page/EventHandler.cpp:

(WebCore::EventHandler::dispatchResizeEvent):

  • page/FrameView.h:
  • page/FrameView.cpp:

(WebCore::FrameView::dispatchResizeEvent):

Renamed sendResizeEvent() to dispatchResizeEvent() and made it dispatch the event
synchronously instead of adding it to the DocumentEventQueue.

(WebCore::FrameView::performPostLayoutTasks):
(WebCore::FrameView::setFrameRect):

Dispatch the "resize" event right when the new frame rect is set.

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r149284 r149287  
     12013-04-29  Andreas Kling  <akling@apple.com>
     2
     3        When updating geometry, send JavaScript resize before before layout/paint.
     4        <http://webkit.org/b/115199>
     5        <rdar://problem/13735535>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Make the "resize" event synchronous and dispatch it before doing any automatic
     10        resize-induced layout. This avoids unnecessary work in cases where an event handler
     11        does something that dirties style.
     12
     13        It also avoids a kind of JS-side FOUC that happens if we drop out to the runloop
     14        and paint before the resize event handler runs; for example, when viewing a popup
     15        on <http://lokeshdhakar.com/projects/lightbox2/> and resizing the window, the dark
     16        overlay sometimes resizes out of sync with the web view, since a paint may happen
     17        between automatic layout and the resize event.
     18
     19        * page/EventHandler.h:
     20        * page/EventHandler.cpp:
     21        (WebCore::EventHandler::dispatchResizeEvent):
     22        * page/FrameView.h:
     23        * page/FrameView.cpp:
     24        (WebCore::FrameView::dispatchResizeEvent):
     25
     26            Renamed sendResizeEvent() to dispatchResizeEvent() and made it dispatch the event
     27            synchronously instead of adding it to the DocumentEventQueue.
     28
     29        (WebCore::FrameView::performPostLayoutTasks):
     30        (WebCore::FrameView::setFrameRect):
     31
     32            Dispatch the "resize" event right when the new frame rect is set.
     33
    1342013-04-29  Patrick Gansterer  <paroga@webkit.org>
    235
  • trunk/Source/WebCore/page/EventHandler.cpp

    r149262 r149287  
    37853785}
    37863786
    3787 void EventHandler::sendResizeEvent()
    3788 {
    3789     m_frame->document()->enqueueWindowEvent(Event::create(eventNames().resizeEvent, false, false));
     3787void EventHandler::dispatchResizeEvent()
     3788{
     3789    RefPtr<Event> resizeEvent = Event::create(eventNames().resizeEvent, false, false);
     3790    m_frame->document()->dispatchWindowEvent(resizeEvent.release(), m_frame->document()->domWindow());
    37903791}
    37913792
  • trunk/Source/WebCore/page/EventHandler.h

    r149066 r149287  
    231231    void capsLockStateMayHaveChanged(); // Only called by FrameSelection
    232232   
    233     void sendResizeEvent(); // Only called in FrameView
     233    void dispatchResizeEvent(); // Only called in FrameView
    234234    void sendScrollEvent(); // Ditto
    235235
  • trunk/Source/WebCore/page/FrameView.cpp

    r149185 r149287  
    468468    updateScrollableAreaSet();
    469469
     470    RenderView* renderView = this->renderView();
     471
    470472#if USE(ACCELERATED_COMPOSITING)
    471     if (RenderView* renderView = this->renderView()) {
     473    if (renderView) {
    472474        if (renderView->usesCompositing())
    473475            renderView->compositor()->frameViewDidChangeSize();
    474476    }
    475477#endif
     478
     479    if (renderView && !renderView->printing()) {
     480        IntSize currentSize;
     481        if (useFixedLayout() && !fixedLayoutSize().isEmpty() && delegatesScrolling())
     482            currentSize = fixedLayoutSize();
     483        else
     484            currentSize = visibleContentRect(IncludeScrollbars).size();
     485        float currentZoomFactor = renderView->style()->zoom();
     486        bool resized = !m_firstLayout && (currentSize != m_lastViewportSize || currentZoomFactor != m_lastZoomFactor);
     487        m_lastViewportSize = currentSize;
     488        m_lastZoomFactor = currentZoomFactor;
     489        if (resized)
     490            dispatchResizeEvent();
     491    }
     492
    476493}
    477494
     
    27622779
    27632780    m_actionScheduler->resume();
    2764 
    2765     if (renderView && !renderView->printing()) {
    2766         IntSize currentSize;
    2767         if (useFixedLayout() && !fixedLayoutSize().isEmpty() && delegatesScrolling())
    2768             currentSize = fixedLayoutSize();
    2769         else
    2770             currentSize = visibleContentRect(IncludeScrollbars).size();
    2771         float currentZoomFactor = renderView->style()->zoom();
    2772         bool resized = !m_firstLayout && (currentSize != m_lastViewportSize || currentZoomFactor != m_lastZoomFactor);
    2773         m_lastViewportSize = currentSize;
    2774         m_lastZoomFactor = currentZoomFactor;
    2775         if (resized)
    2776             sendResizeEvent();
    2777     }
    2778 }
    2779 
    2780 void FrameView::sendResizeEvent()
     2781}
     2782
     2783void FrameView::dispatchResizeEvent()
    27812784{
    27822785    ASSERT(m_frame);
    27832786
    2784     m_frame->eventHandler()->sendResizeEvent();
     2787    m_frame->eventHandler()->dispatchResizeEvent();
    27852788
    27862789#if ENABLE(INSPECTOR)
  • trunk/Source/WebCore/page/FrameView.h

    r149105 r149287  
    492492    virtual void willRemoveScrollbar(Scrollbar*, ScrollbarOrientation) OVERRIDE;
    493493
    494     void scheduleResizeEvent();
    495     void sendResizeEvent();
    496     void delayedResizeEventTimerFired(Timer<FrameView>*);
     494    void dispatchResizeEvent();
    497495
    498496    void updateScrollableAreaSet();
Note: See TracChangeset for help on using the changeset viewer.