1dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block/* 2dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Copyright (C) 2010 Apple Inc. All rights reserved. 3dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 4dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * Redistribution and use in source and binary forms, with or without 5dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * modification, are permitted provided that the following conditions 6dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * are met: 7dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 1. Redistributions of source code must retain the above copyright 8dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer. 9dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 2. Redistributions in binary form must reproduce the above copyright 10dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * notice, this list of conditions and the following disclaimer in the 11dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * documentation and/or other materials provided with the distribution. 12dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * 13dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block */ 25dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 26dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "config.h" 27dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderIFrame.h" 28dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 29dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FrameView.h" 30545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include "HTMLNames.h" 31dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "HTMLIFrameElement.h" 32dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "RenderView.h" 33dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "Settings.h" 34dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 35dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blocknamespace WebCore { 36dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 37dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockusing namespace HTMLNames; 38dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 39dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve BlockRenderIFrame::RenderIFrame(Element* element) 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block : RenderFrameBase(element) 41dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 42dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 43dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderIFrame::computeLogicalHeight() 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 46e1a0cd8247467a70fed9f6099fc9c65ec35ae23eKristian Monsen RenderPart::computeLogicalHeight(); 47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!flattenFrame()) 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node()); 51dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isScrollable = frame->scrollingMode() != ScrollbarAlwaysOff; 52dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 53dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (isScrollable || !style()->height().isFixed()) { 54dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block FrameView* view = static_cast<FrameView*>(widget()); 5521939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!view) 5621939df44de1705786c545cd1bf519d47250322dBen Murdoch return; 57dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int border = borderTop() + borderBottom(); 58dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block setHeight(max(height(), view->contentsHeight() + border)); 59dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 60dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 61dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 62bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenvoid RenderIFrame::computeLogicalWidth() 63dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 64e1a0cd8247467a70fed9f6099fc9c65ec35ae23eKristian Monsen RenderPart::computeLogicalWidth(); 65dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!flattenFrame()) 66dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 67dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 68dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node()); 69dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isScrollable = frame->scrollingMode() != ScrollbarAlwaysOff; 70dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 71dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (isScrollable || !style()->width().isFixed()) { 72dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block FrameView* view = static_cast<FrameView*>(widget()); 7321939df44de1705786c545cd1bf519d47250322dBen Murdoch if (!view) 7421939df44de1705786c545cd1bf519d47250322dBen Murdoch return; 75dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block int border = borderLeft() + borderRight(); 76dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block setWidth(max(width(), view->contentsWidth() + border)); 77dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 78dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 79dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 80dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockbool RenderIFrame::flattenFrame() 81dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 82dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!node() || !node()->hasTagName(iframeTag)) 83dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 84dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 85dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node()); 86dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff; 87dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 88dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!isScrollable && style()->width().isFixed() 89dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && style()->height().isFixed()) 90dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 91dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 92dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block Frame* frame = element->document()->frame(); 93dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block bool enabled = frame && frame->settings()->frameFlatteningEnabled(); 94dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 95dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!enabled || !frame->page()) 96dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 97dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 98dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block FrameView* view = frame->page()->mainFrame()->view(); 99dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (!view) 100dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return false; 101dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 102dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block // Do not flatten offscreen inner frames during frame flattening. 103dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return absoluteBoundingBoxRect().intersects(IntRect(IntPoint(0, 0), view->contentsSize())); 104dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 105dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 106dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Blockvoid RenderIFrame::layout() 107dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block{ 108dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block ASSERT(needsLayout()); 109dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RenderPart::computeLogicalWidth(); 111bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RenderPart::computeLogicalHeight(); 112dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 113dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block if (flattenFrame()) { 114dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block layoutWithFlattening(style()->width().isFixed(), style()->height().isFixed()); 115dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block return; 116dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block } 117dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 118dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block RenderPart::layout(); 119dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 120dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block m_overflow.clear(); 121dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block addShadowOverflow(); 122f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch updateLayerTransform(); 123dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 124dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block setNeedsLayout(false); 125dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 126dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block 127dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block} 128