Changeset 206049 in webkit


Ignore:
Timestamp:
Sep 16, 2016 2:39:28 PM (8 years ago)
Author:
Antti Koivisto
Message:

Tighten region style map to use RenderElement instead of RenderObject
https://bugs.webkit.org/show_bug.cgi?id=162064

Reviewed by Zalan Bujtas.

RenderTexts don't have styles of their own so the map can operate on RenderElements.

  • rendering/RenderElement.cpp:

(WebCore::RenderElement::willBeRemovedFromTree):
(WebCore::RenderElement::removeFromRenderFlowThread):
(WebCore::RenderElement::removeFromRenderFlowThreadIncludingDescendants):
(WebCore::RenderElement::invalidateFlowThreadContainingBlockIncludingDescendants):

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

(WebCore::RenderFlowThread::removeFlowChildInfo):

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

(WebCore::RenderNamedFlowFragment::computeChildrenStyleInRegion):
(WebCore::RenderNamedFlowFragment::setRendererStyleInRegion):
(WebCore::RenderNamedFlowFragment::clearObjectStyleInRegion):
(WebCore::RenderNamedFlowFragment::setRegionObjectsRegionStyle):
(WebCore::RenderNamedFlowFragment::restoreRegionObjectsOriginalStyle):
(WebCore::RenderNamedFlowFragment::setObjectStyleInRegion): Deleted.

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

(WebCore::RenderNamedFlowThread::clearRenderObjectCustomStyle):
(WebCore::RenderNamedFlowThread::removeFlowChildInfo):

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

(WebCore::RenderObject::willBeRemovedFromTree):
(WebCore::RenderObject::removeFromRenderFlowThread): Deleted.
(WebCore::RenderObject::removeFromRenderFlowThreadIncludingDescendants): Deleted.
(WebCore::RenderObject::invalidateFlowThreadContainingBlockIncludingDescendants): Deleted.

These can now move to RenderElement.

  • rendering/RenderObject.h:
