WebCore/Android.mk

@@LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
573573 rendering/RenderFlexibleBox.cpp \
574574 rendering/RenderForeignObject.cpp \
575575 rendering/RenderFrame.cpp \
 576 rendering/RenderFrameBase.cpp \
576577 rendering/RenderFrameSet.cpp \
577578 rendering/RenderHTMLCanvas.cpp \
 579 rendering/RenderIFrame.cpp \
578580 rendering/RenderImage.cpp \
579581 rendering/RenderImageGeneratedContent.cpp \
580582 rendering/RenderInline.cpp \

WebCore/ChangeLog

 12010-04-19 Simon Fraser <simon.fraser@apple.com>
 2
 3 Reviewed by NOBODY (OOPS!).
 4
 5 Clean up RenderPart/RenderPartObject/RenderFrame/RenderEmbeddedObject
 6 https://bugs.webkit.org/show_bug.cgi?id=37741
 7
 8 Add a new renderer for iframes, named RenderIFrame. Add a new shared base class
 9 between this and RenderFrame, called RenderFrameBase (following the existing HTMLFrameElementBase),
 10 and move code from RenderPart and RenderPartObject into these new classes.
 11
 12 There should be no functionality difference with this change, so no new tests.
 13
 14 Fixing up renderer names in the layout tests will be done in a later pass.
 15
 16 Fix build systems to include the new files.
 17
 18 * Android.mk:
 19 * GNUmakefile.am:
 20 * WebCore.gypi:
 21 * WebCore.pro:
 22 * WebCore.vcproj/WebCore.vcproj:
 23 * WebCore.xcodeproj/project.pbxproj:
 24 * html/HTMLIFrameElement.cpp:
 25 (WebCore::HTMLIFrameElement::createRenderer):
 26 * rendering/RenderEmbeddedObject.h:
 27 * rendering/RenderFrame.cpp:
 28 (WebCore::RenderFrame::RenderFrame):
 29 * rendering/RenderFrame.h:
 30 * rendering/RenderFrameBase.cpp: Added.
 31 (WebCore::RenderFrameBase::RenderFrameBase):
 32 (WebCore::RenderFrameBase::~RenderFrameBase):
 33 (WebCore::RenderFrameBase::layoutWithFlattening):
 34 * rendering/RenderFrameBase.h: Added.
 35 * rendering/RenderIFrame.cpp: Added.
 36 (WebCore::RenderIFrame::RenderIFrame):
 37 (WebCore::RenderIFrame::~RenderIFrame):
 38 (WebCore::RenderIFrame::calcHeight):
 39 (WebCore::RenderIFrame::calcWidth):
 40 (WebCore::RenderIFrame::flattenFrame):
 41 (WebCore::RenderIFrame::layout):
 42 * rendering/RenderIFrame.h: Added.
 43 (WebCore::RenderIFrame::renderName):
 44 * rendering/RenderPart.cpp:
 45 * rendering/RenderPart.h:
 46 * rendering/RenderPartObject.cpp:
 47 * rendering/RenderPartObject.h:
 48
1492010-04-19 Yury Semikhatsky <yurys@chromium.org>
250
351 Unreviewed. Chromium build fix.

WebCore/GNUmakefile.am

@@webcore_sources += \
18481848 WebCore/rendering/RenderFlexibleBox.h \
18491849 WebCore/rendering/RenderFrame.cpp \
18501850 WebCore/rendering/RenderFrame.h \
 1851 WebCore/rendering/RenderFrameBase.cpp \
 1852 WebCore/rendering/RenderFrameBase.h \
18511853 WebCore/rendering/RenderFrameSet.cpp \
18521854 WebCore/rendering/RenderFrameSet.h \
18531855 WebCore/rendering/RenderHTMLCanvas.cpp \
18541856 WebCore/rendering/RenderHTMLCanvas.h \
 1857 WebCore/rendering/RenderIFrame.cpp \
 1858 WebCore/rendering/RenderIFrame.h \
