[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.20-204-g221d8e8

kenneth at webkit.org kenneth at webkit.org
Wed Feb 10 22:17:07 UTC 2010


The following commit has been merged in the webkit-1.1 branch:
commit 5c3025f4f84daac2c319ee9481d709e6693cfbf8
Author: kenneth at webkit.org <kenneth at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Fri Feb 5 20:47:17 2010 +0000

    Implement flattening of framesets
    https://bugs.webkit.org/show_bug.cgi?id=32717
    
    Reviewed by Dave Hyatt.
    
    WebCore:
    
    The following patch, builds ontop of Antti Koivisto's frameset
    flattening code from the iPhone source, which itself is based on
    the old Nokia Series 60 source.
    
    Layout tests have been added to test the functionality and the original
    code which has then been fixed to make these pass, as well as support
    frameset grids.
    
    Tests: fast/frames/flattening/frameset-flattening-advanced.html
           fast/frames/flattening/frameset-flattening-grid.html
           fast/frames/flattening/frameset-flattening-simple.html
           fast/frames/flattening/frameset-flattening-subframe-resize.html
           fast/frames/flattening/frameset-flattening-subframesets.html
    
    * page/FrameView.cpp:
    (WebCore::FrameView::layout):
    (WebCore::FrameView::scheduleRelayout):
    * page/Settings.cpp:
    (WebCore::Settings::Settings):
    (WebCore::Settings::setFrameSetFlatteningEnabled):
    * page/Settings.h:
    (WebCore::Settings::frameSetFlatteningEnabled):
    * rendering/RenderFrame.cpp:
    (WebCore::RenderFrame::layoutWithFlattening):
    * rendering/RenderFrame.h:
    * rendering/RenderFrameSet.cpp:
    (WebCore::RenderFrameSet::layout):
    (WebCore::RenderFrameSet::positionFramesWithFlattening):
    (WebCore::RenderFrameSet::flattenFrameSet):
    (WebCore::RenderFrameSet::userResize):
    * rendering/RenderFrameSet.h:
    
    WebKit/qt:
    
    Privately export the setFrameSetFlatteningEnabled setting for
    use with the Qt DRT.
    
    * Api/qwebpage.cpp:
    (qt_drt_setFrameSetFlatteningEnabled):
    (QWebPagePrivate::core):
    * Api/qwebpage_p.h:
    
    WebKitTools:
    
    Add support for testing frame flattening with the Qt DRT
    
    * DumpRenderTree/qt/LayoutTestControllerQt.cpp:
    (LayoutTestController::setFrameSetFlatteningEnabled):
    * DumpRenderTree/qt/LayoutTestControllerQt.h:
    
    LayoutTests:
    
    Frameset flattening layout test, plus expected result for Qt.
    
    * fast/frames/flattening/frameset-flattening-advanced.html: Added.
    * fast/frames/flattening/frameset-flattening-grid.html: Added.
    * fast/frames/flattening/frameset-flattening-simple.html: Added.
    * fast/frames/flattening/frameset-flattening-subframe-resize.html: Added.
    * fast/frames/flattening/frameset-flattening-subframesets.html: Added.
    * fast/frames/flattening/resources/frameset-flattening-subframe-resize.html: Added.
    * platform/qt/fast/frames/flattening/frameset-flattening-advanced-expected.txt: Added.
    * platform/qt/fast/frames/flattening/frameset-flattening-grid-expected.txt: Added.
    * platform/qt/fast/frames/flattening/frameset-flattening-simple-expected.txt: Added.
    * platform/qt/fast/frames/flattening/frameset-flattening-subframe-resize-expected.txt: Added.
    * platform/qt/fast/frames/flattening/frameset-flattening-subframesets-expected.txt: Added.
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@54440 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 825cba5..2b0f9ef 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,24 @@
+2010-01-19  Kenneth Rohde Christiansen  <kenneth at webkit.org>
+
+        Reviewed by Dave Hyatt.
+
+        Implement flattening of framesets
+        https://bugs.webkit.org/show_bug.cgi?id=32717
+
+        Frameset flattening layout test, plus expected result for Qt.
+
+        * fast/frames/flattening/frameset-flattening-advanced.html: Added.
+        * fast/frames/flattening/frameset-flattening-grid.html: Added.
+        * fast/frames/flattening/frameset-flattening-simple.html: Added.
+        * fast/frames/flattening/frameset-flattening-subframe-resize.html: Added.
+        * fast/frames/flattening/frameset-flattening-subframesets.html: Added.
+        * fast/frames/flattening/resources/frameset-flattening-subframe-resize.html: Added.
+        * platform/qt/fast/frames/flattening/frameset-flattening-advanced-expected.txt: Added.
+        * platform/qt/fast/frames/flattening/frameset-flattening-grid-expected.txt: Added.
+        * platform/qt/fast/frames/flattening/frameset-flattening-simple-expected.txt: Added.
+        * platform/qt/fast/frames/flattening/frameset-flattening-subframe-resize-expected.txt: Added.
+        * platform/qt/fast/frames/flattening/frameset-flattening-subframesets-expected.txt: Added.
+
 2010-02-05  Simon Fraser  <simon.fraser at apple.com>
 
         Reviewed by Dan Bernstein.
diff --git a/LayoutTests/fast/frames/flattening/frameset-flattening-advanced.html b/LayoutTests/fast/frames/flattening/frameset-flattening-advanced.html
new file mode 100644
index 0000000..e2b2101
--- /dev/null
+++ b/LayoutTests/fast/frames/flattening/frameset-flattening-advanced.html
@@ -0,0 +1,53 @@
+<html>
+<head>
+    <script type="text/javascript">
+
+        function test()
+        {
+            if (window.layoutTestController) {
+                layoutTestController.waitUntilDone();
+                layoutTestController.setFrameSetFlatteningEnabled(true);
+            }
+
+            setTimeout(function() {
+                if (window.layoutTestController)
+                    layoutTestController.notifyDone();
+            }, 0);
+        }
+    </script>
+</head>
+
+<frameset rows="53%, 100%" frameborder="0" border=0 framespacing="0" onload="test();">
+    <frameset cols="53%, 100%">
+        <frame src="data:text/html,
+            <style>body { background-color: green; }</style>
+            <p>
+                Test for frameset flattening. The flattening only works inside the DRT.
+            </p>
+            <div style='position: absolute; width: 350px; height: 50px; left: 0; top: 0px;'></div>
+        ">
+        </frame>
+        <frame src="data:text/html,
+            <style>body { background-color: red; }</style>
+            <div style='position: absolute; width: 300px; height: 100px; left: 0; top: 0px;'></div>
+        ">
+        </frame>
+    </frameset>
+    <frameset cols="200, *">
+        <frame src="data:text/html,
+            <style>body { background-color: yellow; }</style>
+            <div style='position: absolute; width: 50px; height: 200px; left: 0; top: 0px;'></div>
+        ">
+        </frame>
+        <frame src="data:text/html,
+            <style>body { background-color: blue; }</style>
+            <div style='position: absolute; width: 650px; height: 400px; left: 0; top: 0px;'></div>
+        ">
+        </frame>
+    </frameset>
+    <noframes>
+        <body>
+        </body>
+    </noframes>
+</frameset>
+</html>
diff --git a/LayoutTests/fast/frames/flattening/frameset-flattening-grid.html b/LayoutTests/fast/frames/flattening/frameset-flattening-grid.html
new file mode 100644
index 0000000..4c1faee
--- /dev/null
+++ b/LayoutTests/fast/frames/flattening/frameset-flattening-grid.html
@@ -0,0 +1,39 @@
+<html>
+<frameset border=0 rows="100,400" cols="300,300" onload="test()">
+    <frame src="data:text/html,
+        <style>body { background-color: green; }</style>
+        <p>
+            Test for frameset flattening. The flattening only works inside the DRT.
+        </p>
+        <p>
+            This frame should be 300px wide, 200px tall and not be scrollable (have scrollbars).
+        </p>
+        <div style='position: absolute; width: 300px; height: 200px; left: 0; top: 0px;'></div>
+    ">
+    </frame>
+    <frame src="data:text/html,
+        <style>body { background-color: red; }</style>
+        <p>
+            This frame should be 300px wide, 200px tall and not be scrollable (have scrollbars).
+        </p>
+        <div style='position: absolute; width: 300px; height: 50px; left: 0; top: 0px;'></div>
+    ">
+    </frame>
+    <frame src="data:text/html,
+        <style>body { background-color: yellow; }</style>
+        <p>
+            This frame should be 600px wide, 600px tall and not be scrollable (have scrollbars).
+        </p>
+        <div style='position: absolute; width: 600px; height: 600px; left: 0; top: 0px;'></div>
+    ">
+    </frame>
+    <frame src="data:text/html,
+        <style>body { background-color: blue; }</style>
+        <p>
+            This frame should be 600px wide, 600px tall and not be scrollable (have scrollbars).
+        </p>
+        <div style='position: absolute; width: 600px; height: 600px; left: 0; top: 0px;'></div>
+    ">
+    </frame>
+</frameset>
+</html>
diff --git a/LayoutTests/fast/frames/flattening/frameset-flattening-simple.html b/LayoutTests/fast/frames/flattening/frameset-flattening-simple.html
new file mode 100644
index 0000000..871229f
--- /dev/null
+++ b/LayoutTests/fast/frames/flattening/frameset-flattening-simple.html
@@ -0,0 +1,31 @@
+<html>
+<head>
+    <script type="text/javascript">
+        function test()
+        {
+            if (window.layoutTestController) {
+                layoutTestController.waitUntilDone();
+                layoutTestController.setFrameSetFlatteningEnabled(true);
+            }
+
+            setTimeout(function() {
+                if (window.layoutTestController)
+                    layoutTestController.notifyDone();
+            }, 0);
+        }
+    </script>
+</head>
+<frameset border=0 cols="*,200" onload="test()">
+    <frame src="data:text/html,
+        <style>body { background-color: green; }</style>
+        <p>
+            Test for frameset flattening. The flattening only works inside the DRT.
+        </p>
+        <p>
+            This frame should be 800px wide and not be scrollable (have scrollbars).
+        </p>
+        <div style='position: absolute; width: 800px; height: 1px; left: 0; top: 100px;'></div>
+    ">
+    <frame>
+</frameset>
+</html>
diff --git a/LayoutTests/fast/frames/flattening/frameset-flattening-subframe-resize.html b/LayoutTests/fast/frames/flattening/frameset-flattening-subframe-resize.html
new file mode 100644
index 0000000..872008f
--- /dev/null
+++ b/LayoutTests/fast/frames/flattening/frameset-flattening-subframe-resize.html
@@ -0,0 +1,37 @@
+<html>
+<head>
+    <script type="text/javascript">
+
+        function test()
+        {
+            if (window.layoutTestController) {
+                layoutTestController.waitUntilDone();
+                layoutTestController.setFrameSetFlatteningEnabled(true);
+            }
+        }
+
+        function test2()
+        {
+            setTimeout(contentResize, 50);
+        }
+
+        function contentResize()
+        {
+            var div = frames[0].document.getElementById('box');
+                div.style.height='300';
+                div.style.width='300';
+                div.style.backgroundColor='blue';
+
+            if (window.layoutTestController) {
+                frames[0].document.body.offsetTop;
+                layoutTestController.display();
+                layoutTestController.notifyDone();
+            }
+        }
+    </script>
+</head>
+<frameset border=0 cols="*,700" onload="test();">
+    <frame src="resources/frameset-flattening-subframe-resize.html" onload="test2();">
+    <frame>
+</frameset>
+</html>
diff --git a/LayoutTests/fast/frames/flattening/frameset-flattening-subframesets.html b/LayoutTests/fast/frames/flattening/frameset-flattening-subframesets.html
new file mode 100644
index 0000000..066fd87
--- /dev/null
+++ b/LayoutTests/fast/frames/flattening/frameset-flattening-subframesets.html
@@ -0,0 +1,61 @@
+<html>
+<head>
+    <script type="text/javascript">
+
+        function test()
+        {
+            if (window.layoutTestController) {
+                layoutTestController.waitUntilDone();
+                layoutTestController.setFrameSetFlatteningEnabled(true);
+            }
+
+            setTimeout(function() {
+                if (window.layoutTestController)
+                    layoutTestController.notifyDone();
+            }, 0);
+        }
+    </script>
+</head>
+
+<frameset border=0 rows="100,400" onload="test();">
+    <frameset border=0 cols="300,300">
+        <frame src="data:text/html,
+            <style>body { background-color: green; }</style>
+            <p>
+                A frameset flattening test that only works inside the DRT.
+            </p>
+            <p>
+                This frame is inside frameset 1 and should be at least 450px wide, 150px tall and not be scrollable.
+            </p>
+            <div style='position: absolute; width: 450px; height: 50px; left: 0; top: 0px;'></div>
+        ">
+        </frame>
+        <frame src="data:text/html,
+            <style>body { background-color: red; }</style>
+            <p>
+                This frame is inside frameset 1 and should be at least 450px wide, 150px tall and not be scrollable.
+            </p>
+            <div style='position: absolute; width: 450px; height: 150px; left: 0; top: 0px;'></div>
+        ">
+        </frame>
+    </frameset>
+    <frameset border=0 cols="300,300">
+        <frame src="data:text/html,
+            <style>body { background-color: yellow; }</style>
+            <p>
+                This frame is inside frameset 2 and should be at least 450px wide, 400px tall and not be scrollable.
+            </p>
+            <div style='position: absolute; width: 200px; height: 450px; left: 0; top: 0px;'></div>
+        ">
+        </frame>
+        <frame src="data:text/html,
+            <style>body { background-color: blue; }</style>
+            <p>
+                This frame is inside frameset 2 and should be at least 450px wide, 400px tall and not be scrollable.
+            </p>
+            <div style='position: absolute; width: 450px; height: 450px; left: 0; top: 0px;'></div>
+        ">
+        </frame>
+    </frameset>
+</frameset>
+</html>
diff --git a/LayoutTests/platform/gtk/Skipped b/LayoutTests/platform/gtk/Skipped
index 6cdc65a..a9d3d71 100644
--- a/LayoutTests/platform/gtk/Skipped
+++ b/LayoutTests/platform/gtk/Skipped
@@ -5800,3 +5800,7 @@ printing/pageNumerForElementById.html
 # Intermittently timing out on Gtk Debug Bot:
 # https://bugs.webkit.org/show_bug.cgi?id=33445
 http/tests/incremental/split-hex-entities.pl
+
+# Skip frame flattening tests until it can be tested by this DRT
+# https://bugs.webkit.org/show_bug.cgi?id=32717
+fast/frames/flattening/
diff --git a/LayoutTests/platform/mac/Skipped b/LayoutTests/platform/mac/Skipped
index 69d6e0b..89683e3 100644
--- a/LayoutTests/platform/mac/Skipped
+++ b/LayoutTests/platform/mac/Skipped
@@ -111,3 +111,7 @@ http/tests/media/video-cookie.html
 # Fails on Mac
 # https://bugs.webkit.org/show_bug.cgi?id=34331
 http/tests/media/video-referer.html
+
+# Skip frame flattening tests until it can be tested by this DRT
+# https://bugs.webkit.org/show_bug.cgi?id=32717
+fast/frames/flattening/
diff --git a/LayoutTests/platform/win/Skipped b/LayoutTests/platform/win/Skipped
index 27e2e3a..edc06fc 100644
--- a/LayoutTests/platform/win/Skipped
+++ b/LayoutTests/platform/win/Skipped
@@ -744,3 +744,7 @@ printing/pageNumerForElementById.html
 # http/tests/security/xss-DENIED-window-open-javascript-url.html timed out on Windows Debug Bot
 # https://bugs.webkit.org/show_bug.cgi?id=33349
 http/tests/security/xss-DENIED-window-open-javascript-url.html
+
+# Skip frame flattening tests until it can be tested by this DRT
+# https://bugs.webkit.org/show_bug.cgi?id=32717
+fast/frames/flattening/
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 846c2f1..a06c244 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,42 @@
+2010-01-19  Kenneth Rohde Christiansen  <kenneth at webkit.org>
+
+        Reviewed by Dave Hyatt.
+
+        Implement flattening of framesets
+        https://bugs.webkit.org/show_bug.cgi?id=32717
+
+        The following patch, builds ontop of Antti Koivisto's frameset
+        flattening code from the iPhone source, which itself is based on
+        the old Nokia Series 60 source.
+
+        Layout tests have been added to test the functionality and the original
+        code which has then been fixed to make these pass, as well as support
+        frameset grids.
+
+        Tests: fast/frames/flattening/frameset-flattening-advanced.html
+               fast/frames/flattening/frameset-flattening-grid.html
+               fast/frames/flattening/frameset-flattening-simple.html
+               fast/frames/flattening/frameset-flattening-subframe-resize.html
+               fast/frames/flattening/frameset-flattening-subframesets.html
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::layout):
+        (WebCore::FrameView::scheduleRelayout):
+        * page/Settings.cpp:
+        (WebCore::Settings::Settings):
+        (WebCore::Settings::setFrameSetFlatteningEnabled):
+        * page/Settings.h:
+        (WebCore::Settings::frameSetFlatteningEnabled):
+        * rendering/RenderFrame.cpp:
+        (WebCore::RenderFrame::layoutWithFlattening):
+        * rendering/RenderFrame.h:
+        * rendering/RenderFrameSet.cpp:
+        (WebCore::RenderFrameSet::layout):
+        (WebCore::RenderFrameSet::positionFramesWithFlattening):
+        (WebCore::RenderFrameSet::flattenFrameSet):
+        (WebCore::RenderFrameSet::userResize):
+        * rendering/RenderFrameSet.h:
+
 2010-02-05  Simon Fraser  <simon.fraser at apple.com>
 
         Reviewed by Dan Bernstein.
