Changeset 148031 in webkit
- Timestamp:
- Apr 9, 2013 10:45:13 AM (11 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r148028 r148031 1 2013-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 1 30 2013-04-09 Jeff Rogers <jrogers@rim.com> 2 31 -
trunk/Source/WebCore/page/FrameView.cpp
r148013 r148031 123 123 #endif 124 124 125 // While the browser window is being resized, resize events will be dispatched at most this often. 126 static const double minimumIntervalBetweenResizeEventsDuringLiveResizeInSeconds = 0.2; 127 125 128 // The maximum number of updateWidgets iterations that should be done before returning. 126 129 static const unsigned maxUpdateWidgetsIterations = 2; … … 169 172 , m_canHaveScrollbars(true) 170 173 , m_slowRepaintObjectCount(0) 174 , m_delayedResizeEventTimer(this, &FrameView::delayedResizeEventTimerFired) 171 175 , m_layoutTimer(this, &FrameView::layoutTimerFired) 172 176 , m_layoutRoot(0) … … 2736 2740 m_lastZoomFactor = currentZoomFactor; 2737 2741 if (resized) { 2738 m_frame->eventHandler()->sendResizeEvent(); 2742 if (inLiveResize()) 2743 scheduleResizeEvent(); 2744 else 2745 sendResizeEvent(); 2746 } 2747 } 2748 } 2749 2750 void FrameView::sendResizeEvent() 2751 { 2752 if (!m_frame) 2753 return; 2754 2755 m_frame->eventHandler()->sendResizeEvent(); 2739 2756 2740 2757 #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()); 2748 2763 } 2749 #endif 2750 } 2751 } 2764 } 2765 } 2766 #endif 2767 } 2768 2769 void FrameView::delayedResizeEventTimerFired(Timer<FrameView>*) 2770 { 2771 sendResizeEvent(); 2772 } 2773 2774 void FrameView::willEndLiveResize() 2775 { 2776 ScrollableArea::willEndLiveResize(); 2777 if (m_delayedResizeEventTimer.isActive()) { 2778 m_delayedResizeEventTimer.stop(); 2779 sendResizeEvent(); 2780 } 2781 } 2782 2783 void FrameView::scheduleResizeEvent() 2784 { 2785 if (!m_delayedResizeEventTimer.isActive()) 2786 m_delayedResizeEventTimer.startOneShot(minimumIntervalBetweenResizeEventsDuringLiveResizeInSeconds); 2752 2787 } 2753 2788 -
trunk/Source/WebCore/page/FrameView.h
r148013 r148031 415 415 void setFooterHeight(int); 416 416 417 virtual void willEndLiveResize() OVERRIDE; 418 417 419 protected: 418 420 virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect); … … 481 483 #endif 482 484 485 void scheduleResizeEvent(); 486 void sendResizeEvent(); 487 void delayedResizeEventTimerFired(Timer<FrameView>*); 488 483 489 void updateScrollableAreaSet(); 484 490 … … 526 532 int m_borderX; 527 533 int m_borderY; 534 535 Timer<FrameView> m_delayedResizeEventTimer; 528 536 529 537 Timer<FrameView> m_layoutTimer; -
trunk/Source/WebCore/platform/ScrollableArea.h
r147471 r148031 70 70 71 71 bool inLiveResize() const { return m_inLiveResize; } 72 v oid willStartLiveResize();73 v oid willEndLiveResize();72 virtual void willStartLiveResize(); 73 virtual void willEndLiveResize(); 74 74 75 75 void contentAreaWillPaint() const;
Note: See TracChangeset
for help on using the changeset viewer.