root/trunk/WebCore/rendering/RenderReplaced.h

Revision 47440, 2.6 KB (checked in by hyatt@apple.com, 3 months ago)

WebCore:  https://bugs.webkit.org/show_bug.cgi?id=20329, shadows and reflections incorrectly
considered part of scrollable overflow.

Reviewed by Dan Bernstein.

This patch takes the engine's concept of overflow and splits it into two types:
layout overflow and visual overflow.

Layout overflow is about other boxes that spill out of an enclosing box, For example,
in the inline flow case a tall image could spill out of a line box. Examples of
visual overflow are shadows, text stroke (and eventually outline and
border-image).

Three objects tracked overflow before this patch: RenderBlock had
m_overflowLeft/Top/Width/Height variables. RootInlineBox had an Overflow*
that also had four overflow values. Finally RenderReplaced elements tracked shadow/reflection
overflow using a map that cached four values.

This patch takes all of these different overflow models and unifies them into a single
new class called RenderOverflow. This class is now a member variable in RenderBox and
InlineFlowBoxes. It is only allocated if overflow actually exists. Instead of tracking
four values, it tracks eight: left/top/right/bottom for layout overflow and
left/top/right/bottom for visual overflow.

Overflow computation is now done after layout is finished rather than during layout
(when child objects can be churning and moving around). A number of layout tests progressed
by deferring overflow computation to a separate pass.

All inline flow boxes now track overflow (and not just the root line box). This allows
repainting of line boxes to actually be tight and bail early if the overflow rect of a box
doesn't intersect. The old code always visited all object on a line if the root line box
intersected at all.

Line box overflow no longer propagates across self-painting layers. This fixes a number of
issues with incorrect scrollbars appearing when relative positioned inlines were used in a page.

Layer bounds have been modified to exclude visual overflow. The width/height members only really
have one reason for continued existence, and that is that they happen to be used in repaint()
when an overflow clip object's height isn't accurate. In this case, the bounds should exclude
visual overflow anyway, so this change tightens that repaint up.

Root lines have renamed m_selectionTop/Bottom to m_lineTop/Bottom and positionForPoint methods have
been changed to use these instead of relying on overflow (which was totally wrong).

Significant changes have been made to the "almost strict mode" line box quirk where objects with no
text children have no effect on the height of a line. Instead of making the height() of the objects
variable and dependent on overflow, the objects now have their full height and get placed on
the baseline properly. They simply don't contribute to overflow above lineTop/Bottom.

Reflections are no longer considered overflow of any kind. Because reflections have their own layers,
it is not necessary to treat them as visual or layout overflow in the RenderObject tree. The end result
of not incorporating them into RenderOverflow is that they have no effect on scrolling. transparencyClipBox
has been extended to support fully reflecting the entire clip box when a reflection exists. This fixes
numerous repaint bugs in transparent objects with reflections when the transparent objects had self-painting
sublayers.

