webengine/osswebengine/WebCore/rendering/RenderFrame.cpp
changeset 0 dd21522fd290
child 47 e1bea15f9a39
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/webengine/osswebengine/WebCore/rendering/RenderFrame.cpp	Mon Mar 30 12:54:55 2009 +0300
@@ -0,0 +1,118 @@
+/**
+ * This file is part of the KDE project.
+ *
+ * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
+ *           (C) 2000 Simon Hausmann <hausmann@kde.org>
+ *           (C) 2000 Stefan Schimanski (1Stein@gmx.de)
+ * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+#include "RenderFrame.h"
+#include "RenderFrameSet.h"
+#include "FrameView.h"
+#include "HTMLFrameSetElement.h"
+#include "HTMLNames.h"
+#if PLATFORM(SYMBIAN)
+#include "Document.h"
+#include "Frame.h"
+#include "renderView.h"
+#include "FrameView.h"
+#include "ScrollTypes.h"
+#endif
+
+namespace WebCore {
+
+using namespace HTMLNames;
+
+RenderFrame::RenderFrame(HTMLFrameElement* frame)
+    : RenderPart(frame)
+{
+    setInline(false);
+}
+
+FrameEdgeInfo RenderFrame::edgeInfo() const
+{
+    return FrameEdgeInfo(element()->noResize(), element()->hasFrameBorder());
+}
+
+void RenderFrame::viewCleared()
+{
+    if (element() && m_widget && m_widget->isFrameView()) {
+        FrameView* view = static_cast<FrameView*>(m_widget);
+        int marginw = element()->getMarginWidth();
+        int marginh = element()->getMarginHeight();
+
+        if (marginw != -1)
+            view->setMarginWidth(marginw);
+        if (marginh != -1)
+            view->setMarginHeight(marginh);
+    }
+}
+
+void RenderFrame::layoutWithFlattening(bool flexibleWidth, bool flexibleHeight)
+{
+    FrameView* childFrameView = static_cast<FrameView*>(m_widget);
+    RenderFrame* childRoot = (RenderFrame*)(childFrameView ? childFrameView->frame()->renderer() : 0);
+    // don't expand frames set to have zero width or height
+    if (!m_width || !m_height || !childRoot) {
+        updateWidgetPosition();
+        if (childFrameView)
+            while (childFrameView->layoutPending())
+                childFrameView->layout();
+        setNeedsLayout(false);
+        return;
+    }
+
+    // expand the frame by setting frame height = content height
+    
+    // need to update to calculate min/max correctly
+    updateWidgetPosition();
+    if (childRoot->prefWidthsDirty())
+        childRoot->calcPrefWidths();
+    
+    bool scrolling = element()->scrollingMode() != ScrollbarAlwaysOff;
+    
+    // if scrollbars are off assume it is ok for this frame to become really narrow
+    if (scrolling || flexibleWidth || childFrameView->frame()->isFrameSet())
+         m_width = max(m_width, childRoot->minPrefWidth());
+ 
+    // update again to pass the width to the child frame
+    updateWidgetPosition();
+     
+    do
+        childFrameView->layout();
+    while (childFrameView->layoutPending() || childRoot->needsLayout());
+        
+    if (scrolling || flexibleHeight || childFrameView->frame()->isFrameSet())
+        m_height = max(m_height, childFrameView->contentsHeight());
+    if (scrolling || flexibleWidth || childFrameView->frame()->isFrameSet())
+        m_width = max(m_width, childFrameView->contentsWidth());
+    
+    updateWidgetPosition();
+
+    ASSERT(!childFrameView->layoutPending());
+    ASSERT(!childRoot->needsLayout());
+    ASSERT(!childRoot->firstChild() || !childRoot->firstChild()->firstChild() || !childRoot->firstChild()->firstChild()->needsLayout());
+    
+    setNeedsLayout(false);
+}
+
+
+} // namespace WebCore