| 
									
										
										
										
											2025-03-24 09:27:36 -04:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2025, Tim Flynn <trflynn89@ladybird.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <LibCore/Socket.h>
 | 
					
						
							|  |  |  | #include <LibCore/System.h>
 | 
					
						
							|  |  |  | #include <LibWebView/WebContentClient.h>
 | 
					
						
							|  |  |  | #include <LibWebView/WebUI.h>
 | 
					
						
							| 
									
										
										
										
											2025-03-24 09:50:12 -04:00
										 |  |  | #include <LibWebView/WebUI/ProcessesUI.h>
 | 
					
						
							| 
									
										
										
										
											2025-03-24 10:22:38 -04:00
										 |  |  | #include <LibWebView/WebUI/SettingsUI.h>
 | 
					
						
							| 
									
										
										
										
											2025-03-24 09:27:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace WebView { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | template<typename WebUIType> | 
					
						
							|  |  |  | static ErrorOr<NonnullRefPtr<WebUIType>> create_web_ui(WebContentClient& client, String host) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     Array<int, 2> socket_fds { 0, 0 }; | 
					
						
							|  |  |  |     TRY(Core::System::socketpair(AF_LOCAL, SOCK_STREAM, 0, socket_fds.data())); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto client_socket = Core::LocalSocket::adopt_fd(socket_fds[0]); | 
					
						
							|  |  |  |     if (client_socket.is_error()) { | 
					
						
							|  |  |  |         close(socket_fds[0]); | 
					
						
							|  |  |  |         close(socket_fds[1]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return client_socket.release_error(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-08 22:01:46 +02:00
										 |  |  |     auto web_ui = WebUIType::create(client, make<IPC::Transport>(client_socket.release_value()), move(host)); | 
					
						
							| 
									
										
										
										
											2025-03-24 09:27:36 -04:00
										 |  |  |     client.async_connect_to_web_ui(0, IPC::File::adopt_fd(socket_fds[1])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return web_ui; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-24 09:50:12 -04:00
										 |  |  | ErrorOr<RefPtr<WebUI>> WebUI::create(WebContentClient& client, String host) | 
					
						
							| 
									
										
										
										
											2025-03-24 09:27:36 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     RefPtr<WebUI> web_ui; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-24 09:50:12 -04:00
										 |  |  |     if (host == "processes"sv) | 
					
						
							|  |  |  |         web_ui = TRY(create_web_ui<ProcessesUI>(client, move(host))); | 
					
						
							| 
									
										
										
										
											2025-03-24 10:22:38 -04:00
										 |  |  |     else if (host == "settings"sv) | 
					
						
							|  |  |  |         web_ui = TRY(create_web_ui<SettingsUI>(client, move(host))); | 
					
						
							| 
									
										
										
										
											2025-03-24 09:50:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-24 09:27:36 -04:00
										 |  |  |     if (web_ui) | 
					
						
							|  |  |  |         web_ui->register_interfaces(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return web_ui; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-08 22:01:46 +02:00
										 |  |  | WebUI::WebUI(WebContentClient& client, NonnullOwnPtr<IPC::Transport> transport, String host) | 
					
						
							| 
									
										
										
										
											2025-03-24 09:27:36 -04:00
										 |  |  |     : IPC::ConnectionToServer<WebUIClientEndpoint, WebUIServerEndpoint>(*this, move(transport)) | 
					
						
							|  |  |  |     , m_client(client) | 
					
						
							|  |  |  |     , m_host(move(host)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | WebUI::~WebUI() = default; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebUI::die() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     m_client.web_ui_disconnected({}); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebUI::register_interface(StringView name, Interface interface) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto result = m_interfaces.set(name, move(interface)); | 
					
						
							|  |  |  |     VERIFY(result == HashSetResult::InsertedNewEntry); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void WebUI::received_message(String name, JsonValue data) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     auto interface = m_interfaces.get(name); | 
					
						
							|  |  |  |     if (!interface.has_value()) { | 
					
						
							|  |  |  |         warnln("Received message from WebUI for unrecognized interface: {}", name); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     interface.value()(move(data)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } |