Title: [153397] trunk/Source/WebCore
Revision
153397
Author
[email protected]
Date
2013-07-26 18:17:04 -0700 (Fri, 26 Jul 2013)

Log Message

With frame flattening on, too many resize events fired if document is resized in onresize handler.
https://bugs.webkit.org/show_bug.cgi?id=119075

Patch by Yongjun Zhang <[email protected]> on 2013-07-26
Reviewed by Simon Fraser.

With http://trac.webkit.org/changeset/149287, WebCore also sends resize event in FrameView::setFrameRect.  When
flattening an iframe, setFrameRect could be called multiple times from RenderFrameBase::layoutWithFlattening and
we could get multiple resize events.  This patch adds a flag in FrameView to disallow sending resize events if
we are inside layoutWithFlattening.  The resize event will be sent in performPostLayoutTasks after the iframe
is done laying out.

Manually tested by verifying the rendering slowness in www.hi-pda.com is fixed when frame flattening is enabled.

* page/FrameView.cpp:
(WebCore::FrameView::FrameView):
(WebCore::FrameView::setFrameRect):
* page/FrameView.h:
(WebCore::FrameView::setResizeEventAllowed):
(WebCore::FrameView::resizeEventAllowed):
* rendering/RenderFrameBase.cpp:
(WebCore::RenderFrameBase::layoutWithFlattening):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (153396 => 153397)


--- trunk/Source/WebCore/ChangeLog	2013-07-27 00:57:31 UTC (rev 153396)
+++ trunk/Source/WebCore/ChangeLog	2013-07-27 01:17:04 UTC (rev 153397)
@@ -1,3 +1,27 @@
+2013-07-26  Yongjun Zhang  <[email protected]>
+
+        With frame flattening on, too many resize events fired if document is resized in onresize handler.
+        https://bugs.webkit.org/show_bug.cgi?id=119075
+
+        Reviewed by Simon Fraser.
+
+        With http://trac.webkit.org/changeset/149287, WebCore also sends resize event in FrameView::setFrameRect.  When
+        flattening an iframe, setFrameRect could be called multiple times from RenderFrameBase::layoutWithFlattening and
+        we could get multiple resize events.  This patch adds a flag in FrameView to disallow sending resize events if
+        we are inside layoutWithFlattening.  The resize event will be sent in performPostLayoutTasks after the iframe
+        is done laying out.
+
+        Manually tested by verifying the rendering slowness in www.hi-pda.com is fixed when frame flattening is enabled.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::FrameView):
+        (WebCore::FrameView::setFrameRect):
+        * page/FrameView.h:
+        (WebCore::FrameView::setResizeEventAllowed):
+        (WebCore::FrameView::resizeEventAllowed):
+        * rendering/RenderFrameBase.cpp:
+        (WebCore::RenderFrameBase::layoutWithFlattening):
+
 2013-07-26  Dean Jackson  <[email protected]>
 
         Allow new transitions to run even when controller is suspended

Modified: trunk/Source/WebCore/page/FrameView.cpp (153396 => 153397)


--- trunk/Source/WebCore/page/FrameView.cpp	2013-07-27 00:57:31 UTC (rev 153396)
+++ trunk/Source/WebCore/page/FrameView.cpp	2013-07-27 01:17:04 UTC (rev 153397)
@@ -204,6 +204,7 @@
 #endif
     , m_visualUpdatesAllowedByClient(true)
     , m_scrollPinningBehavior(DoNotPin)
+    , m_resizeEventAllowed(true)
 {
     init();
 
@@ -481,7 +482,8 @@
     }
 #endif
 
-    sendResizeEventIfNeeded();
+    if (m_resizeEventAllowed)
+        sendResizeEventIfNeeded();
 }
 
 #if ENABLE(REQUEST_ANIMATION_FRAME)

Modified: trunk/Source/WebCore/page/FrameView.h (153396 => 153397)


--- trunk/Source/WebCore/page/FrameView.h	2013-07-27 00:57:31 UTC (rev 153396)
+++ trunk/Source/WebCore/page/FrameView.h	2013-07-27 01:17:04 UTC (rev 153397)
@@ -439,6 +439,9 @@
     
     void setScrollPinningBehavior(ScrollPinningBehavior);
 
+    void setResizeEventAllowed(bool resizeEventAllowed) { m_resizeEventAllowed = resizeEventAllowed; }
+    bool resizeEventAllowed() const { return m_resizeEventAllowed; }
+
 protected:
     virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
     virtual void scrollContentsSlowPath(const IntRect& updateRect);
@@ -671,6 +674,7 @@
     bool m_visualUpdatesAllowedByClient;
     
     ScrollPinningBehavior m_scrollPinningBehavior;
+    bool m_resizeEventAllowed;
 };
 
 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count)

Modified: trunk/Source/WebCore/rendering/RenderFrameBase.cpp (153396 => 153397)


--- trunk/Source/WebCore/rendering/RenderFrameBase.cpp	2013-07-27 00:57:31 UTC (rev 153396)
+++ trunk/Source/WebCore/rendering/RenderFrameBase.cpp	2013-07-27 01:17:04 UTC (rev 153397)
@@ -65,6 +65,8 @@
         return;
     }
 
+    childFrameView->setResizeEventAllowed(false);
+
     // need to update to calculate min/max correctly
     updateWidgetPosition();
 
@@ -93,6 +95,7 @@
         setWidth(max<LayoutUnit>(width(), childFrameView->contentsWidth() + hBorder));
 
     updateWidgetPosition();
+    childFrameView->setResizeEventAllowed(true);
 
     ASSERT(!childFrameView->layoutPending());
     ASSERT(!childRoot->needsLayout());
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to