[WPE][GTK] Merge ProcessLauncher[WPE,GTK]
authormcatanzaro@igalia.com <mcatanzaro@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 17 Sep 2017 14:34:02 +0000 (14:34 +0000)
committermcatanzaro@igalia.com <mcatanzaro@igalia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 17 Sep 2017 14:34:02 +0000 (14:34 +0000)
https://bugs.webkit.org/show_bug.cgi?id=177041

Reviewed by Carlos Garcia Campos.

* PlatformGTK.cmake:
* PlatformWPE.cmake:
* UIProcess/Launcher/glib/ProcessLauncherGLib.cpp: Renamed from Source/WebKit/UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp.
(WebKit::childSetupFunction):
(WebKit::ProcessLauncher::launchProcess):
(WebKit::ProcessLauncher::terminateProcess):
(WebKit::ProcessLauncher::platformInvalidate):
* UIProcess/Launcher/wpe/ProcessLauncherWPE.cpp: Removed.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@222133 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit/ChangeLog
Source/WebKit/PlatformGTK.cmake
Source/WebKit/PlatformWPE.cmake
Source/WebKit/UIProcess/Launcher/glib/ProcessLauncherGLib.cpp [moved from Source/WebKit/UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp with 75% similarity]
Source/WebKit/UIProcess/Launcher/wpe/ProcessLauncherWPE.cpp [deleted file]

index 4e5fb03..4e5a248 100644 (file)
@@ -1,3 +1,19 @@
+2017-09-17  Michael Catanzaro  <mcatanzaro@igalia.com>
+
+        [WPE][GTK] Merge ProcessLauncher[WPE,GTK]
+        https://bugs.webkit.org/show_bug.cgi?id=177041
+
+        Reviewed by Carlos Garcia Campos.
+
+        * PlatformGTK.cmake:
+        * PlatformWPE.cmake:
+        * UIProcess/Launcher/glib/ProcessLauncherGLib.cpp: Renamed from Source/WebKit/UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp.
+        (WebKit::childSetupFunction):
+        (WebKit::ProcessLauncher::launchProcess):
+        (WebKit::ProcessLauncher::terminateProcess):
+        (WebKit::ProcessLauncher::platformInvalidate):
+        * UIProcess/Launcher/wpe/ProcessLauncherWPE.cpp: Removed.
+
 2017-09-16  Tim Horton  <timothy_horton@apple.com>
 
         Fix the Tools build with CMake on macOS