* WebCore.xcodeproj/project.pbxproj:
* dom/ContainerNode.cpp:
(WebCore::ContainerNode::getUpperLeftCorner):
* editing/visible_units.cpp:
(WebCore::previousLinePosition):
(WebCore::nextLinePosition):
* page/FrameView.cpp:
(WebCore::FrameView::adjustViewSize):
(WebCore::FrameView::adjustPageHeight):
* rendering/InlineBox.cpp:
(WebCore::InlineBox::height):
* rendering/InlineBox.h:
* rendering/InlineFlowBox.cpp:
(WebCore::InlineFlowBox::adjustPosition):
(WebCore::InlineFlowBox::placeBoxesHorizontally):
(WebCore::InlineFlowBox::placeBoxesVertically):
(WebCore::InlineFlowBox::computeVerticalOverflow):
(WebCore::InlineFlowBox::nodeAtPoint):
(WebCore::InlineFlowBox::paint):
* rendering/InlineFlowBox.h:
(WebCore::InlineFlowBox::InlineFlowBox):
(WebCore::InlineFlowBox::topCombinedOverflow):
(WebCore::InlineFlowBox::bottomCombinedOverflow):
(WebCore::InlineFlowBox::leftCombinedOverflow):
(WebCore::InlineFlowBox::rightCombinedOverflow):
(WebCore::InlineFlowBox::combinedOverflowRect):
(WebCore::InlineFlowBox::topLayoutOverflow):
(WebCore::InlineFlowBox::bottomLayoutOverflow):
(WebCore::InlineFlowBox::leftLayoutOverflow):
(WebCore::InlineFlowBox::rightLayoutOverflow):
(WebCore::InlineFlowBox::layoutOverflowRect):
(WebCore::InlineFlowBox::topVisualOverflow):
(WebCore::InlineFlowBox::bottomVisualOverflow):
(WebCore::InlineFlowBox::leftVisualOverflow):
(WebCore::InlineFlowBox::rightVisualOverflow):
(WebCore::InlineFlowBox::visualOverflowRect):
(WebCore::InlineFlowBox::setHorizontalOverflowPositions):
(WebCore::InlineFlowBox::setVerticalOverflowPositions):
* rendering/InlineTextBox.cpp:
(WebCore::InlineTextBox::paint):
* rendering/RenderBlock.cpp:
(WebCore::RenderBlock::RenderBlock):
(WebCore::RenderBlock::layout):
(WebCore::RenderBlock::layoutBlock):
(WebCore::RenderBlock::addOverflowFromBlockChildren):
(WebCore::RenderBlock::handleBottomOfBlock):
(WebCore::RenderBlock::layoutBlockChildren):
(WebCore::RenderBlock::paint):
(WebCore::RenderBlock::fillInlineSelectionGaps):
(WebCore::RenderBlock::floatRect):
(WebCore::RenderBlock::lowestPosition):
(WebCore::RenderBlock::rightmostPosition):
(WebCore::RenderBlock::leftmostPosition):
(WebCore::RenderBlock::addOverhangingFloats):
(WebCore::RenderBlock::nodeAtPoint):
(WebCore::RenderBlock::positionForPointWithInlineChildren):
(WebCore::RenderBlock::layoutColumns):
(WebCore::getHeightForLineCount):
* rendering/RenderBlock.h:
* rendering/RenderBlockLineLayout.cpp:
(WebCore::RenderBlock::computeHorizontalPositionsForLine):
(WebCore::RenderBlock::computeVerticalPositionsForLine):
(WebCore::RenderBlock::layoutInlineChildren):
(WebCore::RenderBlock::matchedEndLine):
(WebCore::RenderBlock::addOverflowFromInlineChildren):
* rendering/RenderBox.cpp:
(WebCore::RenderBox::destroy):
(WebCore::RenderBox::clippedOverflowRectForRepaint):
(WebCore::RenderBox::localCaretRect):
(WebCore::RenderBox::addShadowAndReflectionOverflow):
(WebCore::RenderBox::addOverflowFromChild):
(WebCore::RenderBox::addLayoutOverflow):
(WebCore::RenderBox::addVisualOverflow):
(WebCore::RenderBox::clearLayoutOverflow):
* rendering/RenderBox.h:
(WebCore::RenderBox::combinedOverflowRect):
(WebCore::RenderBox::topCombinedOverflow):
(WebCore::RenderBox::bottomCombinedOverflow):
(WebCore::RenderBox::leftCombinedOverflow):
(WebCore::RenderBox::rightCombinedOverflow):
(WebCore::RenderBox::layoutOverflowRect):
(WebCore::RenderBox::topLayoutOverflow):
(WebCore::RenderBox::bottomLayoutOverflow):
(WebCore::RenderBox::leftLayoutOverflow):
(WebCore::RenderBox::rightLayoutOverflow):
(WebCore::RenderBox::visualOverflowRect):
(WebCore::RenderBox::topVisualOverflow):
(WebCore::RenderBox::bottomVisualOverflow):
(WebCore::RenderBox::leftVisualOverflow):
(WebCore::RenderBox::rightVisualOverflow):
* rendering/RenderFlexibleBox.cpp:
(WebCore::RenderFlexibleBox::layoutBlock):
(WebCore::RenderFlexibleBox::layoutHorizontalBox):
(WebCore::RenderFlexibleBox::layoutVerticalBox):
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::updateLayerPosition):
(WebCore::RenderLayer::localBoundingBox):
* rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateRootLayerPosition):
(WebCore::RenderLayerCompositor::ensureRootPlatformLayer):
* rendering/RenderLineBoxList.cpp:
(WebCore::RenderLineBoxList::paint):
(WebCore::RenderLineBoxList::hitTest):
* rendering/RenderListItem.cpp:
(WebCore::RenderListItem::positionListMarker):
* rendering/RenderObject.cpp:
(WebCore::RenderObject::RenderObject):
* rendering/RenderObject.h:
* rendering/RenderOverflow.h: Added.
(WebCore::RenderOverflow::RenderOverflow):
(WebCore::RenderOverflow::topLayoutOverflow):
(WebCore::RenderOverflow::bottomLayoutOverflow):
(WebCore::RenderOverflow::leftLayoutOverflow):
(WebCore::RenderOverflow::rightLayoutOverflow):
(WebCore::RenderOverflow::topVisualOverflow):
(WebCore::RenderOverflow::bottomVisualOverflow):
(WebCore::RenderOverflow::leftVisualOverflow):
(WebCore::RenderOverflow::rightVisualOverflow):
(WebCore::RenderOverflow::setTopLayoutOverflow):
(WebCore::RenderOverflow::setBottomLayoutOverflow):
(WebCore::RenderOverflow::setLeftLayoutOverflow):
(WebCore::RenderOverflow::setRightLayoutOverflow):
(WebCore::RenderOverflow::setTopVisualOverflow):
(WebCore::RenderOverflow::setBottomVisualOverflow):
(WebCore::RenderOverflow::setLeftVisualOverflow):
(WebCore::RenderOverflow::setRightVisualOverflow):
(WebCore::RenderOverflow::layoutOverflowRect):
(WebCore::RenderOverflow::visualOverflowRect):
(WebCore::RenderOverflow::combinedOverflowRect):
(WebCore::RenderOverflow::move):
(WebCore::RenderOverflow::addLayoutOverflow):
(WebCore::RenderOverflow::addVisualOverflow):
(WebCore::RenderOverflow::resetLayoutOverflow):
* rendering/RenderPartObject.cpp:
(WebCore::RenderPartObject::layout):
* rendering/RenderReplaced.cpp:
(WebCore::RenderReplaced::~RenderReplaced):
(WebCore::RenderReplaced::layout):
(WebCore::RenderReplaced::shouldPaint):
(WebCore::RenderReplaced::positionForPoint):
(WebCore::RenderReplaced::clippedOverflowRectForRepaint):
* rendering/RenderReplaced.h:
* rendering/RenderScrollbarPart.cpp:
(WebCore::RenderScrollbarPart::layout):
(WebCore::RenderScrollbarPart::paintIntoRect):
* rendering/RenderSlider.cpp:
(WebCore::RenderSlider::layout):
* rendering/RenderTable.cpp:
(WebCore::RenderTable::layout):
(WebCore::RenderTable::paint):
* rendering/RenderTableCell.cpp:
(WebCore::RenderTableCell::clippedOverflowRectForRepaint):
* rendering/RenderTableSection.cpp:
(WebCore::RenderTableSection::layoutRows):
* rendering/RenderTableSection.h:
* rendering/RenderText.cpp:
(WebCore::RenderText::positionForPoint):
(WebCore::RenderText::localCaretRect):
* rendering/RenderView.cpp:
(WebCore::RenderView::layout):
* rendering/RootInlineBox.cpp:
(WebCore::RootInlineBox::addHighlightOverflow):
(WebCore::RootInlineBox::adjustPosition):
(WebCore::RootInlineBox::verticallyAlignBoxes):
(WebCore::RootInlineBox::selectionTop):
* rendering/RootInlineBox.h:
(WebCore::RootInlineBox::RootInlineBox):
(WebCore::RootInlineBox::nextRootBox):
(WebCore::RootInlineBox::prevRootBox):
(WebCore::RootInlineBox::lineTop):
(WebCore::RootInlineBox::lineBottom):
(WebCore::RootInlineBox::selectionBottom):
(WebCore::RootInlineBox::selectionHeight):
(WebCore::RootInlineBox::floats):
(WebCore::RootInlineBox::floatsPtr):
(WebCore::RootInlineBox::setLineTopBottomPositions):
* rendering/SVGRootInlineBox.cpp:
(WebCore::SVGRootInlineBox::layoutInlineBoxes):

