Index: third_party/WebKit/Source/web/WebPluginContainerImpl.cpp |
diff --git a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp |
index 72629f332e487324fae1cc8a508400a567b45c9e..6e90a18242f83d8d9ffdab6f898df266a795b422 100644 |
--- a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp |
+++ b/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp |
@@ -497,9 +497,12 @@ void WebPluginContainerImpl::loadFrameRequest(const WebURLRequest& request, cons |
// FIXME: This is a bit of hack to allow us to observe completion of |
// our frame request. It would be better to evolve FrameLoader to |
// support a completion callback instead. |
- OwnPtr<WebPluginLoadObserver> observer = adoptPtr(new WebPluginLoadObserver(this, request.url(), notifyData)); |
- // FIXME: Calling get here is dangerous! What if observer is freed? |
+ OwnPtrWillBeRawPtr<WebPluginLoadObserver> observer = WebPluginLoadObserver::create(this, request.url(), notifyData); |
+#if ENABLE(OILPAN) |
+ m_pluginLoadObservers.add(observer); |
+#else |
m_pluginLoadObservers.append(observer.get()); |
+#endif |
WebDataSourceImpl::setNextPluginLoadObserver(observer.release()); |
} |
@@ -681,10 +684,17 @@ bool WebPluginContainerImpl::wantsWheelEvents() |
void WebPluginContainerImpl::willDestroyPluginLoadObserver(WebPluginLoadObserver* observer) |
{ |
+#if ENABLE(OILPAN) |
+ auto it = m_pluginLoadObservers.find(observer); |
+ if (it != m_pluginLoadObservers.end()) |
+ return; |
+ m_pluginLoadObservers.remove(it); |
+#else |
size_t pos = m_pluginLoadObservers.find(observer); |
if (pos == kNotFound) |
return; |
m_pluginLoadObservers.remove(pos); |
+#endif |
} |
// Private methods ------------------------------------------------------------- |
@@ -722,21 +732,33 @@ void WebPluginContainerImpl::dispose() |
if (m_element && m_touchEventRequestType != TouchEventRequestTypeNone && m_element->document().frameHost()) |
m_element->document().frameHost()->eventHandlerRegistry().didRemoveEventHandler(*m_element, EventHandlerRegistry::TouchEvent); |
- for (size_t i = 0; i < m_pluginLoadObservers.size(); ++i) |
- m_pluginLoadObservers[i]->clearPluginContainer(); |
+#if ENABLE(OILPAN) |
+ if (!m_shouldDisposePlugin) { |
+ for (const auto& observer : m_pluginLoadObservers) |
+ observer->clearPluginContainer(); |
+ } |
+#else |
+ for (const auto& observer : m_pluginLoadObservers) |
+ observer->clearPluginContainer(); |
+#endif |
if (m_webPlugin) { |
RELEASE_ASSERT(!m_webPlugin->container() || m_webPlugin->container() == this); |
m_webPlugin->destroy(); |
+ m_webPlugin = nullptr; |
} |
- m_webPlugin = nullptr; |
if (m_webLayer) { |
GraphicsLayer::unregisterContentsLayer(m_webLayer); |
m_webLayer = nullptr; |
} |
+#if ENABLE(OILPAN) |
+ if (!m_shouldDisposePlugin) |
+ m_pluginLoadObservers.clear(); |
+#else |
m_pluginLoadObservers.clear(); |
+#endif |
m_element = nullptr; |
} |
@@ -757,7 +779,10 @@ void WebPluginContainerImpl::shouldDisposePlugin() |
DEFINE_TRACE(WebPluginContainerImpl) |
{ |
+#if ENABLE(OILPAN) |
visitor->trace(m_element); |
+ visitor->trace(m_pluginLoadObservers); |
+#endif |
LocalFrameLifecycleObserver::trace(visitor); |
PluginView::trace(visitor); |
} |