| Index: Source/core/html/HTMLFrameOwnerElement.cpp | 
| diff --git a/Source/core/html/HTMLFrameOwnerElement.cpp b/Source/core/html/HTMLFrameOwnerElement.cpp | 
| index b3ec7bfdd804dd385b57f855fe8af018a5420162..9362ee5df9af0740f40986288a08496e987619fd 100644 | 
| --- a/Source/core/html/HTMLFrameOwnerElement.cpp | 
| +++ b/Source/core/html/HTMLFrameOwnerElement.cpp | 
| @@ -30,6 +30,7 @@ | 
| #include "core/frame/LocalFrame.h" | 
| #include "core/loader/FrameLoader.h" | 
| #include "core/loader/FrameLoaderClient.h" | 
| +#include "core/plugins/PluginView.h" | 
| #include "core/rendering/RenderLayer.h" | 
| #include "core/rendering/RenderPart.h" | 
| #include "core/rendering/compositing/RenderLayerCompositor.h" | 
| @@ -37,11 +38,11 @@ | 
|  | 
| namespace blink { | 
|  | 
| -typedef HashMap<RefPtr<Widget>, FrameView*> WidgetToParentMap; | 
| +typedef WillBeHeapHashMap<RefPtrWillBeMember<Widget>, RawPtrWillBeMember<FrameView> > WidgetToParentMap; | 
| static WidgetToParentMap& widgetNewParentMap() | 
| { | 
| -    DEFINE_STATIC_LOCAL(WidgetToParentMap, map, ()); | 
| -    return map; | 
| +    DEFINE_STATIC_LOCAL(OwnPtrWillBePersistent<WidgetToParentMap>, map, (adoptPtrWillBeNoop(new WidgetToParentMap()))); | 
| +    return *map; | 
| } | 
|  | 
| WillBeHeapHashCountedSet<RawPtrWillBeMember<Node> >& SubframeLoadingDisabler::disabledSubtreeRoots() | 
| @@ -71,6 +72,10 @@ void HTMLFrameOwnerElement::UpdateSuspendScope::performDeferredWidgetTreeOperati | 
| currentParent->removeChild(child); | 
| if (newParent) | 
| newParent->addChild(child); | 
| +#if ENABLE(OILPAN) | 
| +            if (currentParent && !newParent) | 
| +                child->dispose(); | 
| +#endif | 
| } | 
| } | 
| } | 
| @@ -86,10 +91,14 @@ HTMLFrameOwnerElement::UpdateSuspendScope::~UpdateSuspendScope() | 
| static void moveWidgetToParentSoon(Widget* child, FrameView* parent) | 
| { | 
| if (!s_updateSuspendCount) { | 
| -        if (parent) | 
| +        if (parent) { | 
| parent->addChild(child); | 
| -        else if (toScrollView(child->parent())) | 
| +        } else if (toScrollView(child->parent())) { | 
| toScrollView(child->parent())->removeChild(child); | 
| +#if ENABLE(OILPAN) | 
| +            child->dispose(); | 
| +#endif | 
| +        } | 
| return; | 
| } | 
| widgetNewParentMap().set(child, parent); | 
| @@ -143,17 +152,18 @@ void HTMLFrameOwnerElement::disconnectContentFrame() | 
| // see if this behavior is really needed as Gecko does not allow this. | 
| if (RefPtrWillBeRawPtr<Frame> frame = contentFrame()) { | 
| frame->detach(); | 
| -#if ENABLE(OILPAN) | 
| -        // FIXME: Oilpan: the plugin container is released and finalized here | 
| -        // in order to work around the current inability to make the plugin | 
| -        // container a FrameDestructionObserver (it needs to effectively be on | 
| -        // the heap, and Widget isn't). Hence, release it here while its | 
| -        // frame reference is still valid. | 
| -        if (m_widget && m_widget->isPluginContainer()) | 
| -            m_widget = nullptr; | 
| -#endif | 
| frame->disconnectOwnerElement(); | 
| } | 
| +#if ENABLE(OILPAN) | 
| +    // Oilpan: a plugin container must be explicitly disposed before it | 
| +    // is swept and finalized. This is because the underlying plugin needs | 
| +    // to be able to access a fully-functioning frame (and all it refers | 
| +    // to) while it destructs and cleans out its resources. | 
| +    if (m_widget) { | 
| +        m_widget->dispose(); | 
| +        m_widget = nullptr; | 
| +    } | 
| +#endif | 
| } | 
|  | 
| HTMLFrameOwnerElement::~HTMLFrameOwnerElement() | 
| @@ -201,7 +211,7 @@ Document* HTMLFrameOwnerElement::getSVGDocument(ExceptionState& exceptionState) | 
| return 0; | 
| } | 
|  | 
| -void HTMLFrameOwnerElement::setWidget(PassRefPtr<Widget> widget) | 
| +void HTMLFrameOwnerElement::setWidget(PassRefPtrWillBeRawPtr<Widget> widget) | 
| { | 
| if (widget == m_widget) | 
| return; | 
| @@ -257,6 +267,7 @@ bool HTMLFrameOwnerElement::loadOrRedirectSubframe(const KURL& url, const Atomic | 
| void HTMLFrameOwnerElement::trace(Visitor* visitor) | 
| { | 
| visitor->trace(m_contentFrame); | 
| +    visitor->trace(m_widget); | 
| HTMLElement::trace(visitor); | 
| FrameOwner::trace(visitor); | 
| } | 
|  |