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