LayoutTests:  https://bugs.webkit.org/show_bug.cgi?id=20329, shadows and reflections incorrectly being included
as part of scrollable overflow.

Reviewed by Dan Bernstein.

Update layout tests to account for all of the changes made to overflow to split it into two types. Remove the layout
tests that were recently added that assumed that shadows and reflections should be part of scrollable overflow.

* fast/box-shadow/box-shadow-overflow-scroll-expected.txt: Removed.
* fast/box-shadow/box-shadow-overflow-scroll.html: Removed.
* fast/reflections/reflection-overflow-scroll-expected.txt: Removed.
* fast/reflections/reflection-overflow-scroll.html: Removed.
* platform/mac/compositing/overflow/ancestor-overflow-expected.txt:
* platform/mac/compositing/reflections/reflection-on-composited-expected.txt:
* platform/mac/editing/deleting/delete-br-011-expected.txt:
* platform/mac/editing/deleting/delete-br-012-expected.txt:
* platform/mac/editing/pasteboard/select-element-1-expected.txt:
* platform/mac/fast/block/positioning/relative-overflow-block-expected.txt:
* platform/mac/fast/body-propagation/background-color/002-expected.txt:
* platform/mac/fast/body-propagation/background-color/002-xhtml-expected.txt:
* platform/mac/fast/body-propagation/background-image/002-expected.txt:
* platform/mac/fast/body-propagation/background-image/002-xhtml-expected.txt:
* platform/mac/fast/body-propagation/overflow/001-expected.txt:
* platform/mac/fast/body-propagation/overflow/001-xhtml-expected.txt:
* platform/mac/fast/body-propagation/overflow/005-declarative-expected.txt:
* platform/mac/fast/body-propagation/overflow/005-expected.txt:
* platform/mac/fast/body-propagation/overflow/005-xhtml-expected.txt:
* platform/mac/fast/borders/fieldsetBorderRadius-expected.txt:
* platform/mac/fast/box-shadow/transform-fringing-expected.txt:
* platform/mac/fast/clip/008-expected.txt:
* platform/mac/fast/clip/011-expected.txt:
* platform/mac/fast/clip/012-expected.txt:
* platform/mac/fast/dynamic/genContentDestroyChildren-expected.txt:
* platform/mac/fast/dynamic/window-resize-scrollbars-test-expected.txt:
* platform/mac/fast/encoding/utf-16-big-endian-expected.txt:
* platform/mac/fast/encoding/utf-16-little-endian-expected.txt:
* platform/mac/fast/forms/form-element-geometry-expected.txt:
* platform/mac/fast/images/image-in-map-expected.txt:
* platform/mac/fast/inline-block/003-expected.txt:
* platform/mac/fast/inline/inline-text-quirk-bpm-expected.txt:
* platform/mac/fast/invalid/012-expected.txt:
* platform/mac/fast/layers/normal-flow-hit-test-expected.txt:
* platform/mac/fast/lists/inlineBoxWrapperNullCheck-expected.txt:
* platform/mac/fast/overflow/scrollRevealButton-expected.txt:
* platform/mac/fast/reflections/reflection-direction-expected.txt:
* platform/mac/fast/reflections/reflection-masks-expected.checksum:
* platform/mac/fast/reflections/reflection-masks-expected.png:
* platform/mac/fast/reflections/reflection-masks-expected.txt:
* platform/mac/fast/reflections/reflection-masks-opacity-expected.checksum:
* platform/mac/fast/reflections/reflection-masks-opacity-expected.png:
* platform/mac/fast/reflections/reflection-masks-opacity-expected.txt:
* platform/mac/fast/reflections/reflection-nesting-expected.txt:
* platform/mac/fast/reflections/reflection-overflow-hidden-expected.png:
* platform/mac/fast/reflections/reflection-overflow-hidden-expected.txt:
* platform/mac/fast/repaint/box-shadow-h-expected.txt:
* platform/mac/fast/repaint/box-shadow-v-expected.txt:
* platform/mac/fast/repaint/reflection-redraw-expected.txt:
* platform/mac/fast/repaint/reflection-repaint-test-expected.txt:
* platform/mac/fast/repaint/transform-absolute-in-positioned-container-expected.txt:
* platform/mac/fast/repaint/transform-replaced-shadows-expected.txt:
* platform/mac/fast/replaced/border-radius-clip-expected.txt:
* platform/mac/fast/transforms/shadows-expected.txt:
* platform/mac/fast/transforms/transforms-with-opacity-expected.txt:
* platform/mac/media/video-layer-crash-expected.txt:
* platform/mac/tables/mozilla/bugs/adforce_imgis_com-expected.txt:
* platform/mac/tables/mozilla/bugs/bug10565-expected.txt:
* platform/mac/tables/mozilla/bugs/bug10633-expected.txt:
* platform/mac/tables/mozilla/bugs/bug113424-expected.txt:
* platform/mac/tables/mozilla/bugs/bug1188-expected.txt:
* platform/mac/tables/mozilla/bugs/bug131020-expected.txt:
* platform/mac/tables/mozilla/bugs/bug1318-expected.txt:
* platform/mac/tables/mozilla/bugs/bug22513-expected.txt:
* platform/mac/tables/mozilla/bugs/bug26553-expected.txt:
* platform/mac/tables/mozilla/bugs/bug3309-1-expected.txt:
* platform/mac/tables/mozilla/bugs/bug4427-expected.txt:
* platform/mac/tables/mozilla/bugs/bug4527-expected.txt:
* platform/mac/tables/mozilla/bugs/bug5538-expected.txt:
* platform/mac/tables/mozilla/bugs/bug78162-expected.txt:
* platform/mac/tables/mozilla/bugs/bug8381-expected.txt:
* platform/mac/tables/mozilla/bugs/bug86708-expected.txt:
* platform/mac/tables/mozilla/core/bloomberg-expected.txt:
* platform/mac/tables/mozilla/other/ms-expected.txt:
* platform/mac/tables/mozilla_expected_failures/bugs/bug23847-expected.txt:
* platform/mac/tables/mozilla_expected_failures/bugs/bug72393-expected.txt:
* platform/mac/tables/mozilla_expected_failures/bugs/bug89315-expected.txt:
* platform/mac/tables/mozilla_expected_failures/marvin/backgr_border-table-quirks-expected.txt:
* platform/mac/tables/mozilla_expected_failures/marvin/table_overflow_caption_bottom-expected.txt:
* platform/mac/transforms/3d/point-mapping/3d-point-mapping-2-expected.txt:
* platform/mac/transforms/3d/point-mapping/3d-point-mapping-deep-expected.txt:
* platform/mac/transforms/3d/point-mapping/3d-point-mapping-expected.txt:
* platform/mac/transforms/3d/point-mapping/3d-point-mapping-origins-expected.txt:
* platform/mac/transforms/3d/point-mapping/3d-point-mapping-overlapping-expected.txt:
* platform/mac/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.txt:

  • Property svn:eol-style set to native
