summaryrefslogtreecommitdiffstats
path: root/WebCore/rendering/RenderPartObject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/rendering/RenderPartObject.cpp')
-rw-r--r--WebCore/rendering/RenderPartObject.cpp109
1 files changed, 63 insertions, 46 deletions
diff --git a/WebCore/rendering/RenderPartObject.cpp b/WebCore/rendering/RenderPartObject.cpp
index b020ef6..5f6d903 100644
--- a/WebCore/rendering/RenderPartObject.cpp
+++ b/WebCore/rendering/RenderPartObject.cpp
@@ -352,46 +352,58 @@ void RenderPartObject::layout()
RenderPart::calcWidth();
RenderPart::calcHeight();
// Some IFrames have a width and/or height of 1 when they are meant to be
- // hidden. If that is the case, don't try to expand.
- int w = width();
- int h = height();
- if (widget() && widget()->isFrameView() &&
- w > 1 && h > 1) {
- 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) {
- // Update the dimensions to get the correct minimum preferred width
- updateWidgetPosition();
-
- int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
- int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
- // Use the preferred width if it is larger.
- setWidth(max(w, root->minPrefWidth()) + extraWidth);
-
- // Resize the view to recalc the height.
- int height = h - extraHeight;
- int width = w - extraWidth;
- if (width > view->width())
- height = 0;
- if (width != view->width() || height != view->height()) {
- view->resize(width, height);
- root->setNeedsLayout(true, false);
+ // hidden. If that is the case, do not try to expand.
+ if (node()->hasTagName(iframeTag) && widget() && widget()->isFrameView()
+ && width() > 1 && height() > 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;
+ RenderPart* owner = view->frame()->ownerRenderer();
+ if (root && style()->visibility() != HIDDEN
+ && (!owner || owner->style()->visibility() != HIDDEN)) {
+ // Update the dimensions to get the correct minimum preferred
+ // width
+ updateWidgetPosition();
+
+ int extraWidth = paddingLeft() + paddingRight() + borderLeft() + borderRight();
+ int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
+ // 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->minPrefWidth()) + 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);
+ root->setNeedsLayout(true, false);
+ }
+ // Layout the view.
+ if (view->needsLayout())
+ 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 the view.
- if (view->needsLayout())
- view->layout();
- int contentHeight = view->contentsHeight();
- int contentWidth = view->contentsWidth();
- // Do not shrink iframes with a specified height.
- if (contentHeight > (h - extraHeight) || style()->height().isAuto())
- setHeight(contentHeight + extraHeight);
- setWidth(contentWidth + extraWidth);
-
- // Update one last time
- updateWidgetPosition();
}
}
#else
@@ -412,12 +424,16 @@ void RenderPartObject::layout()
#ifdef FLATTEN_IFRAME
void RenderPartObject::calcWidth() {
RenderPart::calcWidth();
- if (!widget() || !widget()->isFrameView())
+ 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();
@@ -433,7 +449,7 @@ void RenderPartObject::calcWidth() {
while (view->needsLayout())
view->layout();
- setWidth(view->contentsWidth() + extraWidth);
+ setWidth(max(width(), view->contentsWidth() + extraWidth));
// Update one last time to ensure the dimensions.
updateWidgetPosition();
@@ -441,12 +457,16 @@ void RenderPartObject::calcWidth() {
void RenderPartObject::calcHeight() {
RenderPart::calcHeight();
- if (!widget() || !widget()->isFrameView())
+ 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();
@@ -454,11 +474,8 @@ void RenderPartObject::calcHeight() {
while (view->needsLayout())
view->layout();
- // Do not shrink the height if the size is specified
- int h = view->contentsHeight();
int extraHeight = paddingTop() + paddingBottom() + borderTop() + borderBottom();
- if (h > height() - extraHeight || style()->height().isAuto())
- setHeight(h + extraHeight);
+ setHeight(max(width(), view->contentsHeight() + extraHeight));
// Update one last time to ensure the dimensions.
updateWidgetPosition();