Location:
trunk/Source/WebCore
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r206048 r206049  
     12016-09-16  Antti Koivisto  <antti@apple.com>
     2
     3        Tighten region style map to use RenderElement instead of RenderObject
     4        https://bugs.webkit.org/show_bug.cgi?id=162064
     5
     6        Reviewed by Zalan Bujtas.
     7
     8        RenderTexts don't have styles of their own so the map can operate on RenderElements.
     9
     10        * rendering/RenderElement.cpp:
     11        (WebCore::RenderElement::willBeRemovedFromTree):
     12        (WebCore::RenderElement::removeFromRenderFlowThread):
     13        (WebCore::RenderElement::removeFromRenderFlowThreadIncludingDescendants):
     14        (WebCore::RenderElement::invalidateFlowThreadContainingBlockIncludingDescendants):
     15        * rendering/RenderElement.h:
     16        * rendering/RenderFlowThread.cpp:
     17        (WebCore::RenderFlowThread::removeFlowChildInfo):
     18        * rendering/RenderFlowThread.h:
     19        * rendering/RenderNamedFlowFragment.cpp:
     20        (WebCore::RenderNamedFlowFragment::computeChildrenStyleInRegion):
     21        (WebCore::RenderNamedFlowFragment::setRendererStyleInRegion):
     22        (WebCore::RenderNamedFlowFragment::clearObjectStyleInRegion):
     23        (WebCore::RenderNamedFlowFragment::setRegionObjectsRegionStyle):
     24        (WebCore::RenderNamedFlowFragment::restoreRegionObjectsOriginalStyle):
     25        (WebCore::RenderNamedFlowFragment::setObjectStyleInRegion): Deleted.
     26        * rendering/RenderNamedFlowFragment.h:
     27        * rendering/RenderNamedFlowThread.cpp:
     28        (WebCore::RenderNamedFlowThread::clearRenderObjectCustomStyle):
     29        (WebCore::RenderNamedFlowThread::removeFlowChildInfo):
     30        * rendering/RenderNamedFlowThread.h:
     31        * rendering/RenderObject.cpp:
     32        (WebCore::RenderObject::willBeRemovedFromTree):
     33        (WebCore::RenderObject::removeFromRenderFlowThread): Deleted.
     34        (WebCore::RenderObject::removeFromRenderFlowThreadIncludingDescendants): Deleted.
     35        (WebCore::RenderObject::invalidateFlowThreadContainingBlockIncludingDescendants): Deleted.
     36
     37            These can now move to RenderElement.
     38
     39        * rendering/RenderObject.h:
     40
    1412016-09-16  Brent Fulgham  <bfulgham@apple.com>
    242
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r205997 r206049  
    10881088        containerFlowThread->removeFlowChild(*this);
    10891089
     1090    removeFromRenderFlowThread();
     1091
    10901092    RenderObject::willBeRemovedFromTree();
    10911093}
     
    22052207}
    22062208
     2209void RenderElement::removeFromRenderFlowThread()
     2210{
     2211    if (flowThreadState() == NotInsideFlowThread)
     2212        return;
     2213
     2214    // Sometimes we remove the element from the flow, but it's not destroyed at that time.
     2215    // It's only until later when we actually destroy it and remove all the children from it.
     2216    // Currently, that happens for firstLetter elements and list markers.
     2217    // Pass in the flow thread so that we don't have to look it up for all the children.
     2218    removeFromRenderFlowThreadIncludingDescendants(true);
     2219}
     2220
     2221void RenderElement::removeFromRenderFlowThreadIncludingDescendants(bool shouldUpdateState)
     2222{
     2223    // Once we reach another flow thread we don't need to update the flow thread state
     2224    // but we have to continue cleanup the flow thread info.
     2225    if (isRenderFlowThread())
     2226        shouldUpdateState = false;
     2227
     2228    for (auto& child : childrenOfType<RenderObject>(*this)) {
     2229        if (is<RenderElement>(child)) {
     2230            downcast<RenderElement>(child).removeFromRenderFlowThreadIncludingDescendants(shouldUpdateState);
     2231            continue;
     2232        }
     2233        if (shouldUpdateState)
     2234            child.setFlowThreadState(NotInsideFlowThread);
     2235    }
     2236
     2237    // We have to ask for our containing flow thread as it may be above the removed sub-tree.
     2238    RenderFlowThread* flowThreadContainingBlock = this->flowThreadContainingBlock();
     2239    while (flowThreadContainingBlock) {
     2240        flowThreadContainingBlock->removeFlowChildInfo(this);
     2241
     2242        if (flowThreadContainingBlock->flowThreadState() == NotInsideFlowThread)
     2243            break;
     2244        auto* parent = flowThreadContainingBlock->parent();
     2245        if (!parent)
     2246            break;
     2247        flowThreadContainingBlock = parent->flowThreadContainingBlock();
     2248    }
     2249    if (is<RenderBlock>(*this))
     2250        downcast<RenderBlock>(*this).setCachedFlowThreadContainingBlockNeedsUpdate();
     2251
     2252    if (shouldUpdateState)
     2253        setFlowThreadState(NotInsideFlowThread);
     2254}
     2255
     2256void RenderElement::invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* flowThread)
     2257{
     2258    if (flowThreadState() == NotInsideFlowThread)
     2259        return;
     2260
     2261    if (is<RenderBlock>(*this)) {
     2262        RenderBlock& block = downcast<RenderBlock>(*this);
     2263
     2264        if (block.cachedFlowThreadContainingBlockNeedsUpdate())
     2265            return;
     2266
     2267        flowThread = block.cachedFlowThreadContainingBlock();
     2268        block.setCachedFlowThreadContainingBlockNeedsUpdate();
     2269    }
     2270
     2271    if (flowThread)
     2272        flowThread->removeFlowChildInfo(this);
     2273
     2274    if (!is<RenderElement>(*this))
     2275        return;
     2276
     2277    for (auto& child : childrenOfType<RenderElement>(*this))
     2278        child.invalidateFlowThreadContainingBlockIncludingDescendants(flowThread);
     2279}
     2280
    22072281#if ENABLE(IOS_TEXT_AUTOSIZING)
    22082282static RenderObject::BlockContentHeightType includeNonFixedHeight(const RenderObject& renderer)
  • trunk/Source/WebCore/rendering/RenderElement.h

    r205997 r206049  
    230230    RespectImageOrientationEnum shouldRespectImageOrientation() const;
    231231
     232    void removeFromRenderFlowThread();
     233    void invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* = nullptr);
     234
    232235protected:
    233236    enum BaseTypeFlag {
     
    285288    void updateOutlineAutoAncestor(bool hasOutlineAuto);
    286289
     290    void removeFromRenderFlowThreadIncludingDescendants(bool shouldUpdateState);
     291
    287292private:
    288293    RenderElement(ContainerNode&, RenderStyle&&, BaseTypeFlags);
  • trunk/Source/WebCore/rendering/RenderFlowThread.cpp

    r200098 r206049  
    9393}
    9494
    95 void RenderFlowThread::removeFlowChildInfo(RenderObject* child)
     95void RenderFlowThread::removeFlowChildInfo(RenderElement* child)
    9696{
    9797    if (is<RenderBlockFlow>(*child))
  • trunk/Source/WebCore/rendering/RenderFlowThread.h

    r204466 r206049  
    6161    virtual ~RenderFlowThread() { }
    6262
    63     virtual void removeFlowChildInfo(RenderObject*);
     63    virtual void removeFlowChildInfo(RenderElement*);
    6464#ifndef NDEBUG
    6565    bool hasChildInfo(RenderObject* child) const { return is<RenderBox>(child) && m_regionRangeMap.contains(downcast<RenderBox>(child)); }
  • trunk/Source/WebCore/rendering/RenderNamedFlowFragment.cpp

    r201040 r206049  
    360360void RenderNamedFlowFragment::computeChildrenStyleInRegion(RenderElement& renderer)
    361361{
    362     for (auto& child : childrenOfType<RenderObject>(renderer)) {
    363 
    364         auto it = m_renderObjectRegionStyle.find(&child);
     362    for (auto& child : childrenOfType<RenderElement>(renderer)) {
     363        auto it = m_rendererRegionStyle.find(&child);
    365364
    366365        std::unique_ptr<RenderStyle> childStyleInRegion;
    367366        bool objectRegionStyleCached = false;
    368         if (it != m_renderObjectRegionStyle.end()) {
     367        if (it != m_rendererRegionStyle.end()) {
    369368            childStyleInRegion = RenderStyle::clonePtr(*it->value.style);
    370369            objectRegionStyleCached = true;
     
    372371            if (child.isAnonymous() || child.isInFlowRenderFlowThread())
    373372                childStyleInRegion =  std::make_unique<RenderStyle>(RenderStyle::createAnonymousStyleWithDisplay(renderer.style(), child.style().display()));
    374             else if (is<RenderText>(child))
    375                 childStyleInRegion = RenderStyle::clonePtr(renderer.style());
    376373            else
    377                 childStyleInRegion = computeStyleInRegion(downcast<RenderElement>(child), renderer.style());
    378         }
    379 
    380         setObjectStyleInRegion(&child, WTFMove(childStyleInRegion), objectRegionStyleCached);
    381 
    382         if (is<RenderElement>(child))
    383             computeChildrenStyleInRegion(downcast<RenderElement>(child));
    384     }
    385 }
    386 
    387 void RenderNamedFlowFragment::setObjectStyleInRegion(RenderObject* object, std::unique_ptr<RenderStyle> styleInRegion, bool objectRegionStyleCached)
    388 {
    389     ASSERT(object->flowThreadContainingBlock());
    390 
    391     std::unique_ptr<RenderStyle> objectOriginalStyle = RenderStyle::clonePtr(object->style());
    392     if (is<RenderElement>(*object))
    393         downcast<RenderElement>(*object).setStyleInternal(WTFMove(*styleInRegion));
    394 
    395     if (is<RenderBoxModelObject>(*object) && !object->hasVisibleBoxDecorations()) {
    396         bool hasVisibleBoxDecorations = is<RenderTableCell>(*object)
    397         || object->style().hasBackground()
    398         || object->style().hasVisibleBorder()
    399         || object->style().hasAppearance()
    400         || object->style().boxShadow();
    401         object->setHasVisibleBoxDecorations(hasVisibleBoxDecorations);
     374                childStyleInRegion = computeStyleInRegion(child, renderer.style());
     375        }
     376
     377        setRendererStyleInRegion(child, WTFMove(childStyleInRegion), objectRegionStyleCached);
     378        computeChildrenStyleInRegion(child);
     379    }
     380}
     381
     382void RenderNamedFlowFragment::setRendererStyleInRegion(RenderElement& renderer, std::unique_ptr<RenderStyle> styleInRegion, bool objectRegionStyleCached)
     383{
     384    ASSERT(renderer.flowThreadContainingBlock());
     385
     386    std::unique_ptr<RenderStyle> objectOriginalStyle = RenderStyle::clonePtr(renderer.style());
     387    renderer.setStyleInternal(WTFMove(*styleInRegion));
     388
     389    if (is<RenderBoxModelObject>(renderer) && !renderer.hasVisibleBoxDecorations()) {
     390        bool hasVisibleBoxDecorations = is<RenderTableCell>(renderer)
     391        || renderer.style().hasBackground()
     392        || renderer.style().hasVisibleBorder()
     393        || renderer.style().hasAppearance()
     394        || renderer.style().boxShadow();
     395        renderer.setHasVisibleBoxDecorations(hasVisibleBoxDecorations);
    402396    }
    403397
     
    405399    styleInfo.style = WTFMove(objectOriginalStyle);
    406400    styleInfo.cached = objectRegionStyleCached;
    407     m_renderObjectRegionStyle.set(object, WTFMove(styleInfo));
    408 }
    409 
    410 void RenderNamedFlowFragment::clearObjectStyleInRegion(const RenderObject* object)
     401    m_rendererRegionStyle.set(&renderer, WTFMove(styleInfo));
     402}
     403
     404void RenderNamedFlowFragment::clearObjectStyleInRegion(const RenderElement* object)
    411405{
    412406    ASSERT(object);
    413     m_renderObjectRegionStyle.remove(object);
     407    m_rendererRegionStyle.remove(object);
    414408
    415409    // Clear the style for the children of this object.
    416     for (RenderObject* child = object->firstChildSlow(); child; child = child->nextSibling())
    417         clearObjectStyleInRegion(child);
     410    for (auto& child : childrenOfType<RenderElement>(*object))
     411        clearObjectStyleInRegion(&child);
    418412}
    419413
     
    432426        if (!element->renderer())
    433427            continue;
    434 
    435         RenderElement* object = element->renderer();
     428        auto& renderer = *element->renderer();
     429
    436430        // If the content node does not flow any of its children in this region,
    437431        // we do not compute any style for them in this region.
    438         if (!flowThread()->objectInFlowRegion(object, this))
     432        if (!flowThread()->objectInFlowRegion(&renderer, this))
    439433            continue;
    440434
    441435        // If the object has style in region, use that instead of computing a new one.
    442         auto it = m_renderObjectRegionStyle.find(object);
     436        auto it = m_rendererRegionStyle.find(&renderer);
    443437        std::unique_ptr<RenderStyle> objectStyleInRegion;
    444438        bool objectRegionStyleCached = false;
    445         if (it != m_renderObjectRegionStyle.end()) {
     439        if (it != m_rendererRegionStyle.end()) {
    446440            objectStyleInRegion = RenderStyle::clonePtr(*it->value.style);
    447441            ASSERT(it->value.cached);
    448442            objectRegionStyleCached = true;
    449443        } else
    450             objectStyleInRegion = computeStyleInRegion(*object, style());
    451 
    452         setObjectStyleInRegion(object, WTFMove(objectStyleInRegion), objectRegionStyleCached);
    453 
    454         computeChildrenStyleInRegion(*object);
     444            objectStyleInRegion = computeStyleInRegion(renderer, style());
     445
     446        setRendererStyleInRegion(renderer, WTFMove(objectStyleInRegion), objectRegionStyleCached);
     447
     448        computeChildrenStyleInRegion(renderer);
    455449    }
    456450}
     
    461455        return;
    462456
    463     RenderObjectRegionStyleMap temp;
    464     for (auto& objectPair : m_renderObjectRegionStyle) {
    465         RenderObject* object = const_cast<RenderObject*>(objectPair.key);
     457    RendererRegionStyleMap temp;
     458    for (auto& objectPair : m_rendererRegionStyle) {
     459        auto* object = const_cast<RenderElement*>(objectPair.key);
    466460        std::unique_ptr<RenderStyle> objectRegionStyle = RenderStyle::clonePtr(object->style());
    467461        std::unique_ptr<RenderStyle> objectOriginalStyle = RenderStyle::clonePtr(*objectPair.value.style);
     
    481475            temp.set(object, WTFMove(styleInfo));
    482476        }
    483         if (is<RenderElement>(*object))
    484             downcast<RenderElement>(*object).setStyleInternal(WTFMove(*objectOriginalStyle));
    485     }
    486 
    487     m_renderObjectRegionStyle.swap(temp);
     477        object->setStyleInternal(WTFMove(*objectOriginalStyle));
     478    }
     479
     480    m_rendererRegionStyle.swap(temp);
    488481}
    489482
  • trunk/Source/WebCore/rendering/RenderNamedFlowFragment.h

    r200098 r206049  
    8080
    8181    bool hasCustomRegionStyle() const { return m_hasCustomRegionStyle; }
    82     void clearObjectStyleInRegion(const RenderObject*);
     82    void clearObjectStyleInRegion(const RenderElement*);
    8383
    8484    void setRegionObjectsRegionStyle();
     
    126126    std::unique_ptr<RenderStyle> computeStyleInRegion(RenderElement&, const RenderStyle& parentStyle) const;
    127127    void computeChildrenStyleInRegion(RenderElement&);
    128     void setObjectStyleInRegion(RenderObject*, std::unique_ptr<RenderStyle>, bool objectRegionStyleCached);
     128    void setRendererStyleInRegion(RenderElement&, std::unique_ptr<RenderStyle>, bool objectRegionStyleCached);
    129129
    130130    void checkRegionStyle();
     
    154154    };
    155155
    156     typedef HashMap<const RenderObject*, ObjectRegionStyleInfo > RenderObjectRegionStyleMap;
    157     RenderObjectRegionStyleMap m_renderObjectRegionStyle;
     156    using RendererRegionStyleMap = HashMap<const RenderElement*, ObjectRegionStyleInfo>;
     157    RendererRegionStyleMap m_rendererRegionStyle;
    158158
    159159    bool m_hasCustomRegionStyle : 1;
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.cpp

    r203601 r206049  
    813813}
    814814
    815 void RenderNamedFlowThread::clearRenderObjectCustomStyle(const RenderObject* object)
     815void RenderNamedFlowThread::clearRenderObjectCustomStyle(const RenderElement* object)
    816816{
    817817    // Clear the styles for the object in the regions.
     
    821821}
    822822
    823 void RenderNamedFlowThread::removeFlowChildInfo(RenderObject* child)
     823void RenderNamedFlowThread::removeFlowChildInfo(RenderElement* child)
    824824{
    825825    RenderFlowThread::removeFlowChildInfo(child);
  • trunk/Source/WebCore/rendering/RenderNamedFlowThread.h

    r200041 r206049  
    9292    void checkRegionsWithStyling();
    9393
    94     void clearRenderObjectCustomStyle(const RenderObject*);
     94    void clearRenderObjectCustomStyle(const RenderElement*);
    9595
    96     void removeFlowChildInfo(RenderObject*) override;
     96    void removeFlowChildInfo(RenderElement*) override;
    9797
    9898    LayoutUnit flowContentBottom() const { return m_flowContentBottom; }
  • trunk/Source/WebCore/rendering/RenderObject.cpp

    r205997 r206049  
    14271427    // FIXME: We should ASSERT(isRooted()) but we have some out-of-order removals which would need to be fixed first.
    14281428
    1429     removeFromRenderFlowThread();
     1429    setFlowThreadState(NotInsideFlowThread);
    14301430
    14311431    // Update cached boundaries in SVG renderers, if a child is removed.
    14321432    parent()->setNeedsBoundariesUpdate();
    1433 }
    1434 
    1435 void RenderObject::removeFromRenderFlowThread()
    1436 {
    1437     if (flowThreadState() == NotInsideFlowThread)
    1438         return;
    1439 
    1440     // Sometimes we remove the element from the flow, but it's not destroyed at that time.
    1441     // It's only until later when we actually destroy it and remove all the children from it.
    1442     // Currently, that happens for firstLetter elements and list markers.
    1443     // Pass in the flow thread so that we don't have to look it up for all the children.
    1444     removeFromRenderFlowThreadIncludingDescendants(true);
    1445 }
    1446 
    1447 void RenderObject::removeFromRenderFlowThreadIncludingDescendants(bool shouldUpdateState)
    1448 {
    1449     // Once we reach another flow thread we don't need to update the flow thread state
    1450     // but we have to continue cleanup the flow thread info.
    1451     if (isRenderFlowThread())
    1452         shouldUpdateState = false;
    1453 
    1454     if (is<RenderElement>(*this)) {
    1455         for (auto& child : childrenOfType<RenderObject>(downcast<RenderElement>(*this)))
    1456             child.removeFromRenderFlowThreadIncludingDescendants(shouldUpdateState);
    1457     }
    1458 
    1459     // We have to ask for our containing flow thread as it may be above the removed sub-tree.
    1460     RenderFlowThread* flowThreadContainingBlock = this->flowThreadContainingBlock();
    1461     while (flowThreadContainingBlock) {
    1462         flowThreadContainingBlock->removeFlowChildInfo(this);
    1463         if (flowThreadContainingBlock->flowThreadState() == NotInsideFlowThread)
    1464             break;
    1465         RenderObject* parent = flowThreadContainingBlock->parent();
    1466         if (!parent)
    1467             break;
    1468         flowThreadContainingBlock = parent->flowThreadContainingBlock();
    1469     }
    1470     if (is<RenderBlock>(*this))
    1471         downcast<RenderBlock>(*this).setCachedFlowThreadContainingBlockNeedsUpdate();
    1472 
    1473     if (shouldUpdateState)
    1474         setFlowThreadState(NotInsideFlowThread);
    1475 }
    1476 
    1477 void RenderObject::invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* flowThread)
    1478 {
    1479     if (flowThreadState() == NotInsideFlowThread)
    1480         return;
    1481 
    1482     if (is<RenderBlock>(*this)) {
    1483         RenderBlock& block = downcast<RenderBlock>(*this);
    1484 
    1485         if (block.cachedFlowThreadContainingBlockNeedsUpdate())
    1486             return;
    1487 
    1488         flowThread = block.cachedFlowThreadContainingBlock();
    1489         block.setCachedFlowThreadContainingBlockNeedsUpdate();
    1490     }
    1491 
    1492     if (flowThread)
    1493         flowThread->removeFlowChildInfo(this);
    1494 
    1495     if (!is<RenderElement>(*this))
    1496         return;
    1497 
    1498     for (auto& child : childrenOfType<RenderObject>(downcast<RenderElement>(*this)))
    1499         child.invalidateFlowThreadContainingBlockIncludingDescendants(flowThread);
    15001433}
    15011434
  • trunk/Source/WebCore/rendering/RenderObject.h

    r205997 r206049  
    817817
    818818    virtual RenderFlowThread* locateFlowThreadContainingBlock() const;
    819     void invalidateFlowThreadContainingBlockIncludingDescendants(RenderFlowThread* = nullptr);
    820819    static void calculateBorderStyleColor(const EBorderStyle&, const BoxSide&, Color&);
    821820
     
    830829    void setLayerNeedsFullRepaintForPositionedMovementLayout();
    831830
    832     void removeFromRenderFlowThread();
    833     void removeFromRenderFlowThreadIncludingDescendants(bool);
    834831    Node* generatingPseudoHostElement() const;
    835832
Note: See TracChangeset for help on using the changeset viewer.