summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/Plugins
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-05-07 11:21:11 +0200
commit2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch)
tree988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/WebKit2/UIProcess/Plugins
parentdd91e772430dc294e3bf478c119ef8d43c0a3358 (diff)
downloadqtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Source/WebKit2/UIProcess/Plugins')
-rw-r--r--Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp2
-rw-r--r--Source/WebKit2/UIProcess/Plugins/PluginProcessManager.cpp11
-rw-r--r--Source/WebKit2/UIProcess/Plugins/PluginProcessManager.h2
-rw-r--r--Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp7
-rw-r--r--Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h16
-rw-r--r--Source/WebKit2/UIProcess/Plugins/gtk/PluginProcessProxyGtk.cpp44
-rw-r--r--Source/WebKit2/UIProcess/Plugins/mac/PluginProcessProxyMac.mm8
-rw-r--r--Source/WebKit2/UIProcess/Plugins/qt/PluginProcessProxyQt.cpp45
8 files changed, 114 insertions, 21 deletions
diff --git a/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp b/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp
index f37099f2c..cef14dcf0 100644
--- a/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp
+++ b/Source/WebKit2/UIProcess/Plugins/PluginInfoStore.cpp
@@ -164,7 +164,7 @@ static inline String pathExtension(const KURL& url)
{
String extension;
String filename = url.lastPathComponent();
- if (!filename.endsWith("/")) {
+ if (!filename.endsWith('/')) {
int extensionPos = filename.reverseFind('.');
if (extensionPos != -1)
extension = filename.substring(extensionPos + 1);
diff --git a/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.cpp b/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.cpp
index 35da365d7..cebf4f7b2 100644
--- a/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.cpp
+++ b/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.cpp
@@ -87,8 +87,9 @@ PluginProcessProxy* PluginProcessManager::pluginProcessWithPath(const String& pl
{
for (size_t i = 0; i < m_pluginProcesses.size(); ++i) {
if (m_pluginProcesses[i]->pluginInfo().path == pluginPath)
- return m_pluginProcesses[i];
+ return m_pluginProcesses[i].get();
}
+
return 0;
}
@@ -97,10 +98,12 @@ PluginProcessProxy* PluginProcessManager::getOrCreatePluginProcess(const PluginM
if (PluginProcessProxy* pluginProcess = pluginProcessWithPath(plugin.path))
return pluginProcess;
- PluginProcessProxy* pluginProcess = PluginProcessProxy::create(this, plugin).leakPtr();
- m_pluginProcesses.append(pluginProcess);
+ RefPtr<PluginProcessProxy> pluginProcess = PluginProcessProxy::create(this, plugin);
+ PluginProcessProxy* pluginProcessPtr = pluginProcess.get();
+
+ m_pluginProcesses.append(pluginProcess.release());
- return pluginProcess;
+ return pluginProcessPtr;
}
} // namespace WebKit
diff --git a/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.h b/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.h
index 935967bdd..19aafe860 100644
--- a/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.h
+++ b/Source/WebKit2/UIProcess/Plugins/PluginProcessManager.h
@@ -64,7 +64,7 @@ private:
PluginProcessProxy* getOrCreatePluginProcess(const PluginModuleInfo&);
PluginProcessProxy* pluginProcessWithPath(const String& pluginPath);
- Vector<PluginProcessProxy*> m_pluginProcesses;
+ Vector<RefPtr<PluginProcessProxy> > m_pluginProcesses;
};
} // namespace WebKit
diff --git a/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp b/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp
index 893f84732..43fa2f4cb 100644
--- a/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp
+++ b/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.cpp
@@ -47,9 +47,9 @@ using namespace WebCore;
namespace WebKit {
-PassOwnPtr<PluginProcessProxy> PluginProcessProxy::create(PluginProcessManager* PluginProcessManager, const PluginModuleInfo& pluginInfo)
+PassRefPtr<PluginProcessProxy> PluginProcessProxy::create(PluginProcessManager* PluginProcessManager, const PluginModuleInfo& pluginInfo)
{
- return adoptPtr(new PluginProcessProxy(PluginProcessManager, pluginInfo));
+ return adoptRef(new PluginProcessProxy(PluginProcessManager, pluginInfo));
}
PluginProcessProxy::PluginProcessProxy(PluginProcessManager* PluginProcessManager, const PluginModuleInfo& pluginInfo)
@@ -151,9 +151,8 @@ void PluginProcessProxy::pluginProcessCrashedOrFailedToLaunch()
while (!m_pendingClearSiteDataReplies.isEmpty())
didClearSiteData(m_pendingClearSiteDataReplies.begin()->first);
- // Tell the plug-in process manager to forget about this plug-in process proxy.
+ // Tell the plug-in process manager to forget about this plug-in process proxy. This may cause us to be deleted.
m_pluginProcessManager->removePluginProcessProxy(this);
- delete this;
}
void PluginProcessProxy::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
diff --git a/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h b/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h
index a75d5b138..0a51d9b27 100644
--- a/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h
+++ b/Source/WebKit2/UIProcess/Plugins/PluginProcessProxy.h
@@ -52,9 +52,17 @@ class WebPluginSiteDataManager;
class WebProcessProxy;
struct PluginProcessCreationParameters;
-class PluginProcessProxy : CoreIPC::Connection::Client, ProcessLauncher::Client {
+#if PLUGIN_ARCHITECTURE(X11)
+struct RawPluginMetaData {
+ String name;
+ String description;
+ String mimeDescription;
+};
+#endif
+
+class PluginProcessProxy : public RefCounted<PluginProcessProxy>, CoreIPC::Connection::Client, ProcessLauncher::Client {
public:
- static PassOwnPtr<PluginProcessProxy> create(PluginProcessManager*, const PluginModuleInfo&);
+ static PassRefPtr<PluginProcessProxy> create(PluginProcessManager*, const PluginModuleInfo&);
~PluginProcessProxy();
const PluginModuleInfo& pluginInfo() const { return m_pluginInfo; }
@@ -80,6 +88,10 @@ public:
static bool createPropertyListFile(const PluginModuleInfo&);
#endif
+#if PLUGIN_ARCHITECTURE(X11)
+ static bool scanPlugin(const String& pluginPath, RawPluginMetaData& result);
+#endif
+
private:
PluginProcessProxy(PluginProcessManager*, const PluginModuleInfo&);
diff --git a/Source/WebKit2/UIProcess/Plugins/gtk/PluginProcessProxyGtk.cpp b/Source/WebKit2/UIProcess/Plugins/gtk/PluginProcessProxyGtk.cpp
index 4c85772a2..653c72965 100644
--- a/Source/WebKit2/UIProcess/Plugins/gtk/PluginProcessProxyGtk.cpp
+++ b/Source/WebKit2/UIProcess/Plugins/gtk/PluginProcessProxyGtk.cpp
@@ -29,13 +29,51 @@
#if ENABLE(PLUGIN_PROCESS)
#include "PluginProcessCreationParameters.h"
-#include <WebCore/NotImplemented.h>
+#include "ProcessExecutablePath.h"
+#include <WebCore/FileSystem.h>
+#include <glib.h>
+#include <wtf/text/CString.h>
+#include <wtf/text/WTFString.h>
+
+using namespace WebCore;
namespace WebKit {
-void PluginProcessProxy::platformInitializePluginProcess(PluginProcessCreationParameters& parameters)
+void PluginProcessProxy::platformInitializePluginProcess(PluginProcessCreationParameters&)
+{
+}
+
+bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData& result)
{
- notImplemented();
+ CString binaryPath = fileSystemRepresentation(executablePathOfPluginProcess());
+ CString pluginPathCString = fileSystemRepresentation(pluginPath);
+ char* argv[4];
+ argv[0] = const_cast<char*>(binaryPath.data());
+ argv[1] = const_cast<char*>("-scanPlugin");
+ argv[2] = const_cast<char*>(pluginPathCString.data());
+ argv[3] = 0;
+
+ gint status;
+ gchar* stdOut;
+ if (!g_spawn_sync(0, argv, 0, G_SPAWN_STDERR_TO_DEV_NULL, 0, 0, &stdOut, 0, &status, 0))
+ return false;
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS)
+ return false;
+
+ const unsigned kNumLinesExpected = 3;
+ String lines[kNumLinesExpected];
+ unsigned lineIndex = 0;
+ const UChar* current = reinterpret_cast<const UChar*>(stdOut);
+ while (lineIndex < kNumLinesExpected) {
+ const UChar* start = current;
+ while (*current++ != UChar('\n')) { }
+ lines[lineIndex++] = String(start, current - start - 1);
+ }
+
+ result.name.swap(lines[0]);
+ result.description.swap(lines[1]);
+ result.mimeDescription.swap(lines[2]);
+ return !result.mimeDescription.isEmpty();
}
} // namespace WebKit
diff --git a/Source/WebKit2/UIProcess/Plugins/mac/PluginProcessProxyMac.mm b/Source/WebKit2/UIProcess/Plugins/mac/PluginProcessProxyMac.mm
index 4e539beaa..290451a4b 100644
--- a/Source/WebKit2/UIProcess/Plugins/mac/PluginProcessProxyMac.mm
+++ b/Source/WebKit2/UIProcess/Plugins/mac/PluginProcessProxyMac.mm
@@ -202,7 +202,7 @@ void PluginProcessProxy::exitFullscreen()
void PluginProcessProxy::setModalWindowIsShowing(bool modalWindowIsShowing)
{
- if (modalWindowIsShowing == m_modalWindowIsShowing)
+ if (modalWindowIsShowing == m_modalWindowIsShowing)
return;
m_modalWindowIsShowing = modalWindowIsShowing;
@@ -223,7 +223,11 @@ void PluginProcessProxy::beginModal()
m_activationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSApplicationWillBecomeActiveNotification object:NSApp queue:nil
usingBlock:^(NSNotification *){ applicationDidBecomeActive(); }];
-
+
+ // The call to -[NSApp runModalForWindow:] below will run a nested run loop, and if the plug-in process
+ // crashes the PluginProcessProxy object can be destroyed. Protect against this here.
+ RefPtr<PluginProcessProxy> protect(this);
+
[NSApp runModalForWindow:m_placeholderWindow.get()];
[m_placeholderWindow.get() orderOut:nil];
diff --git a/Source/WebKit2/UIProcess/Plugins/qt/PluginProcessProxyQt.cpp b/Source/WebKit2/UIProcess/Plugins/qt/PluginProcessProxyQt.cpp
index cc521e0af..9b7f2b2dd 100644
--- a/Source/WebKit2/UIProcess/Plugins/qt/PluginProcessProxyQt.cpp
+++ b/Source/WebKit2/UIProcess/Plugins/qt/PluginProcessProxyQt.cpp
@@ -28,14 +28,51 @@
#if ENABLE(PLUGIN_PROCESS)
-#include "PluginProcessCreationParameters.h"
-#include <WebCore/NotImplemented.h>
+#include "ProcessExecutablePath.h"
+#include <QByteArray>
+#include <QCoreApplication>
+#include <QDir>
+#include <QEventLoop>
+#include <QProcess>
+#include <QString>
namespace WebKit {
-void PluginProcessProxy::platformInitializePluginProcess(PluginProcessCreationParameters& parameters)
+class PluginProcessCreationParameters;
+
+void PluginProcessProxy::platformInitializePluginProcess(PluginProcessCreationParameters&)
{
- notImplemented();
+}
+
+bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData& result)
+{
+ QString commandLine = QLatin1String("%1 %2 %3");
+ commandLine = commandLine.arg(executablePathOfPluginProcess());
+ commandLine = commandLine.arg(QStringLiteral("-scanPlugin")).arg(static_cast<QString>(pluginPath));
+
+ QProcess process;
+ process.setReadChannel(QProcess::StandardOutput);
+ process.start(commandLine);
+
+ if (!process.waitForFinished()
+ || process.exitStatus() != QProcess::NormalExit
+ || process.exitCode() != EXIT_SUCCESS) {
+ process.kill();
+ return false;
+ }
+
+ QByteArray outputBytes = process.readAll();
+ ASSERT(!(outputBytes.size() % sizeof(UChar)));
+
+ String output(reinterpret_cast<const UChar*>(outputBytes.constData()), outputBytes.size() / sizeof(UChar));
+ Vector<String> lines;
+ output.split(UChar('\n'), lines);
+ ASSERT(lines.size() == 3);
+
+ result.name.swap(lines[0]);
+ result.description.swap(lines[1]);
+ result.mimeDescription.swap(lines[2]);
+ return !result.mimeDescription.isEmpty();
}
} // namespace WebKit