Changeset 222932 in webkit


Ignore:
Timestamp:
Oct 5, 2017 2:14:44 PM (7 years ago)
Author:
Alan Bujtas
Message:

RenderButton should not hold raw pointers to its direct children.
https://bugs.webkit.org/show_bug.cgi?id=177960
<rdar://problem/34840807>

Reviewed by Antti Koivisto.

The correct way of destroying a renderer is to call ::removeFromParentAndDestroy().

Covered by existing tests.

  • rendering/RenderButton.cpp:

(WebCore::RenderButton::RenderButton):
(WebCore::RenderButton::addChild):
(WebCore::RenderButton::takeChild):
(WebCore::RenderButton::updateAnonymousChildStyle const):
(WebCore::RenderButton::setText):
(WebCore::RenderButton::text const):

  • rendering/RenderButton.h:
Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r222928 r222932  
     12017-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
    1222017-10-05  David Kilzer  <ddkilzer@apple.com>
    223
  • trunk/Source/WebCore/rendering/RenderButton.cpp

    r222679 r222932  
    4040RenderButton::RenderButton(HTMLFormControlElement& element, RenderStyle&& style)
    4141    : RenderFlexibleBox(element, WTFMove(style))
    42     , m_buttonText(0)
    43     , m_inner(0)
    4442{
    4543}
     
    7169        auto newInner = createAnonymousBlock(style().display());
    7270        updateAnonymousChildStyle(*newInner, newInner->mutableStyle());
    73         m_inner = newInner.get();
     71        m_inner = makeWeakPtr(*newInner);
    7472        RenderFlexibleBox::addChild(WTFMove(newInner));
    75     }
    76    
     73    }   
    7774    m_inner->addChild(WTFMove(newChild), beforeChild);
    7875}
     
    8582    if (&oldChild == m_inner || !m_inner || oldChild.parent() == this) {
    8683        ASSERT(&oldChild == m_inner || !m_inner);
    87         m_inner = nullptr;
    8884        return RenderFlexibleBox::takeChild(oldChild);
    8985    }
     
    9490{
    9591    ASSERT_UNUSED(child, !m_inner || &child == m_inner);
    96    
    9792    childStyle.setFlexGrow(1.0f);
    9893    // min-width: 0; is needed for correct shrinking.
     
    121116void RenderButton::setText(const String& str)
    122117{
    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;
    136126    }
     127
     128    if (!str.isEmpty()) {
     129        m_buttonText->setText(str.impl());
     130        return;
     131    }
     132    m_buttonText->removeFromParentAndDestroy();
    137133}
    138134
    139135String RenderButton::text() const
    140136{
    141     return m_buttonText ? m_buttonText->text() : 0;
     137    if (m_buttonText)
     138        return m_buttonText->text();
     139    return { };
    142140}
    143141
  • trunk/Source/WebCore/rendering/RenderButton.h

    r222679 r222932  
    7171    bool isFlexibleBoxImpl() const override { return true; }
    7272
    73     RenderTextFragment* m_buttonText;
    74     RenderBlock* m_inner;
     73    WeakPtr<RenderTextFragment> m_buttonText;
     74    WeakPtr<RenderBlock> m_inner;
    7575};
    7676
Note: See TracChangeset for help on using the changeset viewer.