18551859 WebCore/rendering/RenderImage.cpp \
18561860 WebCore/rendering/RenderImage.h \
18571861 WebCore/rendering/RenderImageGeneratedContent.cpp \

WebCore/WebCore.gypi

30963096 'rendering/RenderForeignObject.h',
30973097 'rendering/RenderFrame.cpp',
30983098 'rendering/RenderFrame.h',
 3099 'rendering/RenderFrameBase.cpp',
 3100 'rendering/RenderFrameBase.h',
30993101 'rendering/RenderFrameSet.cpp',
31003102 'rendering/RenderFrameSet.h',
31013103 'rendering/RenderHTMLCanvas.cpp',
31023104 'rendering/RenderHTMLCanvas.h',
 3105 'rendering/RenderIFrame.cpp',
 3106 'rendering/RenderIFrame.h',
31033107 'rendering/RenderImage.cpp',
31043108 'rendering/RenderImage.h',
31053109 'rendering/RenderImageGeneratedContent.cpp',

WebCore/WebCore.pro

@@SOURCES += \
924924 rendering/RenderFileUploadControl.cpp \
925925 rendering/RenderFlexibleBox.cpp \
926926 rendering/RenderFrame.cpp \
 927 rendering/RenderFrameBase.cpp \
927928 rendering/RenderFrameSet.cpp \
928929 rendering/RenderHTMLCanvas.cpp \
 930 rendering/RenderIFrame.cpp \
929931 rendering/RenderImage.cpp \
930932 rendering/RenderImageGeneratedContent.cpp \
931933 rendering/RenderInline.cpp \

@@HEADERS += \
16901692 rendering/RenderFlexibleBox.h \
16911693 rendering/RenderForeignObject.h \
16921694 rendering/RenderFrame.h \
 1695 rendering/RenderFrameBase.h \
16931696 rendering/RenderFrameSet.h \
16941697 rendering/RenderHTMLCanvas.h \
 1698 rendering/RenderIFrame.h \
16951699 rendering/RenderImageGeneratedContent.h \
16961700 rendering/RenderImage.h \
16971701 rendering/RenderInline.h \

WebCore/WebCore.vcproj/WebCore.vcproj

2755327553 >
2755427554 </File>
2755527555 <File
 27556 RelativePath="..\rendering\RenderFrameBase.cpp"
 27557 >
 27558 </File>
 27559 <File
 27560 RelativePath="..\rendering\RenderFrameBase.h"
 27561 >
 27562 </File>
 27563 <File
2755627564 RelativePath="..\rendering\RenderFrameSet.cpp"
2755727565 >
2755827566 </File>

2756927577 >
2757027578 </File>
2757127579 <File
 27580 RelativePath="..\rendering\RenderIFrame.cpp"
 27581 >
 27582 </File>
 27583 <File
 27584 RelativePath="..\rendering\RenderIFrame.h"
 27585 >
 27586 </File>
 27587 <File
2757227588 RelativePath="..\rendering\RenderImage.cpp"
2757327589 >
2757427590 </File>

WebCore/WebCore.xcodeproj/project.pbxproj

202202 0FCF332D0F2B9A25004B6795 /* WebTiledLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FCF33290F2B9A25004B6795 /* WebTiledLayer.h */; };
203203 0FCF332E0F2B9A25004B6795 /* WebLayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0FCF332A0F2B9A25004B6795 /* WebLayer.mm */; };
204204 0FCF332F0F2B9A25004B6795 /* WebLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FCF332B0F2B9A25004B6795 /* WebLayer.h */; };
 205 0FD3080E117CF7E700A791F7 /* RenderFrameBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FD3080C117CF7E700A791F7 /* RenderFrameBase.cpp */; };
 206 0FD3080F117CF7E700A791F7 /* RenderFrameBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD3080D117CF7E700A791F7 /* RenderFrameBase.h */; };
 207 0FD308D5117D168500A791F7 /* RenderIFrame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FD308D3117D168400A791F7 /* RenderIFrame.cpp */; };
 208 0FD308D6117D168500A791F7 /* RenderIFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD308D4117D168400A791F7 /* RenderIFrame.h */; };
