Title: [148031] trunk/Source/WebCore
- Revision
- 148031
- Author
- [email protected]
- Date
- 2013-04-09 10:45:13 -0700 (Tue, 09 Apr 2013)
Log 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.
Modified Paths
Diff
Modified: trunk/Source/WebCore/ChangeLog (148030 => 148031)
--- trunk/Source/WebCore/ChangeLog 2013-04-09 17:05:47 UTC (rev 148030)
+++ trunk/Source/WebCore/ChangeLog 2013-04-09 17:45:13 UTC (rev 148031)
@@ -1,3 +1,32 @@
+2013-04-09 Andreas Kling <[email protected]>
+
+ 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.
+
2013-04-09 Jeff Rogers <[email protected]>
Add webp to supported image mime types if WEBP feature is enabled/used
Modified: trunk/Source/WebCore/page/FrameView.cpp (148030 => 148031)
--- trunk/Source/WebCore/page/FrameView.cpp 2013-04-09 17:05:47 UTC (rev 148030)
+++ trunk/Source/WebCore/page/FrameView.cpp 2013-04-09 17:45:13 UTC (rev 148031)
@@ -122,6 +122,9 @@
double FrameView::s_deferredRepaintDelayIncrementDuringLoading = 0;
#endif
+// While the browser window is being resized, resize events will be dispatched at most this often.
+static const double minimumIntervalBetweenResizeEventsDuringLiveResizeInSeconds = 0.2;
+
// The maximum number of updateWidgets iterations that should be done before returning.
static const unsigned maxUpdateWidgetsIterations = 2;
@@ -168,6 +171,7 @@
: m_frame(frame)
, m_canHaveScrollbars(true)
, m_slowRepaintObjectCount(0)
+ , m_delayedResizeEventTimer(this, &FrameView::delayedResizeEventTimerFired)
, m_layoutTimer(this, &FrameView::layoutTimerFired)
, m_layoutRoot(0)
, m_inSynchronousPostLayout(false)
@@ -2735,22 +2739,53 @@
m_lastViewportSize = currentSize;
m_lastZoomFactor = currentZoomFactor;
if (resized) {
- m_frame->eventHandler()->sendResizeEvent();
+ if (inLiveResize())
+ scheduleResizeEvent();
+ else
+ sendResizeEvent();
+ }
+ }
+}
+void FrameView::sendResizeEvent()
+{
+ if (!m_frame)
+ return;
+
+ m_frame->eventHandler()->sendResizeEvent();
+
#if ENABLE(INSPECTOR)
- if (InspectorInstrumentation::hasFrontends()) {
- if (page) {
- if (page->mainFrame() == m_frame) {
- if (InspectorClient* inspectorClient = page->inspectorController()->inspectorClient())
- inspectorClient->didResizeMainFrame(m_frame.get());
- }
- }
+ if (InspectorInstrumentation::hasFrontends()) {
+ if (Page* page = m_frame->page()) {
+ if (page->mainFrame() == m_frame) {
+ if (InspectorClient* inspectorClient = page->inspectorController()->inspectorClient())
+ inspectorClient->didResizeMainFrame(m_frame.get());
}
-#endif
}
}
+#endif
}
+void FrameView::delayedResizeEventTimerFired(Timer<FrameView>*)
+{
+ sendResizeEvent();
+}
+
+void FrameView::willEndLiveResize()
+{
+ ScrollableArea::willEndLiveResize();
+ if (m_delayedResizeEventTimer.isActive()) {
+ m_delayedResizeEventTimer.stop();
+ sendResizeEvent();
+ }
+}
+
+void FrameView::scheduleResizeEvent()
+{
+ if (!m_delayedResizeEventTimer.isActive())
+ m_delayedResizeEventTimer.startOneShot(minimumIntervalBetweenResizeEventsDuringLiveResizeInSeconds);
+}
+
void FrameView::postLayoutTimerFired(Timer<FrameView>*)
{
performPostLayoutTasks();
Modified: trunk/Source/WebCore/page/FrameView.h (148030 => 148031)
--- trunk/Source/WebCore/page/FrameView.h 2013-04-09 17:05:47 UTC (rev 148030)
+++ trunk/Source/WebCore/page/FrameView.h 2013-04-09 17:45:13 UTC (rev 148031)
@@ -414,6 +414,8 @@
virtual int footerHeight() const OVERRIDE { return m_footerHeight; }
void setFooterHeight(int);
+ virtual void willEndLiveResize() OVERRIDE;
+
protected:
virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
virtual void scrollContentsSlowPath(const IntRect& updateRect);
@@ -480,6 +482,10 @@
#endif
#endif
+ void scheduleResizeEvent();
+ void sendResizeEvent();
+ void delayedResizeEventTimerFired(Timer<FrameView>*);
+
void updateScrollableAreaSet();
virtual void notifyPageThatContentAreaWillPaint() const;
@@ -526,6 +532,8 @@
int m_borderX;
int m_borderY;
+ Timer<FrameView> m_delayedResizeEventTimer;
+
Timer<FrameView> m_layoutTimer;
bool m_delayedLayout;
RenderObject* m_layoutRoot;
Modified: trunk/Source/WebCore/platform/ScrollableArea.h (148030 => 148031)
--- trunk/Source/WebCore/platform/ScrollableArea.h 2013-04-09 17:05:47 UTC (rev 148030)
+++ trunk/Source/WebCore/platform/ScrollableArea.h 2013-04-09 17:45:13 UTC (rev 148031)
@@ -69,8 +69,8 @@
ScrollElasticity horizontalScrollElasticity() const { return static_cast<ScrollElasticity>(m_horizontalScrollElasticity); }
bool inLiveResize() const { return m_inLiveResize; }
- void willStartLiveResize();
- void willEndLiveResize();
+ virtual void willStartLiveResize();
+ virtual void willEndLiveResize();
void contentAreaWillPaint() const;
void mouseEnteredContentArea() const;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes