Index: Source/web/WebPluginContainerImpl.cpp |
diff --git a/Source/web/WebPluginContainerImpl.cpp b/Source/web/WebPluginContainerImpl.cpp |
index 4adc15c159fa4b21adddec32ae9ebe0091593cd1..5ac64db363e1b5bec7e62a6a903b1038eef1f9ef 100644 |
--- a/Source/web/WebPluginContainerImpl.cpp |
+++ b/Source/web/WebPluginContainerImpl.cpp |
@@ -175,7 +175,7 @@ void WebPluginContainerImpl::handleEvent(Event* event) |
if (!m_webPlugin->acceptsInputEvents()) |
return; |
- RefPtr<WebPluginContainerImpl> protector(this); |
+ RefPtrWillBeRawPtr<WebPluginContainerImpl> protect(this); |
// The events we pass are defined at: |
// http://devedge-temp.mozilla.org/library/manuals/2002/plugin/1.0/structures5.html#1000000 |
// Don't take the documentation as truth, however. There are many cases |
@@ -674,14 +674,10 @@ bool WebPluginContainerImpl::paintCustomOverhangArea(GraphicsContext* context, c |
// Private methods ------------------------------------------------------------- |
WebPluginContainerImpl::WebPluginContainerImpl(HTMLPlugInElement* element, WebPlugin* webPlugin) |
-#if ENABLE(OILPAN) |
- : m_frame(element->document().frame()) |
-#else |
: FrameDestructionObserver(element->document().frame()) |
-#endif |
, m_element(element) |
, m_webPlugin(webPlugin) |
- , m_webLayer(0) |
+ , m_webLayer(nullptr) |
, m_touchEventRequestType(TouchEventRequestTypeNone) |
, m_wantsWheelEvents(false) |
{ |
@@ -690,39 +686,38 @@ WebPluginContainerImpl::WebPluginContainerImpl(HTMLPlugInElement* element, WebPl |
WebPluginContainerImpl::~WebPluginContainerImpl() |
{ |
#if ENABLE(OILPAN) |
- // The element (and its document) are heap allocated and may |
- // have been finalized by now; unsafe to unregister the touch |
- // event handler at this stage. |
- // |
- // This is acceptable, as the widget will unregister itself if it |
- // is cleanly detached. If an explicit detach doesn't happen, this |
- // container is assumed to have died with the plugin element (and |
- // its document), hence no unregistration step is needed. |
- // |
- m_element = 0; |
+ // The plugin container must have been disposed of already. |
+ ASSERT(!m_webPlugin); |
#else |
+ dispose(); |
+#endif |
+} |
+ |
+void WebPluginContainerImpl::dispose() |
+{ |
if (m_touchEventRequestType != TouchEventRequestTypeNone && m_element->document().frameHost()) |
m_element->document().frameHost()->eventHandlerRegistry().didRemoveEventHandler(*m_element, EventHandlerRegistry::TouchEvent); |
-#endif |
ScriptForbiddenScope::AllowSuperUnsafeScript thisShouldBeRemoved; |
for (size_t i = 0; i < m_pluginLoadObservers.size(); ++i) |
m_pluginLoadObservers[i]->clearPluginContainer(); |
m_webPlugin->destroy(); |
+ m_webPlugin = nullptr; |
+ |
if (m_webLayer) |
GraphicsLayer::unregisterContentsLayer(m_webLayer); |
+ |
+ m_pluginLoadObservers.clear(); |
+ m_scrollbarGroup.clear(); |
+ m_element = nullptr; |
} |
-#if ENABLE(OILPAN) |
-void WebPluginContainerImpl::detach() |
+void WebPluginContainerImpl::trace(Visitor* visitor) |
{ |
- if (m_touchEventRequestType != TouchEventRequestTypeNone && m_element->document().frameHost()) |
- m_element->document().frameHost()->eventHandlerRegistry().didRemoveEventHandler(*m_element, EventHandlerRegistry::TouchEvent); |
- |
- setWebLayer(0); |
+ FrameDestructionObserver::trace(visitor); |
+ PluginView::trace(visitor); |
} |
-#endif |
void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event) |
{ |