Changeset 175505 in webkit


Ignore:
Timestamp:
Nov 3, 2014 6:35:45 PM (9 years ago)
Author:
akling@apple.com
Message:

Clarify RenderListMarker ownership model.
<https://webkit.org/b/138329>

Reviewed by Antti Koivisto.

A RenderListMarker is either in-tree and owned by the tree, or out-of-tree
and owned by a RenderListItem.

This patch changes RenderListItem::m_marker to be a raw pointer, and removes
the special handling of list markers in RenderElement child teardown.

We also remove the willBeDestroyed() hook. It was used to clear out the
m_marker pointer, but this is now done in the regular ~RenderListItem()
destructor with an assertion for marker sanity. m_marker is automatically
nulled out by a didDestroyListMarker() callback on RenderListItem.

  • rendering/RenderElement.cpp:

(WebCore::RenderElement::destroyLeftoverChildren):

Removed special handling of list marker renderers when deleting a
RenderElement's children.

  • rendering/RenderListItem.cpp:

(WebCore::RenderListItem::RenderListItem):
(WebCore::RenderListItem::~RenderListItem):
(WebCore::RenderListItem::styleDidChange):
(WebCore::RenderListItem::insertOrMoveMarkerRendererIfNeeded):
(WebCore::RenderListItem::positionListMarker):

Made m_marker a raw pointer instead of a RenderPtr since the ownership
really switches between weak and strong reference.

(WebCore::RenderListItem::willBeDestroyed):

  • rendering/RenderListMarker.cpp:

(WebCore::RenderListMarker::~RenderListMarker):

Added a regular destructor to replace the willBeDestroyed() hook.

  • rendering/RenderListItem.h:

(WebCore::RenderListItem::didDestroyListMarker):

