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; }
bool RenderIFrame::flattenFrame() { if (!node() || !node()->hasTagName(iframeTag)) return false; HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node()); bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff; if (style()->width().isFixed() && style()->height().isFixed()) { if (!isScrollable) return false; if (style()->width().value() <= 0 || style()->height().value() <= 0) return false; } Frame* frame = element->document()->frame(); bool enabled = frame && frame->settings()->frameFlatteningEnabled(); if (!enabled || !frame->page()) return false; FrameView* view = frame->page()->mainFrame()->view(); if (!view) return false; // Do not flatten offscreen inner frames during frame flattening. return absoluteBoundingBoxRect().intersects(IntRect(IntPoint(0, 0), view->contentsSize())); }
bool RenderIFrame::flattenFrame() { if (!node() || !node()->hasTagName(iframeTag)) return false; HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node()); bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff; if (style()->width().isFixed() && style()->height().isFixed()) { if (!isScrollable) return false; if (style()->width().value() <= 0 || style()->height().value() <= 0) return false; } Frame* frame = element->document()->frame(); bool enabled = frame && frame->settings()->frameFlatteningEnabled(); if (!enabled || !frame->page()) return false; FrameView* view = frame->page()->mainFrame()->view(); if (!view) return false; // Do not flatten offscreen inner frames during frame flattening, as flattening might make them visible. IntRect boundingRect = absoluteBoundingBoxRect(); return boundingRect.maxX() > 0 && boundingRect.maxY() > 0; }
bool RenderIFrame::flattenFrame() { if (!node() || !node()->hasTagName(iframeTag)) return false; // CAPPFIX_WEB_HTML5: SECURITY if (isSeamless()) return false; // Seamless iframes are already "flat", don't try to flatten them. // CAPPFIX_WEB_HTML5_END HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node()); bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff; if (!isScrollable && style()->width().isFixed() && style()->height().isFixed()) return false; Frame* frame = element->document()->frame(); bool enabled = frame && frame->settings()->frameFlatteningEnabled(); if (!enabled || !frame->page()) return false; FrameView* view = frame->page()->mainFrame()->view(); if (!view) return false; // Do not flatten offscreen inner frames during frame flattening. return absoluteBoundingBoxRect().intersects(IntRect(IntPoint(0, 0), view->contentsSize())); }
void RenderPartObject::calcWidth() { RenderPart::calcWidth(); if (!flattenFrame()) return; HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node()); bool isScrollable = frame->scrollingMode() != ScrollbarAlwaysOff; if (isScrollable || !style()->width().isFixed()) { FrameView* view = static_cast<FrameView*>(widget()); int border = borderLeft() + borderRight(); setWidth(max(width(), view->contentsWidth() + border)); } }
void RenderIFrame::computeLogicalHeight() { RenderPart::computeLogicalHeight(); if (!flattenFrame()) return; HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node()); bool isScrollable = frame->scrollingMode() != ScrollbarAlwaysOff; if (isScrollable || !style()->height().isFixed()) { FrameView* view = static_cast<FrameView*>(widget()); if (!view) return; int border = borderTop() + borderBottom(); setHeight(max(height(), view->contentsHeight() + border)); } }
void RenderIFrame::computeLogicalWidth() { // CAPPFIX_WEB_HTML5: SECURITY // When we're seamless, we behave like a block. Thankfully RenderBox has all the right logic for this. if (isSeamless()) return RenderBox::computeLogicalWidth(); // CAPPFIX_WEB_HTML5_END RenderPart::computeLogicalWidth(); if (!flattenFrame()) return; HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node()); bool isScrollable = frame->scrollingMode() != ScrollbarAlwaysOff; if (isScrollable || !style()->width().isFixed()) { FrameView* view = static_cast<FrameView*>(widget()); if (!view) return; int border = borderLeft() + borderRight(); setWidth(max(width(), view->contentsWidth() + border)); } }
void RenderPartObject::layout() { ASSERT(needsLayout()); #ifdef FLATTEN_IFRAME RenderPart::calcWidth(); RenderPart::calcHeight(); // 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->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); } // Layout the view. //SAMSUNG CHANGE >> // Browser freeze issue in http://www.enuri.com/ /* do { view->layout(); } while (view->layoutPending() || root->needsLayout()); */ node()->document()->page()->mainFrame()->view()->layoutIfNeededRecursive(); //SAMSUNG CHANGE << 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 } } } #else calcWidth(); calcHeight(); #endif RenderPart::layout(); m_overflow.clear(); addShadowOverflow(); setNeedsLayout(false); }