diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-05-07 11:21:11 +0200 |
commit | 2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47 (patch) | |
tree | 988e8c5b116dd0466244ae2fe5af8ee9be926d76 /Source/WebKit2/UIProcess/Plugins | |
parent | dd91e772430dc294e3bf478c119ef8d43c0a3358 (diff) | |
download | qtwebkit-2cf6c8816a73e0132bd8fa3b509d62d7c51b6e47.tar.gz |
Imported WebKit commit 7e538425aa020340619e927792f3d895061fb54b (http://svn.webkit.org/repository/webkit/trunk@116286)
Diffstat (limited to 'Source/WebKit2/UIProcess/Plugins')
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 |