1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/*
* Copyright (C) 2011 Igalia S.L.
* Copyright (C) 2011 Apple Inc.
* Copyright (C) 2012 Samsung Electronics
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "PluginProcessProxy.h"
#if ENABLE(PLUGIN_PROCESS)
#include "PluginProcessCreationParameters.h"
#include "ProcessExecutablePath.h"
#include <WebCore/FileSystem.h>
#include <wtf/text/CString.h>
#include <wtf/text/WTFString.h>
#if PLATFORM(GTK) || (PLATFORM(EFL) && ENABLE(GLIB_SUPPORT))
#include <glib.h>
#endif
using namespace WebCore;
namespace WebKit {
void PluginProcessProxy::platformInitializeLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions, const PluginModuleInfo&)
{
#if PLATFORM(EFL) && !defined(NDEBUG)
const char* commandPrefix = getenv("PLUGIN_PROCESS_COMMAND_PREFIX");
if (commandPrefix && *commandPrefix)
launchOptions.processCmdPrefix = String::fromUTF8(commandPrefix);
#else
UNUSED_PARAM(launchOptions);
#endif
}
void PluginProcessProxy::platformInitializePluginProcess(PluginProcessCreationParameters&)
{
}
bool PluginProcessProxy::scanPlugin(const String& pluginPath, RawPluginMetaData& result)
{
#if PLATFORM(GTK) || (PLATFORM(EFL) && ENABLE(GLIB_SUPPORT))
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;
int status;
char* stdOut = 0;
// 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
// able to return the status.
// As a consequence, we make sure that the disposition is set to
// SIG_DFL before calling g_spawn_sync().
struct sigaction action;
sigaction(SIGCLD, 0, &action);
if (action.sa_handler == SIG_IGN) {
action.sa_handler = SIG_DFL;
sigaction(SIGCLD, &action, 0);
}
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 || !stdOut) {
free(stdOut);
return false;
}
String stdOutString(reinterpret_cast<const UChar*>(stdOut));
free(stdOut);
Vector<String> lines;
stdOutString.split(UChar('\n'), true, lines);
if (lines.size() < 3)
return false;
result.name.swap(lines[0]);
result.description.swap(lines[1]);
result.mimeDescription.swap(lines[2]);
return !result.mimeDescription.isEmpty();
#else // PLATFORM(GTK) || (PLATFORM(EFL) && ENABLE(GLIB_SUPPORT))
return false;
#endif // PLATFORM(GTK) || (PLATFORM(EFL) && ENABLE(GLIB_SUPPORT))
}
} // namespace WebKit
#endif // ENABLE(PLUGIN_PROCESS)
|