index 681a98c..c18f1cf 100644 (file)
@@ -195,7 +195,7 @@ list(APPEND WebKit2_SOURCES
 
     UIProcess/Automation/gtk/WebAutomationSessionGtk.cpp
 
-    UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp
+    UIProcess/Launcher/glib/ProcessLauncherGLib.cpp
 
     UIProcess/linux/MemoryPressureMonitor.cpp
 
@@ -1014,7 +1014,7 @@ if (ENABLE_PLUGIN_PROCESS_GTK2)
 
         UIProcess/Launcher/ProcessLauncher.cpp
 
-        UIProcess/Launcher/gtk/ProcessLauncherGtk.cpp
+        UIProcess/Launcher/glib/ProcessLauncherGLib.cpp
 
         UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp
 
index c30729f..58f357e 100644 (file)
@@ -199,7 +199,7 @@ list(APPEND WebKit2_SOURCES
 
     UIProcess/Automation/cairo/WebAutomationSessionCairo.cpp
 
-    UIProcess/Launcher/wpe/ProcessLauncherWPE.cpp
+    UIProcess/Launcher/glib/ProcessLauncherGLib.cpp
 
     UIProcess/Plugins/unix/PluginInfoStoreUnix.cpp
     UIProcess/Plugins/unix/PluginProcessProxyUnix.cpp
 
 #include "Connection.h"
 #include "ProcessExecutablePath.h"
-#include <WebCore/AuthenticationChallenge.h>
 #include <WebCore/FileSystem.h>
-#include <WebCore/NetworkingContext.h>
-#include <WebCore/ResourceHandle.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <glib.h>
-#include <locale.h>
 #include <wtf/RunLoop.h>
 #include <wtf/UniStdExtras.h>
 #include <wtf/glib/GLibUtilities.h>
 #include <wtf/text/CString.h>
 #include <wtf/text/WTFString.h>
 
+#if PLATFORM(WPE)
+#include <wpe/renderer-host.h>
+#endif
+
 using namespace WebCore;
 
 namespace WebKit {
@@ -60,8 +60,12 @@ void ProcessLauncher::launchProcess()
 
     IPC::Connection::SocketPair socketPair = IPC::Connection::createPlatformConnection(IPC::Connection::ConnectionOptions::SetCloexecOnServer);
 
-    String executablePath, pluginPath;
-    CString realExecutablePath, realPluginPath;
+    String executablePath;
+    CString realExecutablePath;
+#if ENABLE(NETSCAPE_PLUGIN_API)
+    String pluginPath;
+    CString realPluginPath;
+#endif
     switch (m_launchOptions.processType) {
     case ProcessLauncher::ProcessType::Web:
         executablePath = executablePathOfWebProcess();
@@ -90,17 +94,24 @@ void ProcessLauncher::launchProcess()
     }
 
     realExecutablePath = fileSystemRepresentation(executablePath);
-    GUniquePtr<gchar> socket(g_strdup_printf("%d", socketPair.client));
-
-    unsigned nargs = 4; // size of the argv array for g_spawn_async()
+    GUniquePtr<gchar> webkitSocket(g_strdup_printf("%d", socketPair.client));
+    unsigned nargs = 3; // size of the argv array for g_spawn_async()
+
+#if PLATFORM(WPE)
+    GUniquePtr<gchar> wpeSocket;
+    if (m_launchOptions.processType == ProcessLauncher::ProcessType::Web) {
+        wpeSocket = GUniquePtr<gchar>(g_strdup_printf("%d", wpe_renderer_host_create_client()));
+        nargs++;
+    }
+#endif
 
 #if ENABLE(DEVELOPER_MODE)
     Vector<CString> prefixArgs;
     if (!m_launchOptions.processCmdPrefix.isNull()) {
         Vector<String> splitArgs;
         m_launchOptions.processCmdPrefix.split(' ', splitArgs);
-        for (auto it = splitArgs.begin(); it != splitArgs.end(); it++)
-            prefixArgs.append(it->utf8());
+        for (auto& arg : splitArgs)
+            prefixArgs.append(arg.utf8());
         nargs += prefixArgs.size();
     }
 #endif
@@ -109,19 +120,25 @@ void ProcessLauncher::launchProcess()
     unsigned i = 0;
 #if ENABLE(DEVELOPER_MODE)
     // If there's a prefix command, put it before the rest of the args.
-    for (auto it = prefixArgs.begin(); it != prefixArgs.end(); it++)
-        argv[i++] = const_cast<char*>(it->data());
+    for (auto& arg : prefixArgs)
+        argv[i++] = const_cast<char*>(arg.data());
 #endif
     argv[i++] = const_cast<char*>(realExecutablePath.data());
-    argv[i++] = socket.get();
+    argv[i++] = webkitSocket.get();
+#if PLATFORM(WPE)
+    if (m_launchOptions.processType == ProcessLauncher::ProcessType::Web)
+        argv[i++] = wpeSocket.get();
+#endif
+#if ENABLE(NETSCAPE_PLUGIN_API)
     argv[i++] = const_cast<char*>(realPluginPath.data());
-    argv[i++] = 0;
+#else
+    argv[i++] = nullptr;
+#endif
+    argv[i++] = nullptr;
 
     GUniqueOutPtr<GError> error;
-    if (!g_spawn_async(0, argv, 0, G_SPAWN_LEAVE_DESCRIPTORS_OPEN, childSetupFunction, GINT_TO_POINTER(socketPair.server), &pid, &error.outPtr())) {
-        g_printerr("Unable to fork a new WebProcess: %s.\n", error->message);
-        ASSERT_NOT_REACHED();
-    }
+    if (!g_spawn_async(nullptr, argv, nullptr, G_SPAWN_LEAVE_DESCRIPTORS_OPEN, childSetupFunction, GINT_TO_POINTER(socketPair.server), &pid, &error.outPtr()))
+        g_error("Unable to fork a new child process: %s", error->message);
 
     // Don't expose the parent socket to potential future children.
     if (!setCloseOnExec(socketPair.client))
@@ -131,10 +148,8 @@ void ProcessLauncher::launchProcess()
     m_processIdentifier = pid;
 
     // We've finished launching the process, message back to the main run loop.
-    RefPtr<ProcessLauncher> protector(this);
-    IPC::Connection::Identifier serverSocket = socketPair.server;
-    RunLoop::main().dispatch([protector, pid, serverSocket] {
-        protector->didFinishLaunchingProcess(pid, serverSocket);
+    RunLoop::main().dispatch([protectedThis = makeRef(*this), this, serverSocket = socketPair.server] {
+        didFinishLaunchingProcess(m_processIdentifier, serverSocket);
     });
 }
 
diff --git a/Source/WebKit/UIProcess/Launcher/wpe/ProcessLauncherWPE.cpp b/Source/WebKit/UIProcess/Launcher/wpe/ProcessLauncherWPE.cpp
deleted file mode 100644 (file)
index 2c62384..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
- * Portions Copyright (c) 2010 Motorola Mobility, Inc.  All rights reserved.
- *
- * 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 MOTOROLA INC. AND ITS 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 MOTOROLA INC. OR ITS 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 "ProcessLauncher.h"
-
-#include "Connection.h"
-#include "ProcessExecutablePath.h"
-#include <WebCore/FileSystem.h>
-#include <errno.h>
-#include <fcntl.h>
-#include <glib.h>
-#include <wpe/renderer-host.h>
-#include <wtf/RunLoop.h>
-#include <wtf/glib/GLibUtilities.h>
-#include <wtf/glib/GUniquePtr.h>
-#include <wtf/text/CString.h>
-#include <wtf/text/WTFString.h>
-
-// FIXME: Merge with ProcessLauncherGtk?
-
-using namespace WebCore;
-
-namespace WebKit {
-
-static void childSetupFunction(gpointer userData)
-{
-    int socket = GPOINTER_TO_INT(userData);
-    close(socket);
-}
-
-void ProcessLauncher::launchProcess()
-{
-    GPid pid = 0;
-
-    IPC::Connection::SocketPair socketPair = IPC::Connection::createPlatformConnection(IPC::Connection::ConnectionOptions::SetCloexecOnServer);
-
-    String executablePath;
-    CString realExecutablePath;
-    switch (m_launchOptions.processType) {
-    case ProcessLauncher::ProcessType::Web:
-        executablePath = executablePathOfWebProcess();
-        break;
-    case ProcessLauncher::ProcessType::Network:
-        executablePath = executablePathOfNetworkProcess();
-        break;
-    case ProcessLauncher::ProcessType::Storage:
-        executablePath = executablePathOfStorageProcess();
-        break;
-    default:
-        ASSERT_NOT_REACHED();
-        return;
-    }
-
-    realExecutablePath = fileSystemRepresentation(executablePath);
-    GUniquePtr<gchar> wkSocket(g_strdup_printf("%d", socketPair.client));
-    GUniquePtr<gchar> wpeSocket;
-
-    unsigned nargs = 4; // size of the argv array for g_spawn_async()
-    if (m_launchOptions.processType == ProcessLauncher::ProcessType::Web) {
-        wpeSocket = GUniquePtr<gchar>(g_strdup_printf("%d", wpe_renderer_host_create_client()));
-        nargs = 5;
-    }
-
-#if ENABLE(DEVELOPER_MODE)
-    Vector<CString> prefixArgs;
-    if (!m_launchOptions.processCmdPrefix.isNull()) {
-        Vector<String> splitArgs;
-        m_launchOptions.processCmdPrefix.split(' ', splitArgs);
-        for (auto it = splitArgs.begin(); it != splitArgs.end(); it++)
-            prefixArgs.append(it->utf8());
-        nargs += prefixArgs.size();
-    }
-#endif
-
-    char** argv = g_newa(char*, nargs);
-    unsigned i = 0;
-#if ENABLE(DEVELOPER_MODE)
-    // If there's a prefix command, put it before the rest of the args.
-    for (auto it = prefixArgs.begin(); it != prefixArgs.end(); it++)
-        argv[i++] = const_cast<char*>(it->data());
-#endif
-    argv[i++] = const_cast<char*>(realExecutablePath.data());
-    argv[i++] = wkSocket.get();
-    if (m_launchOptions.processType == ProcessLauncher::ProcessType::Web)
-        argv[i++] = wpeSocket.get();
-    argv[i++] = nullptr;
-
-    GUniqueOutPtr<GError> error;
-    if (!g_spawn_async(0, argv, 0, G_SPAWN_LEAVE_DESCRIPTORS_OPEN, childSetupFunction, GINT_TO_POINTER(socketPair.server), &pid, &error.outPtr())) {
-        g_printerr("Unable to fork a new WebProcess: %s.\n", error->message);
-        ASSERT_NOT_REACHED();
-    }
-
-    // Don't expose the parent socket to potential future children.
-    while (fcntl(socketPair.client, F_SETFD, FD_CLOEXEC) == -1)
-        RELEASE_ASSERT(errno != EINTR);
-
-    close(socketPair.client);
-    m_processIdentifier = pid;
-
-    // We've finished launching the process, message back to the main run loop.
-    RefPtr<ProcessLauncher> protectedThis(this);
-    IPC::Connection::Identifier serverSocket = socketPair.server;
-    RunLoop::main().dispatch([protectedThis, pid, serverSocket] {
-        protectedThis->didFinishLaunchingProcess(pid, serverSocket);
-    });
-}
-
-void ProcessLauncher::terminateProcess()
-{
-    if (m_isLaunching) {
-        invalidate();
-        return;
-    }
-
-    if (!m_processIdentifier)
-        return;
-
-    kill(m_processIdentifier, SIGKILL);
-    m_processIdentifier = 0;
-}
-
-void ProcessLauncher::platformInvalidate()
-{
-}
-
-} // namespace WebKit