Changeset 148031 in webkit


Ignore:
Timestamp:
Apr 9, 2013 10:45:13 AM (11 years ago)
Author:
akling@apple.com
Message:

Throttle resize events during live window resize.
<http://webkit.org/b/114292>
<rdar://problem/13411454>

Reviewed by Geoffrey Garen.

Limit resize events to one at max every 0.2 seconds during live window resize.
This mitigates heavy CPU usage during resize on pages with complex onresize handlers.
If there's a pending resize event when the live resize ends, it fires immediately.

  • page/FrameView.cpp:

(WebCore::FrameView::sendResizeEvent):

Factored out dispatch of the resize event after layout so we can call it on a timer
instead of immediately while live window resize is active.

(WebCore::FrameView::FrameView):
(WebCore::FrameView::performPostLayoutTasks):
(WebCore::FrameView::delayedResizeEventTimerFired):
(WebCore::FrameView::willEndLiveResize):
(WebCore::FrameView::scheduleResizeEvent):

  • page/FrameView.h:
  • platform/ScrollableArea.h:

Made willStartLiveResize() and willEndLiveResize() virtual so we can override
them on FrameView.

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r148028 r148031  
     12013-04-09  Andreas Kling  <akling@apple.com>
     2
     3        Throttle resize events during live window resize.
     4        <http://webkit.org/b/114292>
     5        <rdar://problem/13411454>
     6
     7        Reviewed by Geoffrey Garen.
     8
     9        Limit resize events to one at max every 0.2 seconds during live window resize.
     10        This mitigates heavy CPU usage during resize on pages with complex onresize handlers.
     11        If there's a pending resize event when the live resize ends, it fires immediately.
     12
     13        * page/FrameView.cpp:
     14        (WebCore::FrameView::sendResizeEvent):
     15
     16            Factored out dispatch of the resize event after layout so we can call it on a timer
     17            instead of immediately while live window resize is active.
     18
     19        (WebCore::FrameView::FrameView):
     20        (WebCore::FrameView::performPostLayoutTasks):
     21        (WebCore::FrameView::delayedResizeEventTimerFired):
     22        (WebCore::FrameView::willEndLiveResize):
     23        (WebCore::FrameView::scheduleResizeEvent):
     24        * page/FrameView.h:
     25        * platform/ScrollableArea.h:
     26
     27            Made willStartLiveResize() and willEndLiveResize() virtual so we can override
     28            them on FrameView.
     29
    1302013-04-09  Jeff Rogers  <jrogers@rim.com>
    231
  • trunk/Source/WebCore/page/FrameView.cpp

    r148013 r148031  
    123123#endif
    124124
     125// While the browser window is being resized, resize events will be dispatched at most this often.
     126static const double minimumIntervalBetweenResizeEventsDuringLiveResizeInSeconds = 0.2;
     127
    125128// The maximum number of updateWidgets iterations that should be done before returning.
    126129static const unsigned maxUpdateWidgetsIterations = 2;
     
    169172    , m_canHaveScrollbars(true)
    170173    , m_slowRepaintObjectCount(0)
     174    , m_delayedResizeEventTimer(this, &FrameView::delayedResizeEventTimerFired)
    171175    , m_layoutTimer(this, &FrameView::layoutTimerFired)
    172176    , m_layoutRoot(0)
     
    27362740        m_lastZoomFactor = currentZoomFactor;
    27372741        if (resized) {
    2738             m_frame->eventHandler()->sendResizeEvent();
     2742            if (inLiveResize())
     2743                scheduleResizeEvent();
     2744            else
     2745                sendResizeEvent();
     2746        }
     2747    }
     2748}
     2749
     2750void FrameView::sendResizeEvent()
     2751{
     2752    if (!m_frame)
     2753        return;
     2754
     2755    m_frame->eventHandler()->sendResizeEvent();
    27392756
    27402757#if ENABLE(INSPECTOR)
    2741             if (InspectorInstrumentation::hasFrontends()) {
    2742                 if (page) {
    2743                     if (page->mainFrame() == m_frame) {
    2744                         if (InspectorClient* inspectorClient = page->inspectorController()->inspectorClient())
    2745                             inspectorClient->didResizeMainFrame(m_frame.get());
    2746                     }
    2747                 }
     2758    if (InspectorInstrumentation::hasFrontends()) {
     2759        if (Page* page = m_frame->page()) {
     2760            if (page->mainFrame() == m_frame) {
     2761                if (InspectorClient* inspectorClient = page->inspectorController()->inspectorClient())
     2762                    inspectorClient->didResizeMainFrame(m_frame.get());
    27482763            }
    2749 #endif
    2750         }
    2751     }
     2764        }
     2765    }
     2766#endif
     2767}
     2768
     2769void FrameView::delayedResizeEventTimerFired(Timer<FrameView>*)
     2770{
     2771    sendResizeEvent();
     2772}
     2773
     2774void FrameView::willEndLiveResize()
     2775{
     2776    ScrollableArea::willEndLiveResize();
     2777    if (m_delayedResizeEventTimer.isActive()) {
     2778        m_delayedResizeEventTimer.stop();
     2779        sendResizeEvent();
     2780    }
     2781}
     2782
     2783void FrameView::scheduleResizeEvent()
     2784{
     2785    if (!m_delayedResizeEventTimer.isActive())
     2786        m_delayedResizeEventTimer.startOneShot(minimumIntervalBetweenResizeEventsDuringLiveResizeInSeconds);
    27522787}
    27532788
  • trunk/Source/WebCore/page/FrameView.h

    r148013 r148031  
    415415    void setFooterHeight(int);
    416416
     417    virtual void willEndLiveResize() OVERRIDE;
     418
    417419protected:
    418420    virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
     
    481483#endif
    482484
     485    void scheduleResizeEvent();
     486    void sendResizeEvent();
     487    void delayedResizeEventTimerFired(Timer<FrameView>*);
     488
    483489    void updateScrollableAreaSet();
    484490
     
    526532    int m_borderX;
    527533    int m_borderY;
     534
     535    Timer<FrameView> m_delayedResizeEventTimer;
    528536
    529537    Timer<FrameView> m_layoutTimer;
  • trunk/Source/WebCore/platform/ScrollableArea.h

    r147471 r148031  
    7070
    7171    bool inLiveResize() const { return m_inLiveResize; }
    72     void willStartLiveResize();
    73     void willEndLiveResize();
     72    virtual void willStartLiveResize();
     73    virtual void willEndLiveResize();
    7474
    7575    void contentAreaWillPaint() const;
Note: See TracChangeset for help on using the changeset viewer.