Chromium Code Reviews| Index: Source/core/frame/LocalFrame.cpp |
| diff --git a/Source/core/frame/LocalFrame.cpp b/Source/core/frame/LocalFrame.cpp |
| index 365bb0381a686066e5ba2fe36b0bb26730278847..53d994eb092f0dcdf59400663637b997a5edd976 100644 |
| --- a/Source/core/frame/LocalFrame.cpp |
| +++ b/Source/core/frame/LocalFrame.cpp |
| @@ -48,6 +48,7 @@ |
| #include "core/frame/LocalDOMWindow.h" |
| #include "core/frame/Settings.h" |
| #include "core/html/HTMLFrameElementBase.h" |
| +#include "core/html/HTMLPlugInElement.h" |
| #include "core/inspector/ConsoleMessageStorage.h" |
| #include "core/inspector/InspectorInstrumentation.h" |
| #include "core/loader/FrameLoaderClient.h" |
| @@ -145,6 +146,7 @@ void LocalFrame::trace(Visitor* visitor) |
| visitor->trace(m_destructionObservers); |
| visitor->trace(m_loader); |
| visitor->trace(m_navigationScheduler); |
| + visitor->trace(m_view); |
| visitor->trace(m_pagePopupOwner); |
| visitor->trace(m_script); |
| visitor->trace(m_editor); |
| @@ -153,11 +155,23 @@ void LocalFrame::trace(Visitor* visitor) |
| visitor->trace(m_eventHandler); |
| visitor->trace(m_console); |
| visitor->trace(m_inputMethodController); |
| + visitor->trace(m_pluginElements); |
|
haraken
2014/10/11 17:33:02
Is it safe to trace m_pluginElements? There is no
sof
2014/10/12 08:16:22
It is safe with the weak callback stack that the i
haraken
2014/10/12 12:56:04
I'm suggesting the first one :)
If I'm understand
sof
2014/10/12 13:09:12
It does not always return true; if no one has mark
haraken
2014/10/12 13:38:23
Do you know how it's guaranteed that weak processi
sof
2014/10/12 16:22:13
There are no such guarantees, but the weak callbac
sof
2014/10/12 18:35:36
I've switched m_pluginElements to HashSet<HTMLPlug
|
| + visitor->registerWeakMembers<LocalFrame, &LocalFrame::clearWeakMembers>(this); |
| HeapSupplementable<LocalFrame>::trace(visitor); |
| #endif |
| Frame::trace(visitor); |
| } |
| +#if ENABLE(OILPAN) |
| +void LocalFrame::clearWeakMembers(Visitor* visitor) |
| +{ |
| + for (HeapHashSet<WeakMember<HTMLPlugInElement> >::const_iterator it = m_pluginElements.begin(); it != m_pluginElements.end(); ++it) { |
| + if (!visitor->isAlive(*it)) |
| + (*it)->shouldDisposePlugin(); |
|
haraken
2014/10/11 17:33:02
shouldDisposePlugin() only does simple things and
sof
2014/10/12 08:16:22
How would you know if the LocalFrame is still aliv
haraken
2014/10/12 12:56:04
I'm a bit confused. Pre-finalizers are invoked bef
sof
2014/10/12 13:09:12
It's still alive, yes. But the plugin is allowed t
haraken
2014/10/12 13:38:23
I agree that dispose() does a bunch of things, but
sof
2014/10/12 16:22:13
Yes, it does not, but it should only be called/sig
|
| + } |
| +} |
| +#endif |
| + |
| void LocalFrame::navigate(Document& originDocument, const KURL& url, bool lockBackForwardList) |
| { |
| m_navigationScheduler.scheduleLocationChange(&originDocument, url.string(), lockBackForwardList); |
| @@ -202,8 +216,9 @@ void LocalFrame::detachView() |
| m_view->prepareForDetach(); |
| } |
| -void LocalFrame::setView(PassRefPtr<FrameView> view) |
| +void LocalFrame::setView(PassRefPtrWillBeRawPtr<FrameView> view) |
| { |
| + ASSERT(!m_view || m_view != view); |
| detachView(); |
| // Prepare for destruction now, so any unload event handlers get run and the LocalDOMWindow is |
| @@ -448,7 +463,7 @@ void LocalFrame::createView(const IntSize& viewportSize, const Color& background |
| setView(nullptr); |
| - RefPtr<FrameView> frameView; |
| + RefPtrWillBeRawPtr<FrameView> frameView = nullptr; |
| if (isLocalRoot) { |
| frameView = FrameView::create(this, viewportSize); |
| @@ -723,6 +738,12 @@ void LocalFrame::disconnectOwnerElement() |
| if (Document* document = this->document()) |
| document->topDocument().clearAXObjectCache(); |
| #if ENABLE(OILPAN) |
| + // First give the plugin elements holding persisted, |
| + // renderer-less plugins the opportunity to dispose of them. |
| + for (HeapHashSet<WeakMember<HTMLPlugInElement> >::const_iterator it = m_pluginElements.begin(); it != m_pluginElements.end(); ++it) |
| + (*it)->disconnectContentFrame(); |
| + m_pluginElements.clear(); |
| + |
| // Clear the FrameView and FrameLoader right here rather than |
| // during finalization. Too late to access various heap objects |
| // at that stage. |
| @@ -747,4 +768,18 @@ void LocalFrame::setPagePopupOwner(Element& owner) |
| m_pagePopupOwner = &owner; |
| } |
| +#if ENABLE(OILPAN) |
| +void LocalFrame::registerPluginElement(HTMLPlugInElement* plugin) |
| +{ |
| + m_pluginElements.add(plugin); |
| +} |
| + |
| +void LocalFrame::unregisterPluginElement(HTMLPlugInElement* plugin) |
| +{ |
| + ASSERT(!ThreadState::current()->isSweepInProgress()); |
|
haraken
2014/10/11 17:33:02
I wanted to add this check since it would cause an
sof
2014/10/12 08:16:22
Gone :)
|
| + ASSERT(m_pluginElements.contains(plugin)); |
| + m_pluginElements.remove(plugin); |
| +} |
| +#endif |
| + |
| } // namespace blink |