summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibWebView/ViewImplementation.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Libraries/LibWebView/ViewImplementation.cpp')
-rw-r--r--Userland/Libraries/LibWebView/ViewImplementation.cpp62
1 files changed, 62 insertions, 0 deletions
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<NonnullRefPtr<WebView::WebContentClient>> ViewImplementation::launch_web_content_process(ReadonlySpan<String> 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<StringView> 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<void> 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
+
}