15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    copyright notice, this list of conditions and the following
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    copyright notice, this list of conditions and the following
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    disclaimer in the documentation and/or other materials
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    provided with the distribution.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUCH DAMAGE.
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef RenderRegion_h
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define RenderRegion_h
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBlock.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/style/StyleInheritedData.h"
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)struct LayerFragment;
39926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)typedef Vector<LayerFragment, 1> LayerFragments;
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderBox;
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderBoxRegionInfo;
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderFlowThread;
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class RenderNamedFlowThread;
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)class RenderRegion : public RenderBlock {
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    explicit RenderRegion(Element*, RenderFlowThread*);
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isRenderRegion() const { return true; }
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    bool hitTestFlowThreadContents(const HitTestRequest&, HitTestResult&, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setFlowThreadPortionRect(const LayoutRect& rect) { m_flowThreadPortionRect = rect; }
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect flowThreadPortionRect() const { return m_flowThreadPortionRect; }
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect flowThreadPortionOverflowRect() const;
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void attachRegion();
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void detachRegion();
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderNamedFlowThread* parentNamedFlowThread() const { return m_parentNamedFlowThread; }
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderFlowThread* flowThread() const { return m_flowThread; }
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Valid regions do not create circular dependencies with other flows.
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isValid() const { return m_isValid; }
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setIsValid(bool valid) { m_isValid = valid; }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasCustomRegionStyle() const { return m_hasCustomRegionStyle; }
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setHasCustomRegionStyle(bool hasCustomRegionStyle) { m_hasCustomRegionStyle = hasCustomRegionStyle; }
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBoxRegionInfo* renderBoxRegionInfo(const RenderBox*) const;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBoxRegionInfo* setRenderBoxRegionInfo(const RenderBox*, LayoutUnit logicalLeftInset, LayoutUnit logicalRightInset,
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool containingBlockChainIsInset);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassOwnPtr<RenderBoxRegionInfo> takeRenderBoxRegionInfo(const RenderBox*);
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void removeRenderBoxRegionInfo(const RenderBox*);
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void deleteAllRenderBoxRegionInfo();
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isFirstRegion() const;
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool isLastRegion() const;
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void clearObjectStyleInRegion(const RenderObject*);
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    RegionOversetState regionOversetState() const;
86591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    void setRegionOversetState(RegionOversetState);
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
88591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    Element* element() const;
8902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These methods represent the width and height of a "page" and for a RenderRegion they are just the
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // content width and content height of a region. For RenderRegionSets, however, they will be the width and
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // height of a single column or page in the set.
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual LayoutUnit pageLogicalWidth() const;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual LayoutUnit pageLogicalHeight() const;
95926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    LayoutUnit maxPageLogicalHeight() const;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalTopOfFlowThreadContentRect(const LayoutRect&) const;
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalBottomOfFlowThreadContentRect(const LayoutRect&) const;
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalTopForFlowThreadContent() const { return logicalTopOfFlowThreadContentRect(flowThreadPortionRect()); };
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit logicalBottomForFlowThreadContent() const { return logicalBottomOfFlowThreadContentRect(flowThreadPortionRect()); };
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void getRanges(Vector<RefPtr<Range> >&) const;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This method represents the logical height of the entire flow thread portion used by the region or set.
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For RenderRegions it matches logicalPaginationHeight(), but for sets it is the height of all the pages
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // or columns added together.
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual LayoutUnit logicalHeightOfAllFlowThreadContent() const;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool hasAutoLogicalHeight() const { return m_hasAutoLogicalHeight; }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
111f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    const LayoutUnit& computedAutoHeight() const
112f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
113f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        ASSERT(hasComputedAutoHeight());
114f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        return m_computedAutoHeight;
115f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
116f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
117f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    void setComputedAutoHeight(LayoutUnit computedAutoHeight)
118f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
119f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        ASSERT(computedAutoHeight >= 0);
120f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        m_computedAutoHeight = computedAutoHeight;
121f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
122f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
123f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    void clearComputedAutoHeight()
124f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    {
125f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)        m_computedAutoHeight = -1;
126f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    }
127f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
128f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    bool hasComputedAutoHeight() const { return (m_computedAutoHeight >= 0); }
129f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void updateLogicalHeight() OVERRIDE;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The top of the nearest page inside the region. For RenderRegions, this is just the logical top of the
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // flow thread portion we contain. For sets, we have to figure out the top of the nearest column or
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // page.
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual LayoutUnit pageLogicalTopForOffset(LayoutUnit offset) const;
13602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void expandToEncompassFlowThreadContentsIfNeeded() { };
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Whether or not this region is a set.
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual bool isRenderRegionSet() const { return false; }
14102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
14253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void repaintFlowThreadContent(const LayoutRect& repaintRect) const;
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
144926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void collectLayerFragments(LayerFragments&, const LayoutRect&, const LayoutRect&) { }
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setRegionObjectsRegionStyle();
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void restoreRegionObjectsOriginalStyle();
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    virtual void computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const OVERRIDE;
15153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1525267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    LayoutRect overflowRectForFlowThreadPortion(const LayoutRect& flowThreadPortionRect, bool isFirstPortion, bool isLastPortion) const;
15353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    void repaintFlowThreadContentRectangle(const LayoutRect& repaintRect, const LayoutRect& flowThreadPortionRect,
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const LayoutRect& flowThreadPortionOverflowRect, const LayoutPoint& regionLocation) const;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual bool shouldHaveAutoLogicalHeight() const;
157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual const char* renderName() const { return "RenderRegion"; }
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
161926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual bool canHaveChildren() const OVERRIDE { return false; }
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void insertedIntoTree() OVERRIDE;
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void willBeRemovedFromTree() OVERRIDE;
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
166926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void layoutBlock(bool relayoutChildren, LayoutUnit pageLogicalHeight = 0) OVERRIDE;
167926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    virtual void paintObject(PaintInfo&, const LayoutPoint&) OVERRIDE;
168926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    virtual void installFlowThread();
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    PassRefPtr<RenderStyle> computeStyleInRegion(const RenderObject*);
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void computeChildrenStyleInRegion(const RenderObject*);
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setObjectStyleInRegion(RenderObject*, PassRefPtr<RenderStyle>, bool objectRegionStyleCached);
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void checkRegionStyle();
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void updateRegionHasAutoLogicalHeightFlag();
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void incrementAutoLogicalHeightCount();
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    void decrementAutoLogicalHeightCount();
180926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)protected:
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderFlowThread* m_flowThread;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If this RenderRegion is displayed as part of another named flow,
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // we need to create a dependency tree, so that layout of the
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // regions is always done before the regions themselves.
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderNamedFlowThread* m_parentNamedFlowThread;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutRect m_flowThreadPortionRect;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This map holds unique information about a block that is split across regions.
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // A RenderBoxRegionInfo* tells us about any layout information for a RenderBox that
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // is unique to the region. For now it just holds logical width information for RenderBlocks, but eventually
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // it will also hold a custom style for any box (for region styling).
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef HashMap<const RenderBox*, OwnPtr<RenderBoxRegionInfo> > RenderBoxRegionInfoMap;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderBoxRegionInfoMap m_renderBoxRegionInfo;
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    struct ObjectRegionStyleInfo {
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Used to store the original style of the object in region
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // so that the original style is properly restored after paint.
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Also used to store computed style of the object in region between
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // region paintings, so that the style in region is computed only
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // when necessary.
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RefPtr<RenderStyle> style;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // True if the computed style in region is cached.
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        bool cached;
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef HashMap<const RenderObject*, ObjectRegionStyleInfo > RenderObjectRegionStyleMap;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObjectRegionStyleMap m_renderObjectRegionStyle;
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
211f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)    LayoutUnit m_computedAutoHeight;
212f5e4ad553afbc08dd2e729bb77e937a9a94d5827Torne (Richard Coles)
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_isValid : 1;
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_hasCustomRegionStyle : 1;
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool m_hasAutoLogicalHeight : 1;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline RenderRegion* toRenderRegion(RenderObject* object)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
220926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isRenderRegion());
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<RenderRegion*>(object);
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline const RenderRegion* toRenderRegion(const RenderObject* object)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
226926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(!object || object->isRenderRegion());
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<const RenderRegion*>(object);
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// This will catch anyone doing an unnecessary cast.
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void toRenderRegion(const RenderRegion*);
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // RenderRegion_h
236