Chromium Code Reviews| Index: Source/core/rendering/RenderScrollbar.cpp |
| diff --git a/Source/core/rendering/RenderScrollbar.cpp b/Source/core/rendering/RenderScrollbar.cpp |
| index 34e5998a3565ebdce0dba4d1ccf80b018ed67d0e..bab0e5b72fe701fb3e46e899f91d791592805814 100644 |
| --- a/Source/core/rendering/RenderScrollbar.cpp |
| +++ b/Source/core/rendering/RenderScrollbar.cpp |
| @@ -36,15 +36,18 @@ |
| namespace blink { |
| -PassRefPtr<Scrollbar> RenderScrollbar::createCustomScrollbar(ScrollableArea* scrollableArea, ScrollbarOrientation orientation, Node* ownerNode, LocalFrame* owningFrame) |
| +PassRefPtrWillBeRawPtr<Scrollbar> RenderScrollbar::createCustomScrollbar(ScrollableArea* scrollableArea, ScrollbarOrientation orientation, Node* ownerNode, LocalFrame* owningFrame) |
| { |
| - return adoptRef(new RenderScrollbar(scrollableArea, orientation, ownerNode, owningFrame)); |
| + return adoptRefWillBeNoop(new RenderScrollbar(scrollableArea, orientation, ownerNode, owningFrame)); |
| } |
| RenderScrollbar::RenderScrollbar(ScrollableArea* scrollableArea, ScrollbarOrientation orientation, Node* ownerNode, LocalFrame* owningFrame) |
| : Scrollbar(scrollableArea, orientation, RegularScrollbar, RenderScrollbarTheme::renderScrollbarTheme()) |
| , m_owner(ownerNode) |
| , m_owningFrame(owningFrame) |
| +#if ENABLE(OILPAN) |
| + , m_updatePartsMap(true) |
| +#endif |
| { |
| ASSERT(ownerNode || owningFrame); |
| @@ -64,19 +67,48 @@ RenderScrollbar::RenderScrollbar(ScrollableArea* scrollableArea, ScrollbarOrient |
| height = this->height(); |
| setFrameRect(IntRect(0, 0, width, height)); |
| + |
| +#if ENABLE(OILPAN) |
| + ThreadState::current()->registerPreFinalizer(*this); |
| +#endif |
| } |
| RenderScrollbar::~RenderScrollbar() |
| { |
| - if (!m_parts.isEmpty()) { |
| - // When a scrollbar is detached from its parent (causing all parts removal) and |
| - // ready to be destroyed, its destruction can be delayed because of RefPtr |
| - // maintained in other classes such as EventHandler (m_lastScrollbarUnderMouse). |
| - // Meanwhile, we can have a call to updateScrollbarPart which recreates the |
| - // scrollbar part. So, we need to destroy these parts since we don't want them |
| - // to call on a destroyed scrollbar. See webkit bug 68009. |
| - updateScrollbarParts(true); |
| - } |
| + // Oilpan: to be able to access the hash map that's |
| + // also on the heap, a pre-destruction finalizer is used. |
| +#if !ENABLE(OILPAN) |
| + destroyParts(); |
| +#endif |
| +} |
| + |
| +void RenderScrollbar::destroyParts() |
| +{ |
| + if (m_parts.isEmpty()) |
| + return; |
| + |
| +#if ENABLE(OILPAN) |
| + m_updatePartsMap = false; |
| +#endif |
| + |
| + // When a scrollbar is detached from its parent (causing all parts removal) and |
| + // ready to be destroyed, its destruction can be delayed because of RefPtr |
| + // maintained in other classes such as EventHandler (m_lastScrollbarUnderMouse). |
| + // Meanwhile, we can have a call to updateScrollbarPart which recreates the |
| + // scrollbar part. So, we need to destroy these parts since we don't want them |
| + // to call on a destroyed scrollbar. See webkit bug 68009. |
| + // |
| + updateScrollbarParts(true); |
| +} |
| + |
| +void RenderScrollbar::trace(Visitor* visitor) |
| +{ |
| +#if ENABLE(OILPAN) |
| + visitor->trace(m_owner); |
| + visitor->trace(m_owningFrame); |
| + visitor->trace(m_parts); |
| +#endif |
| + Scrollbar::trace(visitor); |
| } |
| RenderBox* RenderScrollbar::owningRenderer() const |
| @@ -242,12 +274,19 @@ void RenderScrollbar::updateScrollbarPart(ScrollbarPart partType, bool destroy) |
| } |
| } |
| +#if ENABLE(OILPAN) |
| + const bool updatePartsMap = m_updatePartsMap; |
| +#else |
| + const bool updatePartsMap = true; |
| +#endif |
| RenderScrollbarPart* partRenderer = m_parts.get(partType); |
| if (!partRenderer && needRenderer) { |
| partRenderer = RenderScrollbarPart::createAnonymous(&owningRenderer()->document(), this, partType); |
| - m_parts.set(partType, partRenderer); |
| + if (updatePartsMap) |
|
haraken
2014/10/10 02:50:32
Why do you need this condition? Given that m_parts
sof
2014/10/10 05:22:19
ok, I simply prefer not to rely on there being no
sof
2014/10/10 08:40:55
To drive things forward, dropped the flag & rely o
|
| + m_parts.set(partType, partRenderer); |
| } else if (partRenderer && !needRenderer) { |
| - m_parts.remove(partType); |
| + if (updatePartsMap) |
| + m_parts.remove(partType); |
| partRenderer->destroy(); |
| partRenderer = 0; |
| } |