summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/rendering')
-rw-r--r--WebCore/rendering/RenderBlockLineLayout.cpp16
-rw-r--r--WebCore/rendering/RenderFrame.cpp50
-rw-r--r--WebCore/rendering/RenderIFrame.cpp129
-rw-r--r--WebCore/rendering/RenderView.h3
-rw-r--r--WebCore/rendering/RenderWidget.cpp2
5 files changed, 22 insertions, 178 deletions
diff --git a/WebCore/rendering/RenderBlockLineLayout.cpp b/WebCore/rendering/RenderBlockLineLayout.cpp
index 6b9fc68..c722136 100644
--- a/WebCore/rendering/RenderBlockLineLayout.cpp
+++ b/WebCore/rendering/RenderBlockLineLayout.cpp
@@ -609,23 +609,7 @@ void RenderBlock::layoutInlineChildren(bool relayoutChildren, int& repaintLogica
else if (fullLayout || o->needsLayout()) {
// Replaced elements
toRenderBox(o)->dirtyLineBoxes(fullLayout);
-#if defined(ANDROID_FLATTEN_IFRAME) || defined(ANDROID_FLATTEN_FRAMESET)
- // Android frame flattening during layout() may cause the
- // renderer to be destroyed, if for example a frames onresize handler
- // deletes the frame - see http://trac.webkit.org/changeset/61070 for example.
- // We may be able to remove this protector when we switch to the upstream
- // frame flattening code. In the case of an anonymous render object like RenderListMarker
- // the document is the DOM node associated with this RenderObject.
- RefPtr<Node> protector(o->isAnonymous() ? o->document() : o->node());
-#endif
o->layoutIfNeeded();
-#if defined(ANDROID_FLATTEN_IFRAME) || defined(ANDROID_FLATTEN_FRAMESET)
- // Ensure that the renderer still exists. If it's gone away we will crash pretty
- // fast by continuing to use the now invalid o pointer. If the renderer has gone,
- // then there's no point in continuing to try to layout it's children so we break.
- if (!protector->renderer())
- break;
-#endif
}
}
#else
diff --git a/WebCore/rendering/RenderFrame.cpp b/WebCore/rendering/RenderFrame.cpp
index c3283f8..bc40976 100644
--- a/WebCore/rendering/RenderFrame.cpp
+++ b/WebCore/rendering/RenderFrame.cpp
@@ -28,12 +28,6 @@
#include "HTMLFrameElement.h"
#include "RenderView.h"
-#ifdef ANDROID_FLATTEN_FRAMESET
-#include "Frame.h"
-#include "Document.h"
-#include "RenderView.h"
-#endif
-
namespace WebCore {
RenderFrame::RenderFrame(HTMLFrameElement* frame)
@@ -68,29 +62,29 @@ void RenderFrame::viewCleared()
#ifdef ANDROID_FLATTEN_FRAMESET
void RenderFrame::layout()
{
- if (widget() && widget()->isFrameView()) {
- FrameView* view = static_cast<FrameView*>(widget());
- RenderView* root = NULL;
- if (view->frame() && view->frame()->document() &&
- view->frame()->document()->renderer() &&
- view->frame()->document()->renderer()->isRenderView())
- root = static_cast<RenderView*>(view->frame()->document()->renderer());
- if (root) {
- // Resize the widget so that the RenderView will layout according to those dimensions.
- view->resize(width(), height());
- view->layout();
- // We can only grow in width and height because if positionFrames gives us a width and we become smaller,
- // then the fixup process of forcing the frame to fill extra space will fail.
- const int docLeft = root->docLeft();
- if (width() > root->docWidth(docLeft)) {
- view->resize(root->docWidth(docLeft), 0);
- view->layout();
- }
- // Honor the height set by RenderFrameSet::positionFrames unless our document height is larger.
- setHeight(max(root->docHeight(), height()));
- setWidth(max(root->docWidth(docLeft), width()));
- }
+ FrameView* view = static_cast<FrameView*>(widget());
+ RenderView* root = view ? view->frame()->contentRenderer() : 0;
+ if (!width() || !height() || !root) {
+ setNeedsLayout(false);
+ return;
}
+
+ HTMLFrameElementBase* element = static_cast<HTMLFrameElementBase*>(node());
+ if (element->scrollingMode() == ScrollbarAlwaysOff && !root->isFrameSet()) {
+ setNeedsLayout(false);
+ return;
+ }
+
+ int layoutWidth = width();
+
+ setWidth(max(view->contentsWidth() + borderAndPaddingWidth(), width()));
+ setHeight(max(view->contentsHeight() + borderAndPaddingHeight(), height()));
+
+ // This should trigger a layout of the FrameView which will schedule a
+ // relayout of this RenderFrame.
+ if (layoutWidth < width())
+ setHeight(0);
+
setNeedsLayout(false);
}
#endif
diff --git a/WebCore/rendering/RenderIFrame.cpp b/WebCore/rendering/RenderIFrame.cpp
index 36d2449..19bca49 100644
--- a/WebCore/rendering/RenderIFrame.cpp
+++ b/WebCore/rendering/RenderIFrame.cpp
@@ -44,30 +44,6 @@ RenderIFrame::RenderIFrame(Element* element)
void RenderIFrame::computeLogicalHeight()
{
RenderPart::computeLogicalHeight();
-#ifdef ANDROID_FLATTEN_IFRAME
- if (!node()->hasTagName(iframeTag) || !widget() || !widget()->isFrameView())
- return;
- FrameView* view = static_cast<FrameView*>(widget());
- RenderView* root = static_cast<RenderView*>(view->frame()->contentRenderer());
- if (!root)
- return;
- // Do not expand if the scrollbars are suppressed and the height is fixed.
- bool scrolling = static_cast<HTMLIFrameElement*>(node())->scrollingMode() != ScrollbarAlwaysOff;
- if (!scrolling && style()->height().isFixed())
- return;
- // Update the widget
- updateWidgetPosition();
-
- // Layout to get the content height
- view->layout();
-
- int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
- setHeight(max(width(), view->contentsHeight() + extraHeight));
-
- // Update one last time to ensure the dimensions.
- updateWidgetPosition();
- return;
-#endif
if (!flattenFrame())
return;
@@ -86,38 +62,6 @@ void RenderIFrame::computeLogicalHeight()
void RenderIFrame::computeLogicalWidth()
{
RenderPart::computeLogicalWidth();
-#ifdef ANDROID_FLATTEN_IFRAME
- if (!node()->hasTagName(iframeTag) || !widget() || !widget()->isFrameView())
- return;
- FrameView* view = static_cast<FrameView*>(widget());
- RenderView* root = static_cast<RenderView*>(view->frame()->contentRenderer());
- if (!root)
- return;
- // Do not expand if the scrollbars are suppressed and the width is fixed.
- bool scrolling = static_cast<HTMLIFrameElement*>(node())->scrollingMode() != ScrollbarAlwaysOff;
- if (!scrolling && style()->width().isFixed())
- return;
- // Update the dimensions to get the correct minimum preferred
- // width
- updateWidgetPosition();
-
- int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
- // Set the width
- setWidth(max(width(), root->minPreferredLogicalWidth()) + extraWidth);
-
- // Update based on the new width
- updateWidgetPosition();
-
- // Layout to get the content width
- view->layout();
-
- setWidth(max(width(), view->contentsWidth() + extraWidth));
-
- // Update one last time to ensure the dimensions.
- updateWidgetPosition();
- return;
-#endif
-
if (!flattenFrame())
return;
@@ -166,79 +110,6 @@ void RenderIFrame::layout()
RenderPart::computeLogicalWidth();
RenderPart::computeLogicalHeight();
-#ifdef ANDROID_FLATTEN_IFRAME
- // Calculate the styled dimensions by subtracting the border and padding.
- int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
- int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
- int styleWidth = width() - extraWidth;
- int styleHeight = height() - extraHeight;
- // Some IFrames have a width and/or height of 1 when they are meant to be
- // hidden. If that is the case, do not try to expand.
- if (node()->hasTagName(iframeTag) && widget() && widget()->isFrameView() &&
- styleWidth > 1 && styleHeight > 1) {
- HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node());
- bool scrolling = element->scrollingMode() != ScrollbarAlwaysOff;
- bool widthIsFixed = style()->width().isFixed();
- bool heightIsFixed = style()->height().isFixed();
- // If an iframe has a fixed dimension and suppresses scrollbars, it
- // will disrupt layout if we force it to expand. Plus on a desktop,
- // the extra content is not accessible.
- if (scrolling || !widthIsFixed || !heightIsFixed) {
- FrameView* view = static_cast<FrameView*>(widget());
- RenderView* root = view ? view->frame()->contentRenderer() : NULL;
- if (root && style()->visibility() != HIDDEN) {
- // Update the dimensions to get the correct minimum preferred
- // width
- updateWidgetPosition();
-
- // Use the preferred width if it is larger and only if
- // scrollbars are visible or the width style is not fixed.
- if (scrolling || !widthIsFixed)
- setWidth(max(width(), root->minPreferredLogicalWidth()) + extraWidth);
-
- // Resize the view to recalc the height.
- int h = height() - extraHeight;
- int w = width() - extraWidth;
- if (w > view->width())
- h = 0;
- if (w != view->width() || h != view->height()) {
- view->resize(w, h);
- }
-
- // Layout the view.
- view->layout();
-
- int contentHeight = view->contentsHeight();
- int contentWidth = view->contentsWidth();
- // Only change the width or height if scrollbars are visible or
- // if the style is not a fixed value. Use the maximum value so
- // that iframes never shrink.
- if (scrolling || !heightIsFixed)
- setHeight(max(height(), contentHeight + extraHeight));
- if (scrolling || !widthIsFixed)
- setWidth(max(width(), contentWidth + extraWidth));
-
- // Update one last time
- updateWidgetPosition();
-
- // Layout one more time to ensure all objects have the correct
- // height.
- view->layout();
-
-#if !ASSERT_DISABLED
- ASSERT(!view->layoutPending());
- ASSERT(!root->needsLayout());
- // Sanity check when assertions are enabled.
- RenderObject* c = root->nextInPreOrder();
- while (c) {
- ASSERT(!c->needsLayout());
- c = c->nextInPreOrder();
- }
-#endif
- }
- }
- }
-#endif
if (flattenFrame()) {
layoutWithFlattening(style()->width().isFixed(), style()->height().isFixed());
return;
diff --git a/WebCore/rendering/RenderView.h b/WebCore/rendering/RenderView.h
index 66b1d74..8436762 100644
--- a/WebCore/rendering/RenderView.h
+++ b/WebCore/rendering/RenderView.h
@@ -176,9 +176,6 @@ protected:
private:
bool shouldRepaint(const IntRect& r) const;
-#ifdef ANDROID_FLATTEN_FRAMESET
-public: // used by layout function
-#endif
int docHeight() const;
int docLeft() const;
int docWidth(int leftOverflow) const;
diff --git a/WebCore/rendering/RenderWidget.cpp b/WebCore/rendering/RenderWidget.cpp
index e5ccd05..6ea620f 100644
--- a/WebCore/rendering/RenderWidget.cpp
+++ b/WebCore/rendering/RenderWidget.cpp
@@ -345,7 +345,6 @@ void RenderWidget::updateWidgetPosition()
bool boundsChanged = setWidgetGeometry(IntRect(absPos.x(), absPos.y(), w, h));
-#ifndef ANDROID_FLATTEN_IFRAME
// if the frame bounds got changed, or if view needs layout (possibly indicating
// content size is wrong) we have to do a layout to set the right widget size
if (m_widget && m_widget->isFrameView()) {
@@ -354,7 +353,6 @@ void RenderWidget::updateWidgetPosition()
if ((boundsChanged || frameView->needsLayout()) && frameView->frame()->page())
frameView->layout();
}
-#endif
}
void RenderWidget::widgetPositionsUpdated()