Changeset 222932 in webkit
- Timestamp:
- Oct 5, 2017 2:14:44 PM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r222928 r222932 1 2017-10-05 Zalan Bujtas <zalan@apple.com> 2 3 RenderButton should not hold raw pointers to its direct children. 4 https://bugs.webkit.org/show_bug.cgi?id=177960 5 <rdar://problem/34840807> 6 7 Reviewed by Antti Koivisto. 8 9 The correct way of destroying a renderer is to call ::removeFromParentAndDestroy(). 10 11 Covered by existing tests. 12 13 * rendering/RenderButton.cpp: 14 (WebCore::RenderButton::RenderButton): 15 (WebCore::RenderButton::addChild): 16 (WebCore::RenderButton::takeChild): 17 (WebCore::RenderButton::updateAnonymousChildStyle const): 18 (WebCore::RenderButton::setText): 19 (WebCore::RenderButton::text const): 20 * rendering/RenderButton.h: 21 1 22 2017-10-05 David Kilzer <ddkilzer@apple.com> 2 23 -
trunk/Source/WebCore/rendering/RenderButton.cpp
r222679 r222932 40 40 RenderButton::RenderButton(HTMLFormControlElement& element, RenderStyle&& style) 41 41 : RenderFlexibleBox(element, WTFMove(style)) 42 , m_buttonText(0)43 , m_inner(0)44 42 { 45 43 } … … 71 69 auto newInner = createAnonymousBlock(style().display()); 72 70 updateAnonymousChildStyle(*newInner, newInner->mutableStyle()); 73 m_inner = newInner.get();71 m_inner = makeWeakPtr(*newInner); 74 72 RenderFlexibleBox::addChild(WTFMove(newInner)); 75 } 76 73 } 77 74 m_inner->addChild(WTFMove(newChild), beforeChild); 78 75 } … … 85 82 if (&oldChild == m_inner || !m_inner || oldChild.parent() == this) { 86 83 ASSERT(&oldChild == m_inner || !m_inner); 87 m_inner = nullptr;88 84 return RenderFlexibleBox::takeChild(oldChild); 89 85 } … … 94 90 { 95 91 ASSERT_UNUSED(child, !m_inner || &child == m_inner); 96 97 92 childStyle.setFlexGrow(1.0f); 98 93 // min-width: 0; is needed for correct shrinking. … … 121 116 void RenderButton::setText(const String& str) 122 117 { 123 if (str.isEmpty()) { 124 if (m_buttonText) { 125 m_buttonText->destroy(); 126 m_buttonText = 0; 127 } 128 } else { 129 if (m_buttonText) 130 m_buttonText->setText(str.impl()); 131 else { 132 auto newButtonText = createRenderer<RenderTextFragment>(document(), str); 133 m_buttonText = newButtonText.get(); 134 addChild(WTFMove(newButtonText)); 135 } 118 if (!m_buttonText && str.isEmpty()) 119 return; 120 121 if (!m_buttonText) { 122 auto newButtonText = createRenderer<RenderTextFragment>(document(), str); 123 m_buttonText = makeWeakPtr(*newButtonText); 124 addChild(WTFMove(newButtonText)); 125 return; 136 126 } 127 128 if (!str.isEmpty()) { 129 m_buttonText->setText(str.impl()); 130 return; 131 } 132 m_buttonText->removeFromParentAndDestroy(); 137 133 } 138 134 139 135 String RenderButton::text() const 140 136 { 141 return m_buttonText ? m_buttonText->text() : 0; 137 if (m_buttonText) 138 return m_buttonText->text(); 139 return { }; 142 140 } 143 141 -
trunk/Source/WebCore/rendering/RenderButton.h
r222679 r222932 71 71 bool isFlexibleBoxImpl() const override { return true; } 72 72 73 RenderTextFragment*m_buttonText;74 RenderBlock*m_inner;73 WeakPtr<RenderTextFragment> m_buttonText; 74 WeakPtr<RenderBlock> m_inner; 75 75 }; 76 76
Note: See TracChangeset
for help on using the changeset viewer.