Changeset 151843 in webkit


Ignore:
Timestamp:
Jun 21, 2013 10:42:52 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

[CSS Regions] Move overset compute code from flow thread to named flow thread
https://bugs.webkit.org/show_bug.cgi?id=117835

Patch by Radu Stavila <stavila@adobe.com> on 2013-06-21
Reviewed by Andreas Kling.

Moved computeOversetStateForRegions() and overset() methods from RenderFlowThread to RenderNamedFlowThread.
Added ASSERTS in RenderRegion::regionOversetState and RenderRegion::setRegionOversetState to ensure
the region was created from an element.

  • rendering/RenderBlock.cpp:

(WebCore::RenderBlock::computeOverflow):

  • rendering/RenderFlowThread.cpp:

(WebCore::RenderFlowThread::RenderFlowThread):

  • rendering/RenderFlowThread.h:
  • rendering/RenderNamedFlowThread.cpp:

(WebCore::RenderNamedFlowThread::RenderNamedFlowThread):
(WebCore::RenderNamedFlowThread::computeOversetStateForRegions):

  • rendering/RenderNamedFlowThread.h:

(WebCore::RenderNamedFlowThread::overset):

  • rendering/RenderRegion.cpp:

(WebCore::RenderRegion::regionOversetState):
(WebCore::RenderRegion::setRegionOversetState):

