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

Unified Diff: Source/core/html/HTMLPlugInElement.cpp

Issue 23618022: BrowserPlugin/WebView - Move plugin lifetime to DOM (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Don't store plugin (widget) pointer in RenderWidget. Created 7 years, 1 month 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/core/html/HTMLPlugInElement.cpp
diff --git a/Source/core/html/HTMLPlugInElement.cpp b/Source/core/html/HTMLPlugInElement.cpp
index f4b60adf6c8cbeff0796e7a4d8069f35e615341a..79ac529facc6fc3676c04e4a0843d549aca212e7 100644
--- a/Source/core/html/HTMLPlugInElement.cpp
+++ b/Source/core/html/HTMLPlugInElement.cpp
@@ -142,6 +142,42 @@ void HTMLPlugInElement::updateWidgetIfNecessary()
updateWidget(CreateOnlyNonNetscapePlugins);
}
+void HTMLPlugInElement::createPluginWithoutRenderer(const String& mimeType)
+{
+ if (m_plugin && (mimeType == m_pluginMimeType))
eseidel 2013/11/18 22:26:45 I'm confused by this check. It feels like it shou
wjmaclean 2013/11/25 17:51:56 Actually, it might be sensible that, if someone se
+ return;
+
+ Frame* frame = document().frame();
+ if (!frame->loader().client()->canCreatePluginWithoutRenderer(mimeType))
+ return;
+
+ KURL url;
+ Vector<String> paramNames;
+ Vector<String> paramValues;
+
+ paramNames.append(String("type"));
eseidel 2013/11/18 22:26:45 Shouldn't need an explicit String() wrapper here?
wjmaclean 2013/11/25 17:51:56 Done.
+ paramValues.append(mimeType);
+
+ m_plugin = frame->loader().client()->createPlugin(IntSize(), this, url, paramNames, paramValues, mimeType, false, true);
+
+ // Register the bindings with V8 as a scriptable object; normally this is
+ // done in getInstance(), but that is only called after a renderer has been
+ // assigned.
+ if (m_plugin) {
+ m_pluginMimeType = mimeType;
+ // We require a V8 context in order to be able to create the script
+ // instance, but since this may occur during loading we need to create
+ // one here to ensure it exists.
+ v8::HandleScope handleScope(v8::Isolate::GetCurrent());
+ v8::Local<v8::Context> context = ScriptController::mainWorldContext(frame);
+ v8::Context::Scope contextScope(context);
+ m_NPObject = frame->script().createScriptObjectForPluginElement(this);
+ m_pluginWrapper = frame->script().createPluginWrapper(m_plugin.get());
+ } else {
+ m_pluginMimeType = String();
+ }
+}
+
void HTMLPlugInElement::detach(const AttachContext& context)
{
// Update the widget the next time we attach (detaching destroys the plugin).
@@ -149,7 +185,18 @@ void HTMLPlugInElement::detach(const AttachContext& context)
if (renderer() && !useFallbackContent())
setNeedsWidgetUpdate(true);
- resetInstance();
+ if (m_plugin) {
+ RenderEmbeddedObject* renderer = renderEmbeddedObject();
+ if (renderer)
+ renderer->configureWidget(RenderWidget::ConfigureOnDetach);
+ else
+ ASSERT(!m_plugin->parent());
+
+ if (!m_plugin->pluginShouldPersist()) {
+ m_plugin.clear();
+ resetInstance();
+ }
+ }
if (m_isCapturingMouseEvents) {
if (Frame* frame = document().frame())
@@ -436,8 +483,12 @@ bool HTMLPlugInElement::loadPlugin(const KURL& url, const String& mimeType, cons
m_loadedUrl = url;
IntSize contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), renderer->contentHeight()));
- bool loadManually = document().isPluginDocument() && !document().containsPlugins() && toPluginDocument(document()).shouldLoadPluginManually();
- RefPtr<Widget> widget = frame->loader().client()->createPlugin(contentSize, this, url, paramNames, paramValues, mimeType, loadManually);
+ RefPtr<Widget> widget = plugin();
+
+ if (!widget) {
+ bool loadManually = document().isPluginDocument() && !document().containsPlugins() && toPluginDocument(document()).shouldLoadPluginManually();
eseidel 2013/11/18 22:26:45 There should only be one way to create a plugin.
wjmaclean 2013/11/25 17:51:56 Done.
+ widget = frame->loader().client()->createPlugin(contentSize, this, url, paramNames, paramValues, mimeType, loadManually);
+ }
if (!widget) {
if (!renderer->showsUnavailablePluginIndicator())
@@ -445,7 +496,12 @@ bool HTMLPlugInElement::loadPlugin(const KURL& url, const String& mimeType, cons
return false;
}
- renderer->setWidget(widget);
+ // FIXME: What happens here if our widget *isn't* a plugin container?
eseidel 2013/11/18 22:26:45 That can't happen. We're an HTMLPluginElement, we
wjmaclean 2013/11/25 17:51:56 Done.
+ if (widget->isPluginContainer())
+ setPlugin(widget);
+ else
+ ASSERT_NOT_REACHED();
+ renderer->configureWidget(RenderWidget::ConfigureOnAttach);
document().setContainsPlugins();
setNeedsStyleRecalc(LocalStyleChange, StyleChangeFromRenderer);
return true;
@@ -501,4 +557,14 @@ bool HTMLPlugInElement::pluginIsLoadable(const KURL& url, const String& mimeType
return frame->loader().mixedContentChecker()->canRunInsecureContent(document().securityOrigin(), url);
}
+void HTMLPlugInElement::setPlugin(PassRefPtr<Widget> plugin)
+{
+ m_plugin = plugin;
+}
+
+PassRefPtr<Widget> HTMLPlugInElement::plugin()
+{
+ return m_plugin;
+}
+
}

Powered by Google App Engine
This is Rietveld 408576698