Index: Source/web/WebPluginContainerImpl.cpp |
diff --git a/Source/web/WebPluginContainerImpl.cpp b/Source/web/WebPluginContainerImpl.cpp |
index 5f5bd41aefe882ae08f1652521b96cdec90ed94a..1c3ef88099e24c0d411c216e89518d8a48d38348 100644 |
--- a/Source/web/WebPluginContainerImpl.cpp |
+++ b/Source/web/WebPluginContainerImpl.cpp |
@@ -303,6 +303,11 @@ void WebPluginContainerImpl::setWebLayer(WebLayer* layer) |
if (!needsCompositingUpdate) |
return; |
+#if ENABLE(OILPAN) |
+ if (!m_element) |
+ return; |
+#endif |
+ |
m_element->setNeedsCompositingUpdate(); |
// Being composited or not affects the self painting layer bit |
// on the RenderLayer. |
@@ -426,12 +431,26 @@ void WebPluginContainerImpl::allowScriptObjects() |
void WebPluginContainerImpl::clearScriptObjects() |
{ |
+#if ENABLE(OILPAN) |
+ if (m_scriptController) { |
+ m_scriptController->cleanupScriptObjectsForPlugin(this); |
haraken
2014/06/25 05:40:16
Maybe should we call cleanupScriptObjectsForPlugin
sof
2014/06/25 05:44:25
Is Node::detach() (from where we call this contain
haraken
2014/06/25 05:54:24
ah, understood.
Then would it be possible to call
sof
2014/06/25 07:09:32
(cleanupScriptObjectsForPlugin() is something the
|
+ m_scriptController = nullptr; |
+ } |
+#else |
LocalFrame* frame = m_element->document().frame(); |
if (!frame) |
return; |
frame->script().cleanupScriptObjectsForPlugin(this); |
+#endif |
} |
+#if ENABLE(OILPAN) |
+void WebPluginContainerImpl::setScriptController(WebCore::ScriptController* scriptController) |
+{ |
+ m_scriptController = scriptController; |
+} |
+#endif |
+ |
NPObject* WebPluginContainerImpl::scriptableObjectForElement() |
{ |
return m_element->getNPObject(); |
@@ -655,6 +674,9 @@ bool WebPluginContainerImpl::paintCustomOverhangArea(GraphicsContext* context, c |
WebPluginContainerImpl::WebPluginContainerImpl(WebCore::HTMLPlugInElement* element, WebPlugin* webPlugin) |
: m_element(element) |
, m_webPlugin(webPlugin) |
+#if ENABLE(OILPAN) |
+ , m_scriptController(0) |
+#endif |
, m_webLayer(0) |
, m_touchEventRequestType(TouchEventRequestTypeNone) |
, m_wantsWheelEvents(false) |
@@ -663,8 +685,21 @@ WebPluginContainerImpl::WebPluginContainerImpl(WebCore::HTMLPlugInElement* eleme |
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; |
+#else |
if (m_touchEventRequestType != TouchEventRequestTypeNone) |
m_element->document().didRemoveTouchEventHandler(m_element); |
+#endif |
for (size_t i = 0; i < m_pluginLoadObservers.size(); ++i) |
m_pluginLoadObservers[i]->clearPluginContainer(); |
@@ -673,6 +708,16 @@ WebPluginContainerImpl::~WebPluginContainerImpl() |
GraphicsLayer::unregisterContentsLayer(m_webLayer); |
haraken
2014/06/25 05:40:16
Probably can we move the line 704 - 708 to detach(
|
} |
+#if ENABLE(OILPAN) |
+void WebPluginContainerImpl::detach() |
+{ |
+ if (m_touchEventRequestType != TouchEventRequestTypeNone) |
+ m_element->document().didRemoveTouchEventHandler(m_element); |
+ |
+ setWebLayer(0); |
haraken
2014/06/25 05:54:24
Just help me understand: Calling setWebLayer(0) is
sof
2014/06/25 07:09:32
Exactly so; we cannot do it at finalization time a
|
+} |
+#endif |
+ |
void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event) |
{ |
ASSERT(parent()->isFrameView()); |