205209 0FD723820EC8BD9300CA5DD7 /* FloatQuad.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FD723800EC8BD9300CA5DD7 /* FloatQuad.h */; settings = {ATTRIBUTES = (Private, ); }; };
206210 0FD723830EC8BD9300CA5DD7 /* FloatQuad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0FD723810EC8BD9300CA5DD7 /* FloatQuad.cpp */; };
207211 0FF5025B102BA9010066F39A /* DOMMedia.h in Headers */ = {isa = PBXBuildFile; fileRef = 0FF50259102BA9010066F39A /* DOMMedia.h */; };

55755579 0FCF33290F2B9A25004B6795 /* WebTiledLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebTiledLayer.h; sourceTree = "<group>"; };
55765580 0FCF332A0F2B9A25004B6795 /* WebLayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebLayer.mm; sourceTree = "<group>"; };
55775581 0FCF332B0F2B9A25004B6795 /* WebLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebLayer.h; sourceTree = "<group>"; };
 5582 0FD3080C117CF7E700A791F7 /* RenderFrameBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderFrameBase.cpp; sourceTree = "<group>"; };
 5583 0FD3080D117CF7E700A791F7 /* RenderFrameBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderFrameBase.h; sourceTree = "<group>"; };
 5584 0FD308D3117D168400A791F7 /* RenderIFrame.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderIFrame.cpp; sourceTree = "<group>"; };
 5585 0FD308D4117D168400A791F7 /* RenderIFrame.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderIFrame.h; sourceTree = "<group>"; };
55785586 0FD723800EC8BD9300CA5DD7 /* FloatQuad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FloatQuad.h; sourceTree = "<group>"; };
55795587 0FD723810EC8BD9300CA5DD7 /* FloatQuad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FloatQuad.cpp; sourceTree = "<group>"; };
55805588 0FF50259102BA9010066F39A /* DOMMedia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMMedia.h; sourceTree = "<group>"; };

1589215900 853CA9EB0AEEC63C002372DC /* RenderForeignObject.h */,
1589315901 A871DECC0A1530C700B12A68 /* RenderFrame.cpp */,
1589415902 A871DECB0A1530C700B12A68 /* RenderFrame.h */,
 15903 0FD3080C117CF7E700A791F7 /* RenderFrameBase.cpp */,
 15904 0FD3080D117CF7E700A791F7 /* RenderFrameBase.h */,
1589515905 A871DECA0A1530C700B12A68 /* RenderFrameSet.cpp */,
1589615906 A871DEC90A1530C700B12A68 /* RenderFrameSet.h */,
1589715907 BCEA482A097D93020094C9E4 /* RenderHTMLCanvas.cpp */,
1589815908 BCEA482B097D93020094C9E4 /* RenderHTMLCanvas.h */,
 15909 0FD308D3117D168400A791F7 /* RenderIFrame.cpp */,
 15910 0FD308D4117D168400A791F7 /* RenderIFrame.h */,
1589915911 BCEA4836097D93020094C9E4 /* RenderImage.cpp */,
1590015912 BCEA4837097D93020094C9E4 /* RenderImage.h */,
1590115913 BCB4F8920DB28E530039139B /* RenderImageGeneratedContent.cpp */,

1886518877 895253DD116C4EF500CABF00 /* FileStreamProxy.h in Headers */,
1886618878 895253DF116C4F0600CABF00 /* FileThreadTask.h in Headers */,
1886718879 CEF418CF1179678C009D112C /* ViewportArguments.h in Headers */,
 18880 0FD3080F117CF7E700A791F7 /* RenderFrameBase.h in Headers */,
 18881 0FD308D6117D168500A791F7 /* RenderIFrame.h in Headers */,
1886818882 );
1886918883 runOnlyForDeploymentPostprocessing = 0;
1887018884 };

