From add15a5f04984592121839a27fcb59992ec1b737 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Sun, 12 Mar 2023 12:35:06 -0400 Subject: Ladybird+LibWebView: Move WebContent process launcher to LibWebView This is to allow headless-browser to reuse this code. We have a similar helper for launching SQLServer from Ladybird. --- .../Libraries/LibWebView/ViewImplementation.cpp | 62 ++++++++++++++++++++++ 1 file changed, 62 insertions(+) (limited to 'Userland/Libraries/LibWebView/ViewImplementation.cpp') diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp index e547191e81..85332ee979 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.cpp +++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp @@ -124,4 +124,66 @@ void ViewImplementation::run_javascript(StringView js_source) client().async_run_javascript(js_source); } +#if !defined(AK_OS_SERENITY) + +ErrorOr> ViewImplementation::launch_web_content_process(ReadonlySpan candidate_web_content_paths, StringView webdriver_content_ipc_path) +{ + int socket_fds[2] {}; + TRY(Core::System::socketpair(AF_LOCAL, SOCK_STREAM, 0, socket_fds)); + + int ui_fd = socket_fds[0]; + int wc_fd = socket_fds[1]; + + int fd_passing_socket_fds[2] {}; + TRY(Core::System::socketpair(AF_LOCAL, SOCK_STREAM, 0, fd_passing_socket_fds)); + + int ui_fd_passing_fd = fd_passing_socket_fds[0]; + int wc_fd_passing_fd = fd_passing_socket_fds[1]; + + if (auto child_pid = TRY(Core::System::fork()); child_pid == 0) { + TRY(Core::System::close(ui_fd_passing_fd)); + TRY(Core::System::close(ui_fd)); + + auto takeover_string = TRY(String::formatted("WebContent:{}", wc_fd)); + TRY(Core::System::setenv("SOCKET_TAKEOVER"sv, takeover_string, true)); + + auto webcontent_fd_passing_socket_string = TRY(String::number(wc_fd_passing_fd)); + + Vector arguments { + "WebContent"sv, + "--webcontent-fd-passing-socket"sv, + webcontent_fd_passing_socket_string + }; + + if (!webdriver_content_ipc_path.is_empty()) { + TRY(arguments.try_append("--webdriver-content-path"sv)); + TRY(arguments.try_append(webdriver_content_ipc_path)); + } + + ErrorOr result; + for (auto const& path : candidate_web_content_paths) { + result = Core::System::exec(path, arguments, Core::System::SearchInPath::Yes); + if (!result.is_error()) + break; + } + + if (result.is_error()) + warnln("Could not launch any of {}: {}", candidate_web_content_paths, result.error()); + VERIFY_NOT_REACHED(); + } + + TRY(Core::System::close(wc_fd_passing_fd)); + TRY(Core::System::close(wc_fd)); + + auto socket = TRY(Core::LocalSocket::adopt_fd(ui_fd)); + TRY(socket->set_blocking(true)); + + auto new_client = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) WebView::WebContentClient(move(socket), *this))); + new_client->set_fd_passing_socket(TRY(Core::LocalSocket::adopt_fd(ui_fd_passing_fd))); + + return new_client; +} + +#endif + } -- cgit v1.2.3