Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1686)

Unified Diff: Source/web/WebPluginContainerImpl.cpp

Issue 603193005: Move the Widget hierarchy to the Oilpan heap. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebase upto and resolve r182737 conflict. Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/web/WebPluginContainerImpl.cpp
diff --git a/Source/web/WebPluginContainerImpl.cpp b/Source/web/WebPluginContainerImpl.cpp
index 4adc15c159fa4b21adddec32ae9ebe0091593cd1..f00fa06f19cb0a2597c6110bb17d6d8d28b0473d 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
@@ -439,7 +439,7 @@ v8::Local<v8::Object> WebPluginContainerImpl::v8ObjectForElement()
if (scriptState->contextIsValid())
return v8::Local<v8::Object>();
- v8::Handle<v8::Value> v8value = toV8(m_element, scriptState->context()->Global(), scriptState->isolate());
+ v8::Handle<v8::Value> v8value = toV8(m_element.get(), scriptState->context()->Global(), scriptState->isolate());
ASSERT(v8value->IsObject());
return v8::Handle<v8::Object>::Cast(v8value);
@@ -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,28 +686,30 @@ 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
if (m_touchEventRequestType != TouchEventRequestTypeNone && m_element->document().frameHost())
m_element->document().frameHost()->eventHandlerRegistry().didRemoveEventHandler(*m_element, EventHandlerRegistry::TouchEvent);
+
+ dispose();
#endif
+}
+void WebPluginContainerImpl::dispose()
+{
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();
}
#if ENABLE(OILPAN)
@@ -724,6 +722,13 @@ void WebPluginContainerImpl::detach()
}
#endif
+void WebPluginContainerImpl::trace(Visitor* visitor)
+{
+ visitor->trace(m_element);
+ FrameDestructionObserver::trace(visitor);
+ PluginView::trace(visitor);
+}
+
void WebPluginContainerImpl::handleMouseEvent(MouseEvent* event)
{
ASSERT(parent()->isFrameView());

Powered by Google App Engine
This is Rietveld 408576698