2110121115 9FA37EFC1172FDA600C4CD55 /* JSScriptProfileNode.cpp in Sources */,
2110221116 895253DC116C4EF500CABF00 /* FileStreamProxy.cpp in Sources */,
2110321117 CEF418CE1179678C009D112C /* ViewportArguments.cpp in Sources */,
 21118 0FD3080E117CF7E700A791F7 /* RenderFrameBase.cpp in Sources */,
 21119 0FD308D5117D168500A791F7 /* RenderIFrame.cpp in Sources */,
2110421120 );
2110521121 runOnlyForDeploymentPostprocessing = 0;
2110621122 };

WebCore/html/HTMLIFrameElement.cpp

3030#include "HTMLDocument.h"
3131#include "HTMLNames.h"
3232#include "MappedAttribute.h"
33 #include "RenderPartObject.h"
 33#include "RenderIFrame.h"
3434
3535namespace WebCore {
3636

@@bool HTMLIFrameElement::rendererIsNeeded(RenderStyle* style)
143143
144144RenderObject* HTMLIFrameElement::createRenderer(RenderArena* arena, RenderStyle*)
145145{
146  return new (arena) RenderPartObject(this);
 146 return new (arena) RenderIFrame(this);
147147}
148148
149149void HTMLIFrameElement::insertedIntoDocument()

WebCore/rendering/RenderEmbeddedObject.h

2727
2828namespace WebCore {
2929
30 // Renderer for embeds and objects.
 30// Renderer for embeds and objects (whose content may not necessarily be rendered via a plug-in, e.g. <embed src="foo.html>).
3131class RenderEmbeddedObject : public RenderPartObject {
3232public:
3333 RenderEmbeddedObject(Element*);

WebCore/rendering/RenderFrame.cpp

3131namespace WebCore {
3232
3333RenderFrame::RenderFrame(HTMLFrameElement* frame)
34  : RenderPart(frame)
 34 : RenderFrameBase(frame)
3535{
3636 setInline(false);
3737}

WebCore/rendering/RenderFrame.h

2323#ifndef RenderFrame_h
2424#define RenderFrame_h
2525
26 #include "RenderPart.h"
 26#include "RenderFrameBase.h"
2727#include "RenderFrameSet.h"
2828
2929namespace WebCore {
3030
3131class HTMLFrameElement;
3232
33 class RenderFrame : public RenderPart {
 33class RenderFrame : public RenderFrameBase {
3434public:
3535 RenderFrame(HTMLFrameElement*);
3636

WebCore/rendering/RenderFrameBase.cpp

 1/*
 2 * Copyright (C) 2010 Apple Computer, 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 "RenderFrameBase.h"
 28
 29#include "FrameView.h"
 30#include "HTMLFrameElementBase.h"
 31#include "RenderView.h"
 32
 33namespace WebCore {
 34
 35using namespace HTMLNames;
 36
 37RenderFrameBase::RenderFrameBase(Element* element)
 38 : RenderPart(element)
 39{
 40}
 41
 42RenderFrameBase::~RenderFrameBase()
 43{
 44}
 45
 46void RenderFrameBase::layoutWithFlattening(bool fixedWidth, bool fixedHeight)
 47{
 48 FrameView* childFrameView = static_cast<FrameView*>(widget());
 49 RenderView* childRoot = childFrameView ? static_cast<RenderView*>(childFrameView->frame()->contentRenderer()) : 0;
 50
 51 // Do not expand frames which has zero width or height
 52 if (!width() || !height() || !childRoot) {
 53 updateWidgetPosition();
 54 if (childFrameView)
 55 childFrameView->layout();
 56 setNeedsLayout(false);
 57 return;
 58 }
 59
 60 // need to update to calculate min/max correctly
 61 updateWidgetPosition();
 62 if (childRoot->prefWidthsDirty())
 63 childRoot->calcPrefWidths();
 64
 65 // if scrollbars are off, and the width or height are fixed
 66 // we obey them and do not expand. With frame flattening
 67 // no subframe much ever become scrollable.
 68
 69 HTMLFrameElementBase* element = static_cast<HTMLFrameElementBase*>(node());
 70 bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff;
 71
 72 // consider iframe inset border
 73 int hBorder = borderLeft() + borderRight();
 74 int vBorder = borderTop() + borderBottom();
 75
 76 // make sure minimum preferred width is enforced
 77 if (isScrollable || !fixedWidth) {
 78 setWidth(max(width(), childRoot->minPrefWidth() + hBorder));
 79 // update again to pass the new width to the child frame
 80 updateWidgetPosition();
 81 childFrameView->layout();
 82 }
 83
 84 // expand the frame by setting frame height = content height
 85 if (isScrollable || !fixedHeight || childRoot->isFrameSet())
 86 setHeight(max(height(), childFrameView->contentsHeight() + vBorder));
 87 if (isScrollable || !fixedWidth || childRoot->isFrameSet())
 88 setWidth(max(width(), childFrameView->contentsWidth() + hBorder));
 89
 90 updateWidgetPosition();
 91
 92 ASSERT(!childFrameView->layoutPending());
 93 ASSERT(!childRoot->needsLayout());
 94 ASSERT(!childRoot->firstChild() || !childRoot->firstChild()->firstChild() || !childRoot->firstChild()->firstChild()->needsLayout());
 95
 96 setNeedsLayout(false);
 97}
 98
 99}

WebCore/rendering/RenderFrameBase.h

 1/*
 2 * Copyright (C) 2010 Apple Computer, 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#ifndef RenderFrameBase_h
 27#define RenderFrameBase_h
 28
 29#include "RenderPartObject.h"
 30
 31namespace WebCore {
 32
 33// Base class for RenderFrame and RenderIFrame
 34class RenderFrameBase : public RenderPart {
 35public:
 36 RenderFrameBase(Element*);
 37 virtual ~RenderFrameBase();
 38
 39 void layoutWithFlattening(bool fixedWidth, bool fixedHeight);
 40};
 41
 42} // namespace WebCore
 43
 44#endif // RenderFrameBase_h

WebCore/rendering/RenderIFrame.cpp

 1/*
 2 * Copyright (C) 2010 Apple Computer, 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 "HTMLIFrameElement.h"
 31#include "RenderView.h"
 32#include "Settings.h"
 33
 34namespace WebCore {
 35
 36using namespace HTMLNames;
 37
 38RenderIFrame::RenderIFrame(Element* element)
 39 : RenderFrameBase(element)
 40{
 41}
 42
 43RenderIFrame::~RenderIFrame()
 44{
 45}
 46
 47void RenderIFrame::calcHeight()
 48{
 49 RenderPart::calcHeight();
 50 if (!flattenFrame())
 51 return;
 52
 53 HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node());
 54 bool isScrollable = frame->scrollingMode() != ScrollbarAlwaysOff;
 55
 56 if (isScrollable || !style()->height().isFixed()) {
 57 FrameView* view = static_cast<FrameView*>(widget());
 58 int border = borderTop() + borderBottom();
 59 setHeight(max(height(), view->contentsHeight() + border));
 60 }
 61}
 62
 63void RenderIFrame::calcWidth()
 64{
 65 RenderPart::calcWidth();
 66 if (!flattenFrame())
 67 return;
 68
 69 HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node());
 70 bool isScrollable = frame->scrollingMode() != ScrollbarAlwaysOff;
 71
 72 if (isScrollable || !style()->width().isFixed()) {
 73 FrameView* view = static_cast<FrameView*>(widget());
 74 int border = borderLeft() + borderRight();
 75 setWidth(max(width(), view->contentsWidth() + border));
 76 }
 77}
 78
 79bool RenderIFrame::flattenFrame()
 80{
 81 if (!node() || !node()->hasTagName(iframeTag))
 82 return false;
 83
 84 HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node());
 85 bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff;
 86
 87 if (!isScrollable && style()->width().isFixed()
 88 && style()->height().isFixed())
 89 return false;
 90
 91 Frame* frame = element->document()->frame();
 92 bool enabled = frame && frame->settings()->frameFlatteningEnabled();
 93
 94 if (!enabled || !frame->page())
 95 return false;
 96
 97 FrameView* view = frame->page()->mainFrame()->view();
 98 if (!view)
 99 return false;
 100
 101 // Do not flatten offscreen inner frames during frame flattening.
 102 return absoluteBoundingBoxRect().intersects(IntRect(IntPoint(0, 0), view->contentsSize()));
 103}
 104
 105void RenderIFrame::layout()
 106{
 107 ASSERT(needsLayout());
 108
 109 RenderPart::calcWidth();
 110 RenderPart::calcHeight();
 111
 112 if (flattenFrame()) {
 113 layoutWithFlattening(style()->width().isFixed(), style()->height().isFixed());
 114 return;
 115 }
 116
 117 RenderPart::layout();
 118
 119 m_overflow.clear();
 120 addShadowOverflow();
 121
 122 setNeedsLayout(false);
 123}
 124
 125}

WebCore/rendering/RenderIFrame.h

 1/*
 2 * Copyright (C) 2010 Apple Computer, 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#ifndef RenderIFrame_h
 27#define RenderIFrame_h
 28
 29#include "RenderFrameBase.h"
 30
 31namespace WebCore {
 32
 33// Base class for RenderFrame and RenderIFrame
 34class RenderIFrame : public RenderFrameBase {
 35public:
 36 RenderIFrame(Element*);
 37 virtual ~RenderIFrame();
 38
 39 virtual void calcHeight();
 40 virtual void calcWidth();
 41
 42 virtual void layout();
 43
 44private:
 45 virtual const char* renderName() const { return "RenderPartObject"; } // Lying for now to avoid breaking tests
 46
 47 bool flattenFrame();
 48
 49};
 50
 51} // namespace WebCore
 52
 53#endif // RenderIFrame_h

WebCore/rendering/RenderPart.cpp

@@void RenderPart::setWidget(PassRefPtr<Widget> widget)
5656 viewCleared();
5757}
5858
59 void RenderPart::layoutWithFlattening(bool fixedWidth, bool fixedHeight)
60 {
61  FrameView* childFrameView = static_cast<FrameView*>(widget());
62  RenderView* childRoot = childFrameView ? static_cast<RenderView*>(childFrameView->frame()->contentRenderer()) : 0;
63 
64  // Do not expand frames which has zero width or height
65  if (!width() || !height() || !childRoot) {
66  updateWidgetPosition();
67  if (childFrameView)
68  childFrameView->layout();
69  setNeedsLayout(false);
70  return;
71  }
72 
73  // need to update to calculate min/max correctly
74  updateWidgetPosition();
75  if (childRoot->prefWidthsDirty())
76  childRoot->calcPrefWidths();
77 
78  // if scrollbars are off, and the width or height are fixed
79  // we obey them and do not expand. With frame flattening
80  // no subframe much ever become scrollable.
81 
82  HTMLFrameElementBase* element = static_cast<HTMLFrameElementBase*>(node());
83  bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff;
84 
85  // consider iframe inset border
86  int hBorder = borderLeft() + borderRight();
87  int vBorder = borderTop() + borderBottom();
88 
89  // make sure minimum preferred width is enforced
90  if (isScrollable || !fixedWidth) {
91  setWidth(max(width(), childRoot->minPrefWidth() + hBorder));
92  // update again to pass the new width to the child frame
93  updateWidgetPosition();
94  childFrameView->layout();
95  }
96 
97  // expand the frame by setting frame height = content height
98  if (isScrollable || !fixedHeight || childRoot->isFrameSet())
99  setHeight(max(height(), childFrameView->contentsHeight() + vBorder));
100  if (isScrollable || !fixedWidth || childRoot->isFrameSet())
101  setWidth(max(width(), childFrameView->contentsWidth() + hBorder));
102 
103  updateWidgetPosition();
104 
105  ASSERT(!childFrameView->layoutPending());
106  ASSERT(!childRoot->needsLayout());
107  ASSERT(!childRoot->firstChild() || !childRoot->firstChild()->firstChild() || !childRoot->firstChild()->firstChild()->needsLayout());
108 
109  setNeedsLayout(false);
110 }
111 
112 
11359void RenderPart::viewCleared()
11460{
11561}

WebCore/rendering/RenderPart.h

@@public:
4141 virtual void setWidget(PassRefPtr<Widget>);
4242 virtual void viewCleared();
4343
44  void layoutWithFlattening(bool fixedWidth, bool fixedHeight);
45 
4644protected:
4745 bool m_hasFallbackContent;
4846

WebCore/rendering/RenderPartObject.cpp

@@RenderPartObject::RenderPartObject(Element* element)
5151{
5252}
5353
54 bool RenderPartObject::flattenFrame()
55 {
56  if (!node() || !node()->hasTagName(iframeTag))
57  return false;
58 
59  HTMLIFrameElement* element = static_cast<HTMLIFrameElement*>(node());
60  bool isScrollable = element->scrollingMode() != ScrollbarAlwaysOff;
61 
62  if (!isScrollable && style()->width().isFixed()
63  && style()->height().isFixed())
64  return false;
65 
66  Frame* frame = element->document()->frame();
67  bool enabled = frame && frame->settings()->frameFlatteningEnabled();
68 
69  if (!enabled || !frame->page())
70  return false;
71 
72  FrameView* view = frame->page()->mainFrame()->view();
73  if (!view)
74  return false;
75 
76  // Do not flatten offscreen inner frames during frame flattening.
77  return absoluteBoundingBoxRect().intersects(IntRect(IntPoint(0, 0), view->contentsSize()));
78 }
79 
80 void RenderPartObject::calcHeight()
81 {
82  RenderPart::calcHeight();
83  if (!flattenFrame())
84  return;
85 
86  HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node());
87  bool isScrollable = frame->scrollingMode() != ScrollbarAlwaysOff;
88 
89  if (isScrollable || !style()->height().isFixed()) {
90  FrameView* view = static_cast<FrameView*>(widget());
91  int border = borderTop() + borderBottom();
92  setHeight(max(height(), view->contentsHeight() + border));
93  }
94 }
95 
96 void RenderPartObject::calcWidth()
97 {
98  RenderPart::calcWidth();
99  if (!flattenFrame())
100  return;
101 
102  HTMLIFrameElement* frame = static_cast<HTMLIFrameElement*>(node());
103  bool isScrollable = frame->scrollingMode() != ScrollbarAlwaysOff;
104 
105  if (isScrollable || !style()->width().isFixed()) {
106  FrameView* view = static_cast<FrameView*>(widget());
107  int border = borderLeft() + borderRight();
108  setWidth(max(width(), view->contentsWidth() + border));
109  }
110 }
111 
112 void RenderPartObject::layout()
113 {
114  ASSERT(needsLayout());
115 
116  RenderPart::calcWidth();
117  RenderPart::calcHeight();
118 
119  if (flattenFrame()) {
120  layoutWithFlattening(style()->width().isFixed(), style()->height().isFixed());
121  return;
122  }
123 
124  RenderPart::layout();
125 
126  m_overflow.clear();
127  addShadowOverflow();
128 
129  setNeedsLayout(false);
130 }
131 
13254void RenderPartObject::viewCleared()
13355{
13456 if (node() && widget() && widget()->isFrameView()) {

WebCore/rendering/RenderPartObject.h

@@class RenderPartObject : public RenderPart {
3232public:
3333 RenderPartObject(Element*);
3434
35  virtual void calcHeight();
36  virtual void calcWidth();
37 
3835private:
3936 virtual const char* renderName() const { return "RenderPartObject"; }
4037
41  virtual void layout();
42 
4338 virtual void viewCleared();
44 
45  bool flattenFrame();
4639};
4740
4841inline RenderPartObject* toRenderPartObject(RenderObject* object)