Changeset 175505 in webkit
- Timestamp:
- Nov 3, 2014 6:35:45 PM (9 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r175496 r175505 1 2014-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 1 46 2014-11-03 Gyuyoung Kim <gyuyoung.kim@samsung.com> 2 47 -
trunk/Source/WebCore/rendering/RenderElement.cpp
r175352 r175505 522 522 { 523 523 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. 526 526 } else { 527 527 // 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 46 46 RenderListItem::RenderListItem(Element& element, PassRef<RenderStyle> style) 47 47 : RenderBlockFlow(element, WTF::move(style)) 48 , m_marker(nullptr) 48 49 , m_hasExplicitValue(false) 49 50 , m_isValueUpToDate(false) … … 53 54 } 54 55 56 RenderListItem::~RenderListItem() 57 { 58 ASSERT(!m_marker || !m_marker->parent()); 59 if (m_marker) { 60 m_marker->destroy(); 61 ASSERT(!m_marker); 62 } 63 } 64 55 65 void RenderListItem::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) 56 66 { … … 58 68 59 69 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 } 61 74 return; 62 75 } … … 67 80 newStyle.get().inheritFrom(&style()); 68 81 if (!m_marker) { 69 m_marker = createRenderer<RenderListMarker>(*this, WTF::move(newStyle)) ;82 m_marker = createRenderer<RenderListMarker>(*this, WTF::move(newStyle)).leakPtr(); 70 83 m_marker->initializeStyle(); 71 84 } else 72 85 m_marker->setStyle(WTF::move(newStyle)); 73 }74 75 void RenderListItem::willBeDestroyed()76 {77 m_marker = nullptr;78 RenderBlockFlow::willBeDestroyed();79 86 } 80 87 … … 274 281 275 282 RenderElement* currentParent = m_marker->parent(); 276 RenderBlock* newParent = getParentOfFirstLineBox(this, m_marker .get());283 RenderBlock* newParent = getParentOfFirstLineBox(this, m_marker); 277 284 if (!newParent) { 278 285 // If the marker is currently contained inside an anonymous box, … … 293 300 LayoutStateDisabler layoutStateDisabler(&view()); 294 301 m_marker->removeFromParent(); 295 newParent->addChild(m_marker .get(), firstNonMarkerChild(newParent));302 newParent->addChild(m_marker, firstNonMarkerChild(newParent)); 296 303 m_marker->updateMarginsAndContent(); 297 304 // If current parent is an anonymous block that has lost all its children, destroy it. … … 401 408 if (!style().isHorizontalWritingMode()) 402 409 markerRect = markerRect.transposedRect(); 403 RenderBox* o = m_marker .get();410 RenderBox* o = m_marker; 404 411 bool propagateVisualOverflow = true; 405 412 bool propagateLayoutOverflow = true; -
trunk/Source/WebCore/rendering/RenderListItem.h
r174759 r175505 35 35 public: 36 36 RenderListItem(Element&, PassRef<RenderStyle>); 37 virtual ~RenderListItem(); 37 38 Element& element() const { return downcast<Element>(nodeForNonAnonymous()); } 38 39 … … 56 57 static unsigned itemCountForOrderedList(const HTMLOListElement*); 57 58 59 void didDestroyListMarker() { m_marker = nullptr; } 60 58 61 private: 59 62 virtual const char* renderName() const override { return "RenderListItem"; } … … 61 64 virtual bool isListItem() const override { return true; } 62 65 63 virtual void willBeDestroyed() override;64 65 66 virtual void insertedIntoTree() override; 66 67 virtual void willBeRemovedFromTree() override; … … 86 87 87 88 int m_explicitValue; 88 Render Ptr<RenderListMarker>m_marker;89 RenderListMarker* m_marker; 89 90 mutable int m_value; 90 91 -
trunk/Source/WebCore/rendering/RenderListMarker.cpp
r173212 r175505 1129 1129 RenderListMarker::~RenderListMarker() 1130 1130 { 1131 m_listItem.didDestroyListMarker(); 1131 1132 if (m_image) 1132 1133 m_image->removeClient(this);
Note: See TracChangeset
for help on using the changeset viewer.