Index: trunk/Source/core/rendering/RenderIFrame.cpp |
=================================================================== |
--- trunk/Source/core/rendering/RenderIFrame.cpp (revision 148648) |
+++ trunk/Source/core/rendering/RenderIFrame.cpp (working copy) |
@@ -37,9 +37,9 @@ |
namespace WebCore { |
using namespace HTMLNames; |
- |
+ |
RenderIFrame::RenderIFrame(Element* element) |
- : RenderPart(element) |
+ : RenderFrameBase(element) |
{ |
} |
@@ -57,7 +57,7 @@ |
LayoutUnit RenderIFrame::minPreferredLogicalWidth() const |
{ |
if (!isSeamless()) |
- return RenderPart::minPreferredLogicalWidth(); |
+ return RenderFrameBase::minPreferredLogicalWidth(); |
RenderView* childRoot = contentRootRenderer(); |
if (!childRoot) |
@@ -69,7 +69,7 @@ |
LayoutUnit RenderIFrame::maxPreferredLogicalWidth() const |
{ |
if (!isSeamless()) |
- return RenderPart::maxPreferredLogicalWidth(); |
+ return RenderFrameBase::maxPreferredLogicalWidth(); |
RenderView* childRoot = contentRootRenderer(); |
if (!childRoot) |
@@ -85,7 +85,7 @@ |
bool RenderIFrame::requiresLayer() const |
{ |
- return RenderPart::requiresLayer() || style()->resize() != RESIZE_NONE; |
+ return RenderFrameBase::requiresLayer() || style()->resize() != RESIZE_NONE; |
} |
RenderView* RenderIFrame::contentRootRenderer() const |
@@ -96,6 +96,35 @@ |
return childFrameView ? childFrameView->frame()->contentRenderer() : 0; |
} |
+bool RenderIFrame::flattenFrame() const |
+{ |
+ if (!node() || !node()->hasTagName(iframeTag)) |
+ return false; |
+ |
+ HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node()); |
+ Frame* frame = element->document()->frame(); |
+ |
+ if (isSeamless()) |
+ return false; // Seamless iframes are already "flat", don't try to flatten them. |
+ |
+ bool enabled = frame && frame->settings() && frame->settings()->frameFlatteningEnabled(); |
+ |
+ if (!enabled || !frame->page()) |
+ return false; |
+ |
+ if (style()->width().isFixed() && style()->height().isFixed()) { |
+ // Do not flatten iframes with scrolling="no". |
+ if (element->scrollingMode() == ScrollbarAlwaysOff) |
+ return false; |
+ if (style()->width().value() <= 0 || style()->height().value() <= 0) |
+ return false; |
+ } |
+ |
+ // Do not flatten offscreen inner frames during frame flattening, as flattening might make them visible. |
+ IntRect boundingRect = absoluteBoundingBoxRectIgnoringTransforms(); |
+ return boundingRect.maxX() > 0 && boundingRect.maxY() > 0; |
+} |
+ |
void RenderIFrame::layoutSeamlessly() |
{ |
updateLogicalWidth(); |
@@ -133,6 +162,9 @@ |
updateLogicalWidth(); |
// No kids to layout as a replaced element. |
updateLogicalHeight(); |
+ |
+ if (flattenFrame()) |
+ layoutWithFlattening(style()->width().isFixed(), style()->height().isFixed()); |
} |
m_overflow.clear(); |