Index: Source/core/frame/LocalFrame.cpp |
diff --git a/Source/core/frame/LocalFrame.cpp b/Source/core/frame/LocalFrame.cpp |
index 365bb0381a686066e5ba2fe36b0bb26730278847..7c852b36fb9cea1ed03e8351197e60cb2319737b 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,27 @@ void LocalFrame::trace(Visitor* visitor) |
visitor->trace(m_eventHandler); |
visitor->trace(m_console); |
visitor->trace(m_inputMethodController); |
+ visitor->registerWeakMembers<LocalFrame, &LocalFrame::clearWeakMembers>(this); |
HeapSupplementable<LocalFrame>::trace(visitor); |
#endif |
Frame::trace(visitor); |
} |
+#if ENABLE(OILPAN) |
+void LocalFrame::clearWeakMembers(Visitor* visitor) |
+{ |
+ Vector<HTMLPlugInElement*> deadPlugins; |
+ for (HashSet<HTMLPlugInElement*>::const_iterator it = m_pluginElements.begin(); it != m_pluginElements.end(); ++it) { |
+ if (!visitor->isAlive(*it)) { |
+ (*it)->shouldDisposePlugin(); |
+ deadPlugins.append(*it); |
+ } |
+ } |
+ for (unsigned i = 0; i < deadPlugins.size(); ++i) |
+ m_pluginElements.remove(deadPlugins[i]); |
+} |
+#endif |
+ |
void LocalFrame::navigate(Document& originDocument, const KURL& url, bool lockBackForwardList) |
{ |
m_navigationScheduler.scheduleLocationChange(&originDocument, url.string(), lockBackForwardList); |
@@ -202,8 +220,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 +467,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 +742,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 (HashSet<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 +772,17 @@ 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(m_pluginElements.contains(plugin)); |
+ m_pluginElements.remove(plugin); |
+} |
+#endif |
+ |
} // namespace blink |