Ladybird: Abstract spawning helper processes into separate methods

This will let us use the same path discovery methods for WebContent,
SQLServer, and any other helper processes we need to launch.
This commit is contained in:
Andrew Kaster 2023-02-02 03:00:30 -07:00 committed by Andrew Kaster
parent 792258afe8
commit 3e6d790cf0
Notes: sideshowbarker 2024-07-17 07:09:53 +09:00
4 changed files with 56 additions and 6 deletions

View file

@ -82,6 +82,7 @@ set(SOURCES
${BROWSER_SOURCE_DIR}/History.cpp
BrowserWindow.cpp
ConsoleWidget.cpp
HelperProcess.cpp
InspectorWidget.cpp
LocationEdit.cpp
ModelTranslator.cpp

View file

@ -0,0 +1,35 @@
/*
* Copyright (c) 2023, Andrew Kaster <akaster@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include "HelperProcess.h"
#include "Utilities.h"
#include <AK/String.h>
#include <QCoreApplication>
ErrorOr<void> spawn_helper_process(StringView process_name, Span<StringView> arguments, Core::System::SearchInPath search_in_path, Optional<Span<StringView>> environment)
{
auto paths = TRY(get_paths_for_helper_process(process_name));
VERIFY(!paths.is_empty());
ErrorOr<void> result;
for (auto const& path : paths) {
arguments[0] = path.bytes_as_string_view();
result = Core::System::exec(path, arguments, search_in_path, environment);
if (!result.is_error())
break;
}
return result;
}
ErrorOr<Vector<String>> get_paths_for_helper_process(StringView process_name)
{
Vector<String> paths;
TRY(paths.try_append(TRY(String::formatted("./{}/{}", process_name, process_name))));
TRY(paths.try_append(TRY(String::formatted("{}/{}", TRY(ak_string_from_qstring(QCoreApplication::applicationDirPath())), process_name))));
TRY(paths.try_append(TRY(String::formatted("./{}", process_name))));
// NOTE: Add platform-specific paths here
return paths;
}

18
Ladybird/HelperProcess.h Normal file
View file

@ -0,0 +1,18 @@
/*
* Copyright (c) 2023, Andrew Kaster <akaster@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#pragma once
#define AK_DONT_REPLACE_STD
#include <AK/Error.h>
#include <AK/Optional.h>
#include <AK/Span.h>
#include <AK/StringView.h>
#include <LibCore/System.h>
ErrorOr<void> spawn_helper_process(StringView process_name, Span<StringView> arguments, Core::System::SearchInPath, Optional<Span<StringView>> environment = {});
ErrorOr<Vector<String>> get_paths_for_helper_process(StringView process_name);

View file

@ -9,6 +9,7 @@
#include "WebContentView.h"
#include "ConsoleWidget.h"
#include "HelperProcess.h"
#include "InspectorWidget.h"
#include "Utilities.h"
#include <AK/Assertions.h>
@ -586,12 +587,7 @@ void WebContentView::create_client()
arguments.append(m_webdriver_content_ipc_path);
}
auto result = Core::System::exec("./WebContent/WebContent"sv, arguments, Core::System::SearchInPath::Yes);
if (result.is_error()) {
auto web_content_path = ak_deprecated_string_from_qstring(QCoreApplication::applicationDirPath() + "/WebContent");
result = Core::System::exec(web_content_path, arguments, Core::System::SearchInPath::Yes);
}
auto result = spawn_helper_process("WebContent"sv, arguments, Core::System::SearchInPath::Yes);
if (result.is_error())
warnln("Could not launch WebContent: {}", result.error());
VERIFY_NOT_REACHED();