REGRESSION (r141051): Broke plugin support on non-Mac WebKit2 Ports
[WebKit-https.git] / Source / WebKit2 / UIProcess / Launcher / efl / ProcessLauncherEfl.cpp
1 /*
2     Copyright (C) 2012 Samsung Electronics
3
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Library General Public
6     License as published by the Free Software Foundation; either
7     version 2 of the License, or (at your option) any later version.
8
9     This library is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12     Library General Public License for more details.
13
14     You should have received a copy of the GNU Library General Public License
15     along with this library; see the file COPYING.LIB.  If not, write to
16     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17     Boston, MA 02110-1301, USA.
18  */
19
20 #include "config.h"
21 #include "ProcessLauncher.h"
22
23 #include "Connection.h"
24 #include "ProcessExecutablePath.h"
25 #include <WebCore/AuthenticationChallenge.h>
26 #include <WebCore/FileSystem.h>
27 #include <WebCore/NetworkingContext.h>
28 #include <WebCore/ResourceHandle.h>
29 #include <WebCore/RunLoop.h>
30 #include <wtf/text/CString.h>
31 #include <wtf/text/WTFString.h>
32
33 using namespace WebCore;
34
35 namespace WebKit {
36
37 void ProcessLauncher::launchProcess()
38 {
39     int sockets[2];
40     if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockets) < 0) {
41         ASSERT_NOT_REACHED();
42         return;
43     }
44
45     CString executablePath, pluginPath;
46     switch (m_launchOptions.processType) {
47     case WebProcess:
48         executablePath = executablePathOfWebProcess().utf8();
49         break;
50 #if ENABLE(PLUGIN_PROCESS)
51     case PluginProcess:
52         executablePath = executablePathOfPluginProcess().utf8();
53         pluginPath = m_launchOptions.extraInitializationData.get("plugin-path").utf8();
54         break;
55 #endif
56     default:
57         ASSERT_NOT_REACHED();
58         return;
59     }
60
61     char socket[5];
62     snprintf(socket, sizeof(socket), "%d", sockets[0]);
63
64 #ifndef NDEBUG
65     CString prefixedExecutablePath;
66     if (!m_launchOptions.processCmdPrefix.isEmpty()) {
67         String prefixedExecutablePathStr = m_launchOptions.processCmdPrefix + ' ' +
68             String::fromUTF8(executablePath.data()) + ' ' + socket + ' ' + String::fromUTF8(pluginPath.data());
69         prefixedExecutablePath = prefixedExecutablePathStr.utf8();
70     }
71 #endif
72
73     // Do not perform memory allocation in the middle of the fork()
74     // exec() below. FastMalloc can potentially deadlock because
75     // the fork() doesn't inherit the running threads.
76     pid_t pid = fork();
77     if (!pid) { // Child process.
78         close(sockets[1]);
79 #ifndef NDEBUG
80         if (!prefixedExecutablePath.isNull()) {
81             // FIXME: This is not correct because it invokes the shell
82             // and keeps this process waiting. Should be changed to
83             // something like execvp().
84             if (system(prefixedExecutablePath.data()) == -1) {
85                 ASSERT_NOT_REACHED();
86                 exit(EXIT_FAILURE);
87             } else
88                 exit(EXIT_SUCCESS);
89         }
90 #endif
91         execl(executablePath.data(), executablePath.data(), socket, pluginPath.data(), static_cast<char*>(0));
92     } else if (pid > 0) { // parent process;
93         close(sockets[0]);
94         m_processIdentifier = pid;
95         // We've finished launching the process, message back to the main run loop.
96         RunLoop::main()->dispatch(bind(&ProcessLauncher::didFinishLaunchingProcess, this, pid, sockets[1]));
97     } else {
98         ASSERT_NOT_REACHED();
99         return;
100     }
101 }
102
103 void ProcessLauncher::terminateProcess()
104 {
105     if (!m_processIdentifier)
106         return;
107     kill(m_processIdentifier, SIGKILL);
108 }
109
110 void ProcessLauncher::platformInvalidate()
111 {
112 }
113
114 } // namespace WebKit