Line 
1/*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2009 Apple Inc. All rights reserved.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Library General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 * Library General Public License for more details.
14 *
15 * You should have received a copy of the GNU Library General Public License
16 * along with this library; see the file COPYING.LIB.  If not, write to
17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 * Boston, MA 02110-1301, USA.
19 *
20 */
21
22#ifndef RenderReplaced_h
23#define RenderReplaced_h
24
25#include "RenderBox.h"
26
27namespace WebCore {
28
29class RenderReplaced : public RenderBox {
30public:
31    RenderReplaced(Node*);
32    RenderReplaced(Node*, const IntSize& intrinsicSize);
33    virtual ~RenderReplaced();
34
35protected:
36    virtual void layout();
37
38    virtual IntSize intrinsicSize() const;
39
40    virtual void setSelectionState(SelectionState);
41
42    bool isSelected() const;
43
44    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
45
46    void setIntrinsicSize(const IntSize&);
47    virtual void intrinsicSizeChanged();
48
49    bool shouldPaint(PaintInfo&, int& tx, int& ty);
50    void adjustOverflowForBoxShadowAndReflect();
51    IntRect localSelectionRect(bool checkWhetherSelected = true) const;
52
53private:
54    virtual const char* renderName() const { return "RenderReplaced"; }
55
56    virtual bool canHaveChildren() const { return false; }
57
58    virtual int lineHeight(bool firstLine, bool isRootLineBox = false) const;
59    virtual int baselinePosition(bool firstLine, bool isRootLineBox = false) const;
60
61    virtual void calcPrefWidths();
62
63    virtual int minimumReplacedHeight() const { return 0; }
64
65    virtual void paint(PaintInfo&, int tx, int ty);
66    virtual void paintReplaced(PaintInfo&, int /*tx*/, int /*ty*/) { }
67
68    virtual IntRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer);
69
70    virtual unsigned caretMaxRenderedOffset() const;
71    virtual VisiblePosition positionForPoint(const IntPoint&);
72   
73    virtual bool canBeSelectionLeaf() const { return true; }
74
75    virtual IntRect selectionRectForRepaint(RenderBoxModelObject* repaintContainer, bool clipToVisibleContent = true);
76
77    IntSize m_intrinsicSize;
78};
79
80}
81
82#endif
Note: See TracBrowser for help on using the browser.