diff --git a/WebCore/page/FrameView.cpp b/WebCore/page/FrameView.cpp
index d839e26..4de2a17 100644
--- a/WebCore/page/FrameView.cpp
+++ b/WebCore/page/FrameView.cpp
@@ -601,7 +601,7 @@ void FrameView::layout(bool allowSubtree)
         RenderObject* rootRenderer = documentElement ? documentElement->renderer() : 0;
         Node* body = document->body();
         if (body && body->renderer()) {
-            if (body->hasTagName(framesetTag)) {
+            if (body->hasTagName(framesetTag) && !m_frame->settings()->frameSetFlatteningEnabled()) {
                 body->renderer()->setChildNeedsLayout(true);
                 vMode = ScrollbarAlwaysOff;
                 hMode = ScrollbarAlwaysOff;
@@ -1138,6 +1138,11 @@ void FrameView::scheduleRelayout()
     if (!m_frame->document()->shouldScheduleLayout())
         return;
 
+    // When frameset flattening is enabled, the contents of the frame affects layout of the parent frames.
+    // Also invalidate parent frame starting from the owner element of this frame.
+    if (m_frame->settings()->frameSetFlatteningEnabled() && m_frame->ownerRenderer())
+        m_frame->ownerRenderer()->setNeedsLayout(true, true);
+
     int delay = m_frame->document()->minimumLayoutDelay();
     if (m_layoutTimer.isActive() && m_delayedLayout && !delay)
         unscheduleRelayout();
diff --git a/WebCore/page/Settings.cpp b/WebCore/page/Settings.cpp
index 87737ee..969969f 100644
--- a/WebCore/page/Settings.cpp
+++ b/WebCore/page/Settings.cpp
@@ -95,6 +95,7 @@ Settings::Settings(Page* page)
     , m_authorAndUserStylesEnabled(true)
     , m_needsSiteSpecificQuirks(false)
     , m_fontRenderingMode(0)
+    , m_frameSetFlatteningEnabled(false)
     , m_webArchiveDebugModeEnabled(false)
     , m_localFileContentSniffingEnabled(false)
     , m_inApplicationChromeMode(false)
@@ -426,6 +427,11 @@ void Settings::setNeedsSiteSpecificQuirks(bool needsQuirks)
     m_needsSiteSpecificQuirks = needsQuirks;
 }
 
+void Settings::setFrameSetFlatteningEnabled(bool frameSetFlatteningEnabled)
+{
+    m_frameSetFlatteningEnabled = frameSetFlatteningEnabled;
+}
+
 void Settings::setWebArchiveDebugModeEnabled(bool enabled)
 {
     m_webArchiveDebugModeEnabled = enabled;
diff --git a/WebCore/page/Settings.h b/WebCore/page/Settings.h
index 73c547e..577459c 100644
--- a/WebCore/page/Settings.h
+++ b/WebCore/page/Settings.h
@@ -200,7 +200,10 @@ namespace WebCore {
         
         void setDeveloperExtrasEnabled(bool);
         bool developerExtrasEnabled() const { return m_developerExtrasEnabled; }
-        
+
+        void setFrameSetFlatteningEnabled(bool);
+        bool frameSetFlatteningEnabled() const { return m_frameSetFlatteningEnabled; }
+
         void setAuthorAndUserStylesEnabled(bool);
         bool authorAndUserStylesEnabled() const { return m_authorAndUserStylesEnabled; }
         
@@ -337,6 +340,7 @@ namespace WebCore {
         bool m_authorAndUserStylesEnabled : 1;
         bool m_needsSiteSpecificQuirks : 1;
         unsigned m_fontRenderingMode : 1;
+        bool m_frameSetFlatteningEnabled : 1;
         bool m_webArchiveDebugModeEnabled : 1;
         bool m_localFileContentSniffingEnabled : 1;
         bool m_inApplicationChromeMode : 1;
diff --git a/WebCore/rendering/RenderFrame.cpp b/WebCore/rendering/RenderFrame.cpp
index a7b131b..f750012 100644
--- a/WebCore/rendering/RenderFrame.cpp
+++ b/WebCore/rendering/RenderFrame.cpp
@@ -26,6 +26,7 @@
 
 #include "FrameView.h"
 #include "HTMLFrameElement.h"
+#include "RenderView.h"
 
 namespace WebCore {
 
@@ -58,4 +59,56 @@ void RenderFrame::viewCleared()
         view->setMarginHeight(marginh);
 }
 
+void RenderFrame::layoutWithFlattening(bool fixedWidth, bool fixedHeight)
+{
+    // NOTE: The width and height have been set at this point by
+    // RenderFrameSet::positionFramesWithFlattening()
+
+    FrameView* childFrameView = static_cast<FrameView*>(widget());
+    RenderView* childRoot = childFrameView ? static_cast<RenderView*>(childFrameView->frame()->contentRenderer()) : 0;
+    HTMLFrameElement* element = static_cast<HTMLFrameElement*>(node());
+
+    // Do not expand framesets which has zero width or height
+    if (!width() || !height() || !childRoot) {
+        updateWidgetPosition();
+        if (childFrameView)
+            childFrameView->layout();
+        setNeedsLayout(false);
+        return;
+    }
+
+    // need to update to calculate min/max correctly
+    updateWidgetPosition();
+    if (childRoot->prefWidthsDirty())
+        childRoot->calcPrefWidths();
+
+    // if scrollbars are off, and the width or height are fixed
+    // we obey them and do not expand. With frame flattening
+    // no subframe much ever become scrollable.
+
+    bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff;
+
+    // make sure minimum preferred width is enforced
+    if (isScrollable || !fixedWidth || childRoot->isFrameSet())
+        setWidth(max(width(), childRoot->minPrefWidth()));
+
+    // update again to pass the width to the child frame
+    updateWidgetPosition();
+    childFrameView->layout();
+
+    // expand the frame by setting frame height = content height
+    if (isScrollable || !fixedHeight || childRoot->isFrameSet())
+        setHeight(max(height(), childFrameView->contentsHeight()));
+    if (isScrollable || !fixedWidth || childRoot->isFrameSet())
+        setWidth(max(width(), childFrameView->contentsWidth()));
+
+    updateWidgetPosition();
+
+    ASSERT(!childFrameView->layoutPending());
+    ASSERT(!childRoot->needsLayout());
+    ASSERT(!childRoot->firstChild() || !childRoot->firstChild()->firstChild() || !childRoot->firstChild()->firstChild()->needsLayout());
+
+    setNeedsLayout(false);
+}
+
 } // namespace WebCore
diff --git a/WebCore/rendering/RenderFrame.h b/WebCore/rendering/RenderFrame.h
index 587a8bd..14840fb 100644
--- a/WebCore/rendering/RenderFrame.h
+++ b/WebCore/rendering/RenderFrame.h
@@ -35,6 +35,7 @@ public:
     RenderFrame(HTMLFrameElement*);
 
     FrameEdgeInfo edgeInfo() const;
+    void layoutWithFlattening(bool fixedWidth, bool fixedHeight);
 
 private:
     virtual const char* renderName() const { return "RenderFrame"; }
diff --git a/WebCore/rendering/RenderFrameSet.cpp b/WebCore/rendering/RenderFrameSet.cpp
index a456ef4..c832d39 100644
--- a/WebCore/rendering/RenderFrameSet.cpp
+++ b/WebCore/rendering/RenderFrameSet.cpp
@@ -36,6 +36,7 @@
 #include "MouseEvent.h"
 #include "RenderFrame.h"
 #include "RenderView.h"
+#include "Settings.h"
 
 namespace WebCore {
 
@@ -473,7 +474,10 @@ void RenderFrameSet::layout()
     layOutAxis(m_rows, frameSet()->rowLengths(), height() - (rows - 1) * borderThickness);
     layOutAxis(m_cols, frameSet()->colLengths(), width() - (cols - 1) * borderThickness);
 
-    positionFrames();
+    if (flattenFrameSet())
+        positionFramesWithFlattening();
+    else
+        positionFrames();
 
     RenderBox::layout();
 
@@ -532,6 +536,119 @@ void RenderFrameSet::positionFrames()
     }
 }
 
+void RenderFrameSet::positionFramesWithFlattening()
+{
+    RenderBox* child = firstChildBox();
+    if (!child)
+        return;
+
+    int rows = frameSet()->totalRows();
+    int cols = frameSet()->totalCols();
+
+    int borderThickness = frameSet()->border();
+    bool repaintNeeded = false;
+
+    // calculate frameset height based on actual content height to eliminate scrolling
+    bool out = false;
+    for (int r = 0; r < rows && !out; r++) {
+        int extra = 0;
+        int height = m_rows.m_sizes[r];
+
+        for (int c = 0; c < cols; c++) {
+            IntRect oldFrameRect = child->frameRect();
+
+            int width = m_cols.m_sizes[c];
+
+            bool fixedWidth = frameSet()->colLengths() && frameSet()->colLengths()[c].isFixed();
+            bool fixedHeight = frameSet()->rowLengths() && frameSet()->rowLengths()[r].isFixed();
+
+            // has to be resized and itself resize its contents
+            if (!fixedWidth)
+                child->setWidth(width ? width + extra / (cols - c) : 0);
+            else
+                child->setWidth(width);
+            child->setHeight(height);
+
+            child->setNeedsLayout(true);
+
+            if (child->isFrameSet())
+                toRenderFrameSet(child)->layout();
+            else
+                toRenderFrame(child)->layoutWithFlattening(fixedWidth, fixedHeight);
+
+            if (child->height() > m_rows.m_sizes[r])
+                m_rows.m_sizes[r] = child->height();
+            if (child->width() > m_cols.m_sizes[c])
+                m_cols.m_sizes[c] = child->width();
+
+            if (child->frameRect() != oldFrameRect)
+                repaintNeeded = true;
+
+            // difference between calculated frame width and the width it actually decides to have
+            extra += width - m_cols.m_sizes[c];
+
+            child = child->nextSiblingBox();
+            if (!child) {
+                out = true;
+                break;
+            }
+        }
+    }
+
+    int xPos = 0;
+    int yPos = 0;
+    out = false;
+    child = firstChildBox();
+    for (int r = 0; r < rows && !out; r++) {
+        xPos = 0;
+        for (int c = 0; c < cols; c++) {
+            // ensure the rows and columns are filled
+            IntRect oldRect = child->frameRect();
+
+            child->setLocation(xPos, yPos);
+            child->setHeight(m_rows.m_sizes[r]);
+            child->setWidth(m_cols.m_sizes[c]);
+
+            if (child->frameRect() != oldRect) {
+                repaintNeeded = true;
+
+                // update to final size
+                child->setNeedsLayout(true);
+                if (child->isFrameSet())
+                    toRenderFrameSet(child)->layout();
+                else
+                    toRenderFrame(child)->layoutWithFlattening(true, true);
+            }
+
+            xPos += m_cols.m_sizes[c] + borderThickness;
+            child = child->nextSiblingBox();
+            if (!child) {
+                out = true;
+                break;
+            }
+        }
+        yPos += m_rows.m_sizes[r] + borderThickness;
+    }
+
+    setWidth(xPos - borderThickness);
+    setHeight(yPos - borderThickness);
+
+    if (repaintNeeded)
+        repaint();
+
+    // all the remaining frames are hidden to avoid ugly spurious unflowed frames
+    for (; child; child = child->nextSiblingBox()) {
+        child->setWidth(0);
+        child->setHeight(0);
+        child->setNeedsLayout(false);
+    }
+}
+
+bool RenderFrameSet::flattenFrameSet() const
+{
+    return document()->frame() && document()->frame()->settings()->frameSetFlatteningEnabled();
+}
+
 void RenderFrameSet::startResizing(GridAxis& axis, int position)
 {
     int split = hitTestSplit(axis, position);
@@ -560,6 +677,9 @@ void RenderFrameSet::continueResizing(GridAxis& axis, int position)
 
 bool RenderFrameSet::userResize(MouseEvent* evt)
 {
+    if (flattenFrameSet())
+        return false;
+
     if (!m_isResizing) {
         if (needsLayout())
             return false;
diff --git a/WebCore/rendering/RenderFrameSet.h b/WebCore/rendering/RenderFrameSet.h
index 26bf732..4e53ff0 100644
--- a/WebCore/rendering/RenderFrameSet.h
+++ b/WebCore/rendering/RenderFrameSet.h
@@ -70,6 +70,8 @@ public:
     bool canResizeRow(const IntPoint&) const;
     bool canResizeColumn(const IntPoint&) const;
 
+    bool flattenFrameSet() const;
+
 private:
     static const int noSplit = -1;
 
@@ -104,6 +106,7 @@ private:
     void computeEdgeInfo();
     void fillFromEdgeInfo(const FrameEdgeInfo& edgeInfo, int r, int c);
     void positionFrames();
+    void positionFramesWithFlattening();
 
     int splitPosition(const GridAxis&, int split) const;
     int hitTestSplit(const GridAxis&, int position) const;
diff --git a/WebKit/qt/Api/qwebpage.cpp b/WebKit/qt/Api/qwebpage.cpp
index ea2401b..b8be7e7 100644
--- a/WebKit/qt/Api/qwebpage.cpp
+++ b/WebKit/qt/Api/qwebpage.cpp
@@ -146,6 +146,11 @@ void QWEBKIT_EXPORT qt_drt_run(bool b)
     QWebPagePrivate::drtRun = b;
 }
 
+void QWEBKIT_EXPORT qt_drt_setFrameSetFlatteningEnabled(QWebPage* page, bool enabled)
+{
+    QWebPagePrivate::core(page)->settings()->setFrameSetFlatteningEnabled(enabled);
+}
+
 void QWEBKIT_EXPORT qt_webpage_setGroupName(QWebPage* page, const QString& groupName)
 {
     page->handle()->page->setGroupName(groupName);
@@ -444,6 +449,11 @@ QWebPagePrivate::~QWebPagePrivate()
     delete page;
 }
 
+WebCore::Page* QWebPagePrivate::core(QWebPage* page)
+{
+    return page->d->page;
+}
+
 bool QWebPagePrivate::acceptNavigationRequest(QWebFrame *frame, const QNetworkRequest &request, QWebPage::NavigationType type)
 {
     if (insideOpenCall
diff --git a/WebKit/qt/Api/qwebpage_p.h b/WebKit/qt/Api/qwebpage_p.h
index dbc981e..15ddfb2 100644
--- a/WebKit/qt/Api/qwebpage_p.h
+++ b/WebKit/qt/Api/qwebpage_p.h
@@ -62,6 +62,9 @@ class QWebPagePrivate {
 public:
     QWebPagePrivate(QWebPage*);
     ~QWebPagePrivate();
+
+    static WebCore::Page* core(QWebPage*);
+
     void createMainFrame();
 #ifndef QT_NO_CONTEXTMENU
     QMenu* createContextMenu(const WebCore::ContextMenu* webcoreMenu, const QList<WebCore::ContextMenuItem>* items, QBitArray* visitedWebActions);
diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog
index 2d69b1d..e3fb86d 100644
--- a/WebKit/qt/ChangeLog
+++ b/WebKit/qt/ChangeLog
@@ -1,3 +1,18 @@
+2010-01-19  Kenneth Rohde Christiansen  <kenneth at webkit.org>
+
+        Reviewed by Dave Hyatt.
+
+        Implement flattening of framesets
+        https://bugs.webkit.org/show_bug.cgi?id=32717
+
+        Privately export the setFrameSetFlatteningEnabled setting for
+        use with the Qt DRT.
+
+        * Api/qwebpage.cpp:
+        (qt_drt_setFrameSetFlatteningEnabled):
+        (QWebPagePrivate::core):
+        * Api/qwebpage_p.h:
+
 2010-02-05  Tor Arne Vestbø  <tor.arne.vestbo at nokia.com>
 
         [Qt] Fix build on Windows
diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
index c5b63be..cfc1611 100644
--- a/WebKitTools/ChangeLog
+++ b/WebKitTools/ChangeLog
@@ -1,3 +1,16 @@
+2010-01-19  Kenneth Rohde Christiansen  <kenneth at webkit.org>
+
+        Reviewed by Dave Hyatt.
+
+        Implement flattening of framesets
+        https://bugs.webkit.org/show_bug.cgi?id=32717
+
+        Add support for testing frame flattening with the Qt DRT
+
+        * DumpRenderTree/qt/LayoutTestControllerQt.cpp:
+        (LayoutTestController::setFrameSetFlatteningEnabled):
+        * DumpRenderTree/qt/LayoutTestControllerQt.h:
+
 2010-02-03  Chris Jerdonek  <cjerdonek at webkit.org>
 
         Reviewed by Shinichiro Hamaji.
diff --git a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp
index ca48003..aaa9ef0 100644
--- a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp
+++ b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp
@@ -38,6 +38,7 @@
 
 extern void qt_dump_editing_callbacks(bool b);
 extern void qt_dump_resource_load_callbacks(bool b);
+extern void qt_drt_setFrameSetFlatteningEnabled(QWebPage*, bool);
 extern void qt_drt_setJavaScriptProfilingEnabled(QWebFrame*, bool enabled);
 extern bool qt_drt_pauseAnimation(QWebFrame*, const QString& name, double time, const QString& elementId);
 extern bool qt_drt_pauseTransitionOfProperty(QWebFrame*, const QString& name, double time, const QString& elementId);
@@ -287,6 +288,11 @@ void LayoutTestController::hideWebInspector()
     m_drt->webPage()->webInspector()->hide();
 }
 
+void LayoutTestController::setFrameSetFlatteningEnabled(bool enabled)
+{
+    qt_drt_setFrameSetFlatteningEnabled(m_drt->webPage(), enabled);
+}
+
 void LayoutTestController::setAllowUniversalAccessFromFileURLs(bool enabled)
 {
     m_drt->webPage()->settings()->setAttribute(QWebSettings::LocalContentCanAccessRemoteUrls, enabled);
diff --git a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.h b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.h
index 365640d..059daab 100644
--- a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.h
+++ b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.h
@@ -115,6 +115,8 @@ public slots:
     void dumpSelectionRect() const {}
     void showWebInspector();
     void hideWebInspector();
+
+    void setFrameSetFlatteningEnabled(bool enable);
     void setAllowUniversalAccessFromFileURLs(bool enable);
     void setJavaScriptProfilingEnabled(bool enable);
     void setFixedContentsSize(int width, int height);

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list