summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/Plugins/unix
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2017-06-27 06:07:23 +0000
commit1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch)
tree46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebKit2/UIProcess/Plugins/unix
parent32761a6cee1d0dee366b885b7b9c777e67885688 (diff)
downloadWebKitGtk-tarball-master.tar.gz
Diffstat (limited to 'Source/WebKit2/UIProcess/Plugins/unix')
-rw-r--r--Source/WebKit2/UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp67
-rw-r--r--Source/WebKit2/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp88
2 files changed, 90 insertions, 65 deletions
diff --git a/Source/WebKit2/UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp b/Source/WebKit2/UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp
index a9685618f..3b7ef381a 100644
--- a/Source/WebKit2/UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp
+++ b/Source/WebKit2/UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp
@@ -32,8 +32,12 @@
#include "PluginInfoStore.h"
#include "NetscapePluginModule.h"
-#include "PluginDatabase.h"
+#include "PluginSearchPath.h"
+#include "ProcessExecutablePath.h"
#include <WebCore/FileSystem.h>
+#include <WebCore/PlatformDisplay.h>
+#include <limits.h>
+#include <stdlib.h>
#if PLATFORM(GTK)
#include "PluginInfoCache.h"
@@ -45,51 +49,17 @@ namespace WebKit {
Vector<String> PluginInfoStore::pluginsDirectories()
{
- Vector<String> result;
-
- result.append(homeDirectoryPath() + "/.mozilla/plugins");
- result.append(homeDirectoryPath() + "/.netscape/plugins");
- result.append("/usr/lib/browser/plugins");
- result.append("/usr/local/lib/mozilla/plugins");
- result.append("/usr/lib/firefox/plugins");
- result.append("/usr/lib64/browser-plugins");
- result.append("/usr/lib/browser-plugins");
- result.append("/usr/lib/mozilla/plugins");
- result.append("/usr/local/netscape/plugins");
- result.append("/opt/mozilla/plugins");
- result.append("/opt/mozilla/lib/plugins");
- result.append("/opt/netscape/plugins");
- result.append("/opt/netscape/communicator/plugins");
- result.append("/usr/lib/netscape/plugins");
- result.append("/usr/lib/netscape/plugins-libc5");
- result.append("/usr/lib/netscape/plugins-libc6");
- result.append("/usr/lib64/netscape/plugins");
- result.append("/usr/lib64/mozilla/plugins");
- result.append("/usr/lib/nsbrowser/plugins");
- result.append("/usr/lib64/nsbrowser/plugins");
-
- String mozillaHome(getenv("MOZILLA_HOME"));
- if (!mozillaHome.isEmpty())
- result.append(mozillaHome + "/plugins");
-
- String mozillaPaths(getenv("MOZ_PLUGIN_PATH"));
- if (!mozillaPaths.isEmpty()) {
- Vector<String> paths;
- mozillaPaths.split(UChar(':'), /* allowEmptyEntries */ false, paths);
- result.appendVector(paths);
- }
-
- return result;
+ return WebKit::pluginsDirectories();
}
Vector<String> PluginInfoStore::pluginPathsInDirectory(const String& directory)
{
Vector<String> result;
- Vector<String> pluginPaths = listDirectory(directory, String("*.so"));
- Vector<String>::const_iterator end = pluginPaths.end();
- for (Vector<String>::const_iterator it = pluginPaths.begin(); it != end; ++it) {
- if (fileExists(*it))
- result.append(*it);
+ char normalizedPath[PATH_MAX];
+ for (const auto& path : listDirectory(directory, String("*.so"))) {
+ CString filename = fileSystemRepresentation(path);
+ if (realpath(filename.data(), normalizedPath))
+ result.append(stringFromFileSystemRepresentation(normalizedPath));
}
return result;
@@ -103,11 +73,22 @@ Vector<String> PluginInfoStore::individualPluginPaths()
bool PluginInfoStore::getPluginInfo(const String& pluginPath, PluginModuleInfo& plugin)
{
#if PLATFORM(GTK)
- if (PluginInfoCache::shared().getPluginInfo(pluginPath, plugin))
+ if (PluginInfoCache::singleton().getPluginInfo(pluginPath, plugin)) {
+#if ENABLE(PLUGIN_PROCESS_GTK2)
+ if (plugin.requiresGtk2) {
+ if (PlatformDisplay::sharedDisplay().type() != PlatformDisplay::Type::X11)
+ return false;
+ String pluginProcessPath = executablePathOfPluginProcess();
+ pluginProcessPath.append('2');
+ if (!fileExists(pluginProcessPath))
+ return false;
+ }
+#endif
return true;
+ }
if (NetscapePluginModule::getPluginInfo(pluginPath, plugin)) {
- PluginInfoCache::shared().updatePluginInfo(pluginPath, plugin);
+ PluginInfoCache::singleton().updatePluginInfo(pluginPath, plugin);
return true;
}
return false;
diff --git a/Source/WebKit2/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp b/Source/WebKit2/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp
index 18e15864f..7601f4313 100644
--- a/Source/WebKit2/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp
+++ b/Source/WebKit2/UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2011 Igalia S.L.
+ * Copyright (C) 2011, 2014 Igalia S.L.
* Copyright (C) 2011 Apple Inc.
* Copyright (C) 2012 Samsung Electronics
*
@@ -33,14 +33,19 @@
#include "PluginProcessCreationParameters.h"
#include "ProcessExecutablePath.h"
#include <WebCore/FileSystem.h>
+#include <WebCore/PlatformDisplay.h>
+#include <sys/wait.h>
#include <wtf/text/CString.h>
#include <wtf/text/WTFString.h>
-#if PLATFORM(GTK) || PLATFORM(EFL)
+
+#if PLATFORM(GTK)
#include <glib.h>
-#include <wtf/gobject/GUniquePtr.h>
+#include <wtf/glib/GUniquePtr.h>
#endif
-#include <sys/wait.h>
+#if PLATFORM(GTK)
+#include "Module.h"
+#endif
using namespace WebCore;
@@ -48,33 +53,57 @@ namespace WebKit {
void PluginProcessProxy::platformGetLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions, const PluginProcessAttributes& pluginProcessAttributes)
{
-#if PLATFORM(EFL) && !defined(NDEBUG)
- const char* commandPrefix = getenv("PLUGIN_PROCESS_COMMAND_PREFIX");
- if (commandPrefix && *commandPrefix)
- launchOptions.processCmdPrefix = String::fromUTF8(commandPrefix);
-#endif
+ launchOptions.processType = ProcessLauncher::ProcessType::Plugin64;
launchOptions.extraInitializationData.add("plugin-path", pluginProcessAttributes.moduleInfo.path);
+#if PLATFORM(GTK)
+ if (pluginProcessAttributes.moduleInfo.requiresGtk2)
+ launchOptions.extraInitializationData.add("requires-gtk2", emptyString());
+#endif
}
void PluginProcessProxy::platformInitializePluginProcess(PluginProcessCreationParameters&)
{
}
+#if PLATFORM(GTK)
+static bool pluginRequiresGtk2(const String& pluginPath)
+{
+ std::unique_ptr<Module> module = std::make_unique<Module>(pluginPath);
+ if (!module->load())
+ return false;
+ return module->functionPointer<gpointer>("gtk_object_get_type");
+}
+#endif
+
#if PLUGIN_ARCHITECTURE(X11)
bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData& result)
{
-#if PLATFORM(GTK) || PLATFORM(EFL)
- CString binaryPath = fileSystemRepresentation(executablePathOfPluginProcess());
+#if PLATFORM(GTK)
+ String pluginProcessPath = executablePathOfPluginProcess();
+
+#if PLATFORM(GTK)
+ bool requiresGtk2 = pluginRequiresGtk2(pluginPath);
+ if (requiresGtk2) {
+ if (PlatformDisplay::sharedDisplay().type() != PlatformDisplay::Type::X11)
+ return false;
+#if ENABLE(PLUGIN_PROCESS_GTK2)
+ pluginProcessPath.append('2');
+ if (!fileExists(pluginProcessPath))
+ return false;
+#else
+ return false;
+#endif
+ }
+#endif
+
+ CString binaryPath = fileSystemRepresentation(pluginProcessPath);
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;
-
- int status;
- GUniqueOutPtr<char> stdOut;
+ argv[3] = nullptr;
// If the disposition of SIGCLD signal is set to SIG_IGN (default)
// then the signal will be ignored and g_spawn_sync() will not be
@@ -90,27 +119,42 @@ bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData&
}
#endif
- if (!g_spawn_sync(0, argv, 0, G_SPAWN_STDERR_TO_DEV_NULL, 0, 0, &stdOut.outPtr(), 0, &status, 0))
+ int status;
+ GUniqueOutPtr<char> stdOut;
+ GUniqueOutPtr<GError> error;
+ if (!g_spawn_sync(nullptr, argv, nullptr, G_SPAWN_STDERR_TO_DEV_NULL, nullptr, nullptr, &stdOut.outPtr(), nullptr, &status, &error.outPtr())) {
+ WTFLogAlways("Failed to launch %s: %s", argv[0], error->message);
return false;
+ }
- if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS || !stdOut)
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != EXIT_SUCCESS) {
+ WTFLogAlways("Error scanning plugin %s, %s returned %d exit status", argv[2], argv[0], status);
return false;
+ }
- String stdOutString = String::fromUTF8(stdOut.get());
+ if (!stdOut) {
+ WTFLogAlways("Error scanning plugin %s, %s didn't write any output to stdout", argv[2], argv[0]);
+ return false;
+ }
Vector<String> lines;
- stdOutString.split(UChar('\n'), true, lines);
+ String::fromUTF8(stdOut.get()).split(UChar('\n'), true, lines);
- if (lines.size() < 3)
+ if (lines.size() < 3) {
+ WTFLogAlways("Error scanning plugin %s, too few lines of output provided", argv[2]);
return false;
+ }
result.name.swap(lines[0]);
result.description.swap(lines[1]);
result.mimeDescription.swap(lines[2]);
+#if PLATFORM(GTK)
+ result.requiresGtk2 = requiresGtk2;
+#endif
return !result.mimeDescription.isEmpty();
-#else // PLATFORM(GTK) || PLATFORM(EFL)
+#else // PLATFORM(GTK)
return false;
-#endif // PLATFORM(GTK) || PLATFORM(EFL)
+#endif // PLATFORM(GTK)
}
#endif // PLUGIN_ARCHITECTURE(X11)