Title: [153640] trunk
Revision
153640
Author
za...@apple.com
Date
2013-08-02 01:58:23 -0700 (Fri, 02 Aug 2013)

Log Message

Frame flattening: Change the logic on whether resize event needs to be dispatched.
https://bugs.webkit.org/show_bug.cgi?id=119394

Reviewed by Simon Fraser.

http://trac.webkit.org/changeset/149287 changed the logic so that resize events are
sent out from FrameView::setFrameRect() too. Checking whether frame flattening is
enabled is sufficient enough to ensure that no extra resize events are dispatched.

Source/WebCore:

Test: fast/frames/flattening/iframe-flattening-resize-event-count.html

* page/FrameView.cpp:
(WebCore::FrameView::FrameView):
(WebCore::FrameView::setFrameRect):
(WebCore::FrameView::frameFlatteningEnabled):
(WebCore::FrameView::supportsFrameFlattening):
(WebCore::FrameView::avoidScrollbarCreation):
(WebCore::FrameView::calculateScrollbarModesForLayout):
(WebCore::FrameView::layout):
(WebCore::FrameView::isInChildFrameWithFrameFlattening):
* page/FrameView.h:
* rendering/RenderFrameBase.cpp:
(WebCore::RenderFrameBase::layoutWithFlattening):

LayoutTests:

* fast/frames/flattening/iframe-flattening-resize-event-count-expected.txt: Added.
* fast/frames/flattening/iframe-flattening-resize-event-count.html: Added.
* fast/frames/flattening/resources/iframe-to-resize.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (153639 => 153640)


--- trunk/LayoutTests/ChangeLog	2013-08-02 08:32:30 UTC (rev 153639)
+++ trunk/LayoutTests/ChangeLog	2013-08-02 08:58:23 UTC (rev 153640)
@@ -1,3 +1,18 @@
+2013-08-02  Zalan Bujtas  <za...@apple.com>
+
+        Frame flattening: Change the logic on whether resize event needs to be dispatched.
+        https://bugs.webkit.org/show_bug.cgi?id=119394
+
+        Reviewed by Simon Fraser.
+
+        http://trac.webkit.org/changeset/149287 changed the logic so that resize events are
+        sent out from FrameView::setFrameRect() too. Checking whether frame flattening is
+        enabled is sufficient enough to ensure that no extra resize events are dispatched.
+
+        * fast/frames/flattening/iframe-flattening-resize-event-count-expected.txt: Added.
+        * fast/frames/flattening/iframe-flattening-resize-event-count.html: Added.
+        * fast/frames/flattening/resources/iframe-to-resize.html: Added.
+
 2013-08-01  Commit Queue  <commit-qu...@webkit.org>
 
         Unreviewed, rolling out r153608.

Added: trunk/LayoutTests/fast/frames/flattening/iframe-flattening-resize-event-count-expected.txt (0 => 153640)


--- trunk/LayoutTests/fast/frames/flattening/iframe-flattening-resize-event-count-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/frames/flattening/iframe-flattening-resize-event-count-expected.txt	2013-08-02 08:58:23 UTC (rev 153640)
@@ -0,0 +1,5 @@
+This tests the number of resize events dispatched to _javascript_.
+
+PASS
+
+

Added: trunk/LayoutTests/fast/frames/flattening/iframe-flattening-resize-event-count.html (0 => 153640)


--- trunk/LayoutTests/fast/frames/flattening/iframe-flattening-resize-event-count.html	                        (rev 0)
+++ trunk/LayoutTests/fast/frames/flattening/iframe-flattening-resize-event-count.html	2013-08-02 08:58:23 UTC (rev 153640)
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script>
+  function start() {
+    if (window.internals)
+      internals.settings.setFrameFlatteningEnabled(true);
+      
+    if (window.testRunner) {
+      testRunner.dumpAsText();
+      testRunner.waitUntilDone();
+    }
+  }
+</script>
+</head>
+<body>
+  <p>This tests the number of resize events dispatched to _javascript_.</p>
+  <p id='result'></p>
+  <iframe _onload_='start();' frameborder=0; src=''>
+</body>
+</html>

Added: trunk/LayoutTests/fast/frames/flattening/resources/iframe-to-resize.html (0 => 153640)