Added. Called by ~RenderListMarker to null out RenderListItem::m_marker.

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r175496 r175505  
     12014-11-03  Andreas Kling  <akling@apple.com>
     2
     3        Clarify RenderListMarker ownership model.
     4        <https://webkit.org/b/138329>
     5
     6        Reviewed by Antti Koivisto.
     7
     8        A RenderListMarker is either in-tree and owned by the tree, or out-of-tree
     9        and owned by a RenderListItem.
     10
     11        This patch changes RenderListItem::m_marker to be a raw pointer, and removes
     12        the special handling of list markers in RenderElement child teardown.
     13
     14        We also remove the willBeDestroyed() hook. It was used to clear out the
     15        m_marker pointer, but this is now done in the regular ~RenderListItem()
     16        destructor with an assertion for marker sanity. m_marker is automatically
     17        nulled out by a didDestroyListMarker() callback on RenderListItem.
     18
     19        * rendering/RenderElement.cpp:
     20        (WebCore::RenderElement::destroyLeftoverChildren):
     21
     22            Removed special handling of list marker renderers when deleting a
     23            RenderElement's children.
     24
     25        * rendering/RenderListItem.cpp:
     26        (WebCore::RenderListItem::RenderListItem):
     27        (WebCore::RenderListItem::~RenderListItem):
     28        (WebCore::RenderListItem::styleDidChange):
     29        (WebCore::RenderListItem::insertOrMoveMarkerRendererIfNeeded):
     30        (WebCore::RenderListItem::positionListMarker):
     31
     32            Made m_marker a raw pointer instead of a RenderPtr since the ownership
     33            really switches between weak and strong reference.
     34
     35        (WebCore::RenderListItem::willBeDestroyed):
     36        * rendering/RenderListMarker.cpp:
     37        (WebCore::RenderListMarker::~RenderListMarker):
     38
     39            Added a regular destructor to replace the willBeDestroyed() hook.
     40
     41        * rendering/RenderListItem.h:
     42        (WebCore::RenderListItem::didDestroyListMarker):
     43
     44            Added. Called by ~RenderListMarker to null out RenderListItem::m_marker.
     45
    1462014-11-03  Gyuyoung Kim  <gyuyoung.kim@samsung.com>
    247
  • trunk/Source/WebCore/rendering/RenderElement.cpp

    r175352 r175505  
    522522{
    523523    while (m_firstChild) {
    524         if (m_firstChild->isListMarker() || (m_firstChild->style().styleType() == FIRST_LETTER && !m_firstChild->isText())) {
    525             m_firstChild->removeFromParent(); // List markers are owned by their enclosing list and so don't get destroyed by this container. Similarly, first letters are destroyed by their remaining text fragment.
     524        if (m_firstChild->style().styleType() == FIRST_LETTER && !m_firstChild->isText()) {
     525            m_firstChild->removeFromParent(); // :first-letter fragment renderers are destroyed by their remaining text fragment.
    526526        } else {
    527527            // Destroy any anonymous children remaining in the render tree, as well as implicit (shadow) DOM elements like those used in the engine-based text fields.
  • trunk/Source/WebCore/rendering/RenderListItem.cpp

    r174759 r175505  
    4646RenderListItem::RenderListItem(Element& element, PassRef<RenderStyle> style)
    4747    : RenderBlockFlow(element, WTF::move(style))
     48    , m_marker(nullptr)
    4849    , m_hasExplicitValue(false)
    4950    , m_isValueUpToDate(false)
     
    5354}
    5455
     56RenderListItem::~RenderListItem()
     57{
     58    ASSERT(!m_marker || !m_marker->parent());
     59    if (m_marker) {
     60        m_marker->destroy();
     61        ASSERT(!m_marker);
     62    }
     63}
     64
    5565void RenderListItem::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
    5666{
     
    5868
    5969    if (style().listStyleType() == NoneListStyle && (!style().listStyleImage() || style().listStyleImage()->errorOccurred())) {
    60         m_marker = nullptr;
     70        if (m_marker) {
     71            m_marker->destroy();
     72            ASSERT(!m_marker);
     73        }
    6174        return;
    6275    }
     
    6780    newStyle.get().inheritFrom(&style());
    6881    if (!m_marker) {
    69         m_marker = createRenderer<RenderListMarker>(*this, WTF::move(newStyle));
     82        m_marker = createRenderer<RenderListMarker>(*this, WTF::move(newStyle)).leakPtr();
    7083        m_marker->initializeStyle();
    7184    } else
    7285        m_marker->setStyle(WTF::move(newStyle));
    73 }
    74 
    75 void RenderListItem::willBeDestroyed()
    76 {
    77     m_marker = nullptr;
    78     RenderBlockFlow::willBeDestroyed();
    7986}
    8087
     
    274281
    275282    RenderElement* currentParent = m_marker->parent();
    276     RenderBlock* newParent = getParentOfFirstLineBox(this, m_marker.get());
     283    RenderBlock* newParent = getParentOfFirstLineBox(this, m_marker);
    277284    if (!newParent) {
    278285        // If the marker is currently contained inside an anonymous box,
     
    293300        LayoutStateDisabler layoutStateDisabler(&view());
    294301        m_marker->removeFromParent();
    295         newParent->addChild(m_marker.get(), firstNonMarkerChild(newParent));
     302        newParent->addChild(m_marker, firstNonMarkerChild(newParent));
    296303        m_marker->updateMarginsAndContent();
    297304        // If current parent is an anonymous block that has lost all its children, destroy it.
     
    401408            if (!style().isHorizontalWritingMode())
    402409                markerRect = markerRect.transposedRect();
    403             RenderBox* o = m_marker.get();
     410            RenderBox* o = m_marker;
    404411            bool propagateVisualOverflow = true;
    405412            bool propagateLayoutOverflow = true;
  • trunk/Source/WebCore/rendering/RenderListItem.h

    r174759 r175505  
    3535public:
    3636    RenderListItem(Element&, PassRef<RenderStyle>);
     37    virtual ~RenderListItem();
    3738    Element& element() const { return downcast<Element>(nodeForNonAnonymous()); }
    3839
     
    5657    static unsigned itemCountForOrderedList(const HTMLOListElement*);
    5758
     59    void didDestroyListMarker() { m_marker = nullptr; }
     60
    5861private:
    5962    virtual const char* renderName() const override { return "RenderListItem"; }
     
    6164    virtual bool isListItem() const override { return true; }
    6265   
    63     virtual void willBeDestroyed() override;
    64 
    6566    virtual void insertedIntoTree() override;
    6667    virtual void willBeRemovedFromTree() override;
     
    8687
    8788    int m_explicitValue;
    88     RenderPtr<RenderListMarker> m_marker;
     89    RenderListMarker* m_marker;
    8990    mutable int m_value;
    9091
  • trunk/Source/WebCore/rendering/RenderListMarker.cpp

    r173212 r175505  
    11291129RenderListMarker::~RenderListMarker()
    11301130{
     1131    m_listItem.didDestroyListMarker();
    11311132    if (m_image)
    11321133        m_image->removeClient(this);
Note: See TracChangeset for help on using the changeset viewer.