- 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());