--- trunk/LayoutTests/fast/frames/flattening/resources/iframe-to-resize.html	                        (rev 0)
+++ trunk/LayoutTests/fast/frames/flattening/resources/iframe-to-resize.html	2013-08-02 08:58:23 UTC (rev 153640)
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <script>
+  var resizeEventCounter = 0;
+  var resizeCounter = 0;
+  
+  window._onresize_ = function(event) {
+    resizeEventCounter++;
+  }
+
+  function getRandomArbitrary(min, max) {
+    return Math.random() * (max - min) + min;
+  }
+
+  function resizeMe() {
+    document.getElementById('contentToResize').style.height = getRandomArbitrary(50, 500) + 'px';
+    document.body.offsetHeight;
+  
+    if (++resizeCounter < 100)
+      setTimeout('resizeMe();', 0);
+    else {
+      parent.document.getElementById('result').innerHTML = resizeEventCounter > 100 ? "FAILED. Too many resize events" : "PASS";
+      if (window.testRunner)
+        testRunner.notifyDone();
+    }
+  }
+  
+</script>
+</head>
+<body _onload_='resizeMe();'>
+    <p id='contentToResize'></p>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (153639 => 153640)


--- trunk/Source/WebCore/ChangeLog	2013-08-02 08:32:30 UTC (rev 153639)
+++ trunk/Source/WebCore/ChangeLog	2013-08-02 08:58:23 UTC (rev 153640)
@@ -1,3 +1,29 @@
+2013-08-02  Zalan Bujtas  <za...@apple.com>
+
+        Frame flattening: Change the logic on whether resize event needs to be dispatched.
+        https://bugs.webkit.org/show_bug.cgi?id=119394
+
+        Reviewed by Simon Fraser.
+
+        http://trac.webkit.org/changeset/149287 changed the logic so that resize events are
+        sent out from FrameView::setFrameRect() too. Checking whether frame flattening is
+        enabled is sufficient enough to ensure that no extra resize events are dispatched.
+
+        Test: fast/frames/flattening/iframe-flattening-resize-event-count.html
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::FrameView):
+        (WebCore::FrameView::setFrameRect):
+        (WebCore::FrameView::frameFlatteningEnabled):
+        (WebCore::FrameView::supportsFrameFlattening):
+        (WebCore::FrameView::avoidScrollbarCreation):
+        (WebCore::FrameView::calculateScrollbarModesForLayout):
+        (WebCore::FrameView::layout):
+        (WebCore::FrameView::isInChildFrameWithFrameFlattening):
+        * page/FrameView.h:
+        * rendering/RenderFrameBase.cpp:
+        (WebCore::RenderFrameBase::layoutWithFlattening):
+
 2013-08-01  Commit Queue  <commit-qu...@webkit.org>
 
         Unreviewed, rolling out r153608.

Modified: trunk/Source/WebCore/page/FrameView.cpp (153639 => 153640)


--- trunk/Source/WebCore/page/FrameView.cpp	2013-08-02 08:32:30 UTC (rev 153639)
+++ trunk/Source/WebCore/page/FrameView.cpp	2013-08-02 08:58:23 UTC (rev 153640)
@@ -204,7 +204,6 @@
 #endif
     , m_visualUpdatesAllowedByClient(true)
     , m_scrollPinningBehavior(DoNotPin)
-    , m_resizeEventAllowed(true)
 {
     init();
 
@@ -482,7 +481,7 @@
     }
 #endif
 
-    if (m_resizeEventAllowed)
+    if (!frameFlatteningEnabled())
         sendResizeEventIfNeeded();
 }
 
@@ -509,30 +508,35 @@
     m_margins.setHeight(h);
 }
 
-static bool frameFlatteningEnabled(Frame* frame)
+bool FrameView::frameFlatteningEnabled() const
 {
-    return frame && frame->settings() && frame->settings()->frameFlatteningEnabled();
+    Settings* settings = frame() ? frame()->settings() : 0;
+    if (!settings)
+        return false;
+
+    return settings->frameFlatteningEnabled();
 }
 
