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