Location:
trunk/Source/WebCore
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r151842 r151843  
     12013-06-21  Radu Stavila  <stavila@adobe.com>
     2
     3        [CSS Regions] Move overset compute code from flow thread to named flow thread
     4        https://bugs.webkit.org/show_bug.cgi?id=117835
     5
     6        Reviewed by Andreas Kling.
     7
     8        Moved computeOversetStateForRegions() and overset() methods from RenderFlowThread to RenderNamedFlowThread.
     9        Added ASSERTS in RenderRegion::regionOversetState and RenderRegion::setRegionOversetState to ensure
     10        the region was created from an element.
     11
     12        * rendering/RenderBlock.cpp:
     13        (WebCore::RenderBlock::computeOverflow):
     14        * rendering/RenderFlowThread.cpp:
     15        (WebCore::RenderFlowThread::RenderFlowThread):
     16        * rendering/RenderFlowThread.h:
     17        * rendering/RenderNamedFlowThread.cpp:
     18        (WebCore::RenderNamedFlowThread::RenderNamedFlowThread):
     19        (WebCore::RenderNamedFlowThread::computeOversetStateForRegions):
     20        * rendering/RenderNamedFlowThread.h:
     21        (WebCore::RenderNamedFlowThread::overset):
     22        * rendering/RenderRegion.cpp:
     23        (WebCore::RenderRegion::regionOversetState):
     24        (WebCore::RenderRegion::setRegionOversetState):
     25
    1262013-06-21  Commit Queue  <commit-queue@webkit.org>
    227
  • trunk/Source/WebCore/rendering/RenderBlock.cpp

    r151777 r151843  
    18161816    addVisualOverflowFromTheme();
    18171817
    1818     if (isRenderFlowThread())
    1819         toRenderFlowThread(this)->computeOversetStateForRegions(oldClientAfterEdge);
     1818    if (isRenderNamedFlowThread())
     1819        toRenderNamedFlowThread(this)->computeOversetStateForRegions(oldClientAfterEdge);
    18201820}
    18211821
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r151777 r151843  
    5656    , m_regionsHaveUniformLogicalWidth(true)
    5757    , m_regionsHaveUniformLogicalHeight(true)
    58     , m_overset(true)
    5958    , m_hasRegionsWithStyling(false)
    6059    , m_dispatchRegionLayoutUpdateEvent(false)
     
    741740}
    742741
    743 void RenderFlowThread::computeOversetStateForRegions(LayoutUnit oldClientAfterEdge)
    744 {
    745     LayoutUnit height = oldClientAfterEdge;
    746 
    747     // FIXME: the visual overflow of middle region (if it is the last one to contain any content in a render flow thread)
    748     // might not be taken into account because the render flow thread height is greater that that regions height + its visual overflow
    749     // because of how computeLogicalHeight is implemented for RenderFlowThread (as a sum of all regions height).
    750     // This means that the middle region will be marked as fit (even if it has visual overflow flowing into the next region)
    751     if (hasRenderOverflow()
    752         && ( (isHorizontalWritingMode() && visualOverflowRect().maxY() > clientBoxRect().maxY())
    753             || (!isHorizontalWritingMode() && visualOverflowRect().maxX() > clientBoxRect().maxX())))
    754         height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visualOverflowRect().maxX();
    755 
    756     RenderRegion* lastReg = lastRegion();
    757     for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
    758         RenderRegion* region = *iter;
    759         LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().y() : region->flowThreadPortionRect().x());
    760         LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().maxY() : region->flowThreadPortionRect().maxX());
    761         RegionOversetState previousState = region->regionOversetState();
    762         RegionOversetState state = RegionFit;
    763         if (flowMin <= 0)
    764             state = RegionEmpty;
    765         if (flowMax > 0 && region == lastReg)
    766             state = RegionOverset;
    767         region->setRegionOversetState(state);
    768         // determine whether the NamedFlow object should dispatch a regionLayoutUpdate event
    769         // FIXME: currently it cannot determine whether a region whose regionOverset state remained either "fit" or "overset" has actually
    770         // changed, so it just assumes that the NamedFlow should dispatch the event
    771         if (previousState != state
    772             || state == RegionFit
    773             || state == RegionOverset)
    774             setDispatchRegionLayoutUpdateEvent(true);
    775        
    776         if (previousState != state)
    777             setDispatchRegionOversetChangeEvent(true);
    778     }
    779    
    780     // If the number of regions has changed since we last computed the overset property, schedule the regionOversetChange event.
    781     if (previousRegionCountChanged()) {
    782         setDispatchRegionOversetChangeEvent(true);
    783         updatePreviousRegionCount();
    784     }
    785 
    786     // With the regions overflow state computed we can also set the overset flag for the named flow.
    787     // If there are no valid regions in the chain, overset is true.
    788     m_overset = lastReg ? lastReg->regionOversetState() == RegionOverset : true;
    789 }
    790 
    791742bool RenderFlowThread::regionInRange(const RenderRegion* targetRegion, const RenderRegion* startRegion, const RenderRegion* endRegion) const
    792743{
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r151777 r151843  
    137137        const RenderRegion* oldStartRegion = 0, const RenderRegion* oldEndRegion = 0,
    138138        const RenderRegion* newStartRegion = 0, const RenderRegion* newEndRegion = 0);
    139    
    140     void computeOversetStateForRegions(LayoutUnit oldClientAfterEdge);
    141 
    142     bool overset() const { return m_overset; }
    143139
    144140    // Check if the object is in region and the region is part of this flow thread.
     
    280276    bool m_regionsHaveUniformLogicalWidth : 1;
    281277    bool m_regionsHaveUniformLogicalHeight : 1;
    282     bool m_overset : 1;
    283278    bool m_hasRegionsWithStyling : 1;
    284279    bool m_dispatchRegionLayoutUpdateEvent : 1;
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp

    r151835 r151843  
    5353
    5454RenderNamedFlowThread::RenderNamedFlowThread(PassRefPtr<WebKitNamedFlow> namedFlow)
    55     : m_namedFlow(namedFlow)
     55    : m_overset(true)
     56    , m_namedFlow(namedFlow)
    5657    , m_regionLayoutUpdateEventTimer(this, &RenderNamedFlowThread::regionLayoutUpdateEventTimerFired)
    5758    , m_regionOversetChangeEventTimer(this, &RenderNamedFlowThread::regionOversetChangeEventTimerFired)
     
    292293
    293294    invalidateRegions();
     295}
     296
     297void RenderNamedFlowThread::computeOversetStateForRegions(LayoutUnit oldClientAfterEdge)
     298{
     299    LayoutUnit height = oldClientAfterEdge;
     300
     301    // FIXME: the visual overflow of middle region (if it is the last one to contain any content in a render flow thread)
     302    // might not be taken into account because the render flow thread height is greater that that regions height + its visual overflow
     303    // because of how computeLogicalHeight is implemented for RenderNamedFlowThread (as a sum of all regions height).
     304    // This means that the middle region will be marked as fit (even if it has visual overflow flowing into the next region)
     305    if (hasRenderOverflow()
     306        && ( (isHorizontalWritingMode() && visualOverflowRect().maxY() > clientBoxRect().maxY())
     307            || (!isHorizontalWritingMode() && visualOverflowRect().maxX() > clientBoxRect().maxX())))
     308        height = isHorizontalWritingMode() ? visualOverflowRect().maxY() : visualOverflowRect().maxX();
     309
     310    RenderRegion* lastReg = lastRegion();
     311    for (RenderRegionList::iterator iter = m_regionList.begin(); iter != m_regionList.end(); ++iter) {
     312        RenderRegion* region = *iter;
     313        LayoutUnit flowMin = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().y() : region->flowThreadPortionRect().x());
     314        LayoutUnit flowMax = height - (isHorizontalWritingMode() ? region->flowThreadPortionRect().maxY() : region->flowThreadPortionRect().maxX());
     315        RegionOversetState previousState = region->regionOversetState();
     316        RegionOversetState state = RegionFit;
     317        if (flowMin <= 0)
     318            state = RegionEmpty;
     319        if (flowMax > 0 && region == lastReg)
     320            state = RegionOverset;
     321        region->setRegionOversetState(state);
     322        // determine whether the NamedFlow object should dispatch a regionLayoutUpdate event
     323        // FIXME: currently it cannot determine whether a region whose regionOverset state remained either "fit" or "overset" has actually
     324        // changed, so it just assumes that the NamedFlow should dispatch the event
     325        if (previousState != state
     326            || state == RegionFit
     327            || state == RegionOverset)
     328            setDispatchRegionLayoutUpdateEvent(true);
     329       
     330        if (previousState != state)
     331            setDispatchRegionOversetChangeEvent(true);
     332    }
     333   
     334    // If the number of regions has changed since we last computed the overset property, schedule the regionOversetChange event.
     335    if (previousRegionCountChanged()) {
     336        setDispatchRegionOversetChangeEvent(true);
     337        updatePreviousRegionCount();
     338    }
     339
     340    // With the regions overflow state computed we can also set the overset flag for the named flow.
     341    // If there are no valid regions in the chain, overset is true.
     342    m_overset = lastReg ? lastReg->regionOversetState() == RegionOverset : true;
    294343}
    295344
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.h

    r151777 r151843  
    6969    virtual void removeRegionFromThread(RenderRegion*) OVERRIDE;
    7070
     71    bool overset() const { return m_overset; }
     72    void computeOversetStateForRegions(LayoutUnit oldClientAfterEdge);
     73
    7174    void registerNamedFlowContentNode(Node*);
    7275    void unregisterNamedFlowContentNode(Node*);
     
    122125    RenderRegionList m_invalidRegionList;
    123126
     127    bool m_overset : 1;
     128
    124129    // The DOM Object that represents a named flow.
    125130    RefPtr<WebKitNamedFlow> m_namedFlow;
  • trunk/Source/WebCore/rendering/RenderRegion.cpp

    r151777 r151843  
    134134RegionOversetState RenderRegion::regionOversetState() const
    135135{
    136     if (isValid() && node() && node()->isElementNode())
    137         return toElement(node())->regionOversetState();
     136    if (isValid() && element())
     137        return element()->regionOversetState();
    138138   
    139139    return RegionUndefined;
     
    142142void RenderRegion::setRegionOversetState(RegionOversetState state)
    143143{
    144     if (node() && node()->isElementNode())
    145         toElement(node())->setRegionOversetState(state);
     144    if (element())
     145        element()->setRegionOversetState(state);
     146}
     147
     148Element* RenderRegion::element() const
     149{
     150    ASSERT(node() && node()->isElementNode());
     151    return toElement(node());
    146152}
    147153
  • trunk/Source/WebCore/rendering/RenderRegion.h

    r151777 r151843  
    8585    RegionOversetState regionOversetState() const;
    8686    void setRegionOversetState(RegionOversetState);
     87
     88    Element* element() const;
    8789   
    8890    // These methods represent the width and height of a "page" and for a RenderRegion they are just the
Note: See TracChangeset for help on using the changeset viewer.