-static bool supportsFrameFlattening(Frame* frame)
+bool FrameView::isFrameFlatteningValidForThisFrame() const
 {
-    if (!frame)
+    if (!frameFlatteningEnabled())
         return false;
 
+    HTMLFrameOwnerElement* owner = frame() ? frame()->ownerElement() : 0;
+    if (!owner)
+        return false;
+
     // Frame flattening is valid only for <frame> and <iframe>.
-    HTMLFrameOwnerElement* owner = frame->ownerElement();
-    return owner && (owner->hasTagName(frameTag) || owner->hasTagName(iframeTag));
+    return owner->hasTagName(frameTag) || owner->hasTagName(iframeTag);
 }
 
 bool FrameView::avoidScrollbarCreation() const
 {
     ASSERT(m_frame);
-
     // with frame flattening no subframe can have scrollbars
     // but we also cannot turn scrollbars off as we determine
     // our flattening policy using that.
-
-    return frameFlatteningEnabled(frame()) && supportsFrameFlattening(frame());
+    return isFrameFlatteningValidForThisFrame();
 }
 
 void FrameView::setCanHaveScrollbars(bool canHaveScrollbars)
@@ -743,7 +747,7 @@
         RenderObject* rootRenderer = documentElement ? documentElement->renderer() : 0;
         Node* body = document->body();
         if (body && body->renderer()) {
-            if (body->hasTagName(framesetTag) && !frameFlatteningEnabled(frame())) {
+            if (body->hasTagName(framesetTag) && !frameFlatteningEnabled()) {
                 vMode = ScrollbarAlwaysOff;
                 hMode = ScrollbarAlwaysOff;
             } else if (body->hasTagName(bodyTag)) {
@@ -1235,7 +1239,7 @@
             Document* document = m_frame->document();
             Node* body = document->body();
             if (body && body->renderer()) {
-                if (body->hasTagName(framesetTag) && !frameFlatteningEnabled(frame())) {
+                if (body->hasTagName(framesetTag) && !frameFlatteningEnabled()) {
                     body->renderer()->setChildNeedsLayout(true);
                 } else if (body->hasTagName(bodyTag)) {
                     if (!m_firstLayout && m_size.height() != layoutHeight() && body->renderer()->enclosingBox()->stretchesToViewport())
@@ -3464,7 +3468,7 @@
             return true;
     }
 
-    if (!frameFlatteningEnabled(frame()))
+    if (!frameFlatteningEnabled())
         return false;
 
     if (m_frame->ownerElement()->hasTagName(frameTag))

Modified: trunk/Source/WebCore/page/FrameView.h (153639 => 153640)


--- trunk/Source/WebCore/page/FrameView.h	2013-08-02 08:32:30 UTC (rev 153639)
+++ trunk/Source/WebCore/page/FrameView.h	2013-08-02 08:58:23 UTC (rev 153640)
@@ -439,9 +439,6 @@
     
     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);
@@ -538,6 +535,8 @@
     FrameView* parentFrameView() const;
 
     bool doLayoutWithFrameFlattening(bool allowSubtree);
+    bool frameFlatteningEnabled() const;
+    bool isFrameFlatteningValidForThisFrame() const;
 
     bool qualifiesAsVisuallyNonEmpty() const;
 
@@ -674,7 +673,6 @@
     bool m_visualUpdatesAllowedByClient;
     
     ScrollPinningBehavior m_scrollPinningBehavior;
-    bool m_resizeEventAllowed;
 };
 
 inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count)

Modified: trunk/Source/WebCore/rendering/RenderFrameBase.cpp (153639 => 153640)


--- trunk/Source/WebCore/rendering/RenderFrameBase.cpp	2013-08-02 08:32:30 UTC (rev 153639)
+++ trunk/Source/WebCore/rendering/RenderFrameBase.cpp	2013-08-02 08:58:23 UTC (rev 153640)
@@ -65,8 +65,6 @@
         return;
     }
 
-    childFrameView->setResizeEventAllowed(false);
-
     // need to update to calculate min/max correctly
     updateWidgetPosition();
 
@@ -95,7 +93,6 @@
         setWidth(max<LayoutUnit>(width(), childFrameView->contentsWidth() + hBorder));
 
     updateWidgetPosition();
-    childFrameView->setResizeEventAllowed(true);
 
     ASSERT(!childFrameView->layoutPending());
     ASSERT(!childRoot->needsLayout());
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to