From f16f89eb32714195b977b3458052f5652e2e2ddf Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Mon, 22 Apr 2024 12:31:29 -0400 Subject: [PATCH] Ladybird+LibWebView: Move SQLServer launcher to Ladybird It previously resided in LibWebView to hide the details of launching a singleton process. That functionality now lives in LibCore. By moving this to Ladybird, we will be able to register the process with the task manager. --- Ladybird/AppKit/Application/Application.h | 2 ++ Ladybird/AppKit/Application/Application.mm | 5 +++++ Ladybird/AppKit/Application/ApplicationBridge.cpp | 8 ++++++++ Ladybird/AppKit/Application/ApplicationBridge.h | 2 ++ Ladybird/AppKit/main.mm | 4 ++-- Ladybird/CMakeLists.txt | 4 ++-- Ladybird/HelperProcess.cpp | 7 +++++++ Ladybird/HelperProcess.h | 2 ++ Ladybird/Qt/main.cpp | 4 +++- Ladybird/WebContent/CMakeLists.txt | 2 +- Ladybird/WebWorker/CMakeLists.txt | 2 +- Meta/gn/secondary/Ladybird/BUILD.gn | 1 + Meta/gn/secondary/Ladybird/WebContent/BUILD.gn | 1 + Meta/gn/secondary/Ladybird/WebWorker/BUILD.gn | 1 + Userland/Libraries/LibWebView/Database.cpp | 14 -------------- Userland/Libraries/LibWebView/Database.h | 6 +----- Userland/Utilities/headless-browser.cpp | 3 ++- 17 files changed, 41 insertions(+), 27 deletions(-) diff --git a/Ladybird/AppKit/Application/Application.h b/Ladybird/AppKit/Application/Application.h index 111eeb6997a..2399ed6c522 100644 --- a/Ladybird/AppKit/Application/Application.h +++ b/Ladybird/AppKit/Application/Application.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #import @@ -22,6 +23,7 @@ class WebViewBridge; - (instancetype)init; - (ErrorOr)launchRequestServer:(Vector const&)certificates; +- (ErrorOr>)launchSQLServer; - (ErrorOr>)launchWebContent:(Ladybird::WebViewBridge&)web_view_bridge; - (ErrorOr)launchWebWorker; diff --git a/Ladybird/AppKit/Application/Application.mm b/Ladybird/AppKit/Application/Application.mm index 3844759d1c8..ea0a5428bd0 100644 --- a/Ladybird/AppKit/Application/Application.mm +++ b/Ladybird/AppKit/Application/Application.mm @@ -40,6 +40,11 @@ return m_application_bridge->launch_request_server(certificates); } +- (ErrorOr>)launchSQLServer +{ + return m_application_bridge->launch_sql_server(); +} + - (ErrorOr>)launchWebContent:(Ladybird::WebViewBridge&)web_view_bridge { return m_application_bridge->launch_web_content(web_view_bridge); diff --git a/Ladybird/AppKit/Application/ApplicationBridge.cpp b/Ladybird/AppKit/Application/ApplicationBridge.cpp index 1b248692fd9..9d6e2d72189 100644 --- a/Ladybird/AppKit/Application/ApplicationBridge.cpp +++ b/Ladybird/AppKit/Application/ApplicationBridge.cpp @@ -37,6 +37,14 @@ ErrorOr ApplicationBridge::launch_request_server(Vector const& return {}; } +ErrorOr> ApplicationBridge::launch_sql_server() +{ + auto sql_server_paths = TRY(get_paths_for_helper_process("SQLServer"sv)); + auto sql_client = TRY(launch_sql_server_process(sql_server_paths)); + + return sql_client; +} + ErrorOr> ApplicationBridge::launch_web_content(WebViewBridge& web_view_bridge) { // FIXME: Fail to open the tab, rather than crashing the whole application if this fails diff --git a/Ladybird/AppKit/Application/ApplicationBridge.h b/Ladybird/AppKit/Application/ApplicationBridge.h index 7978343272c..599d989aa6e 100644 --- a/Ladybird/AppKit/Application/ApplicationBridge.h +++ b/Ladybird/AppKit/Application/ApplicationBridge.h @@ -9,6 +9,7 @@ #include #include #include +#include #include namespace Ladybird { @@ -22,6 +23,7 @@ public: ~ApplicationBridge(); ErrorOr launch_request_server(Vector const& certificates); + ErrorOr> launch_sql_server(); ErrorOr> launch_web_content(WebViewBridge&); ErrorOr launch_web_worker(); diff --git a/Ladybird/AppKit/main.mm b/Ladybird/AppKit/main.mm index 971bc52bf71..0fc27b48a84 100644 --- a/Ladybird/AppKit/main.mm +++ b/Ladybird/AppKit/main.mm @@ -67,8 +67,8 @@ ErrorOr serenity_main(Main::Arguments arguments) WebView::ProcessManager::the().add_process(pid, move(port)); }; - auto sql_server_paths = TRY(get_paths_for_helper_process("SQLServer"sv)); - auto database = TRY(WebView::Database::create(move(sql_server_paths))); + auto sql_client = TRY([application launchSQLServer]); + auto database = TRY(WebView::Database::create(move(sql_client))); auto cookie_jar = TRY(WebView::CookieJar::create(*database)); // FIXME: Create an abstraction to re-spawn the RequestServer and re-hook up its client hooks to each tab on crash diff --git a/Ladybird/CMakeLists.txt b/Ladybird/CMakeLists.txt index 21153519c2c..8ebcf7a81f6 100644 --- a/Ladybird/CMakeLists.txt +++ b/Ladybird/CMakeLists.txt @@ -186,7 +186,7 @@ target_sources(ladybird PUBLIC FILE_SET ladybird TYPE HEADERS BASE_DIRS ${SERENITY_SOURCE_DIR} FILES ${LADYBIRD_HEADERS} ) -target_link_libraries(ladybird PRIVATE AK LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibWeb LibWebView LibProtocol LibURL) +target_link_libraries(ladybird PRIVATE AK LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibSQL LibWeb LibWebView LibProtocol LibURL) target_include_directories(ladybird PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(ladybird PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) @@ -215,7 +215,7 @@ add_executable(headless-browser target_include_directories(headless-browser PRIVATE ${CMAKE_CURRENT_BINARY_DIR}) target_include_directories(headless-browser PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) -target_link_libraries(headless-browser PRIVATE AK LibCore LibWeb LibWebView LibWebSocket LibCrypto LibFileSystem LibGemini LibHTTP LibImageDecoderClient LibJS LibGfx LibMain LibTLS LibIPC LibDiff LibProtocol LibURL) +target_link_libraries(headless-browser PRIVATE AK LibCore LibWeb LibWebView LibWebSocket LibCrypto LibFileSystem LibGemini LibHTTP LibImageDecoderClient LibJS LibGfx LibMain LibSQL LibTLS LibIPC LibDiff LibProtocol LibURL) if (ANDROID) include(cmake/AndroidExtras.cmake) diff --git a/Ladybird/HelperProcess.cpp b/Ladybird/HelperProcess.cpp index b00d95d10be..5809fbe27bc 100644 --- a/Ladybird/HelperProcess.cpp +++ b/Ladybird/HelperProcess.cpp @@ -7,6 +7,7 @@ #include "HelperProcess.h" #include "Utilities.h" #include +#include #include ErrorOr> launch_web_content_process( @@ -184,6 +185,12 @@ ErrorOr> launch_request_server_process(Re return launch_generic_server_process(candidate_request_server_paths, "RequestServer"sv, move(arguments)); } +ErrorOr> launch_sql_server_process(ReadonlySpan candidate_sql_server_paths) +{ + auto [client, _] = TRY(Core::launch_singleton_process("SQLServer"sv, candidate_sql_server_paths)); + return client; +} + ErrorOr connect_new_request_server_client(Protocol::RequestClient& client) { auto new_socket = client.send_sync_but_allow_failure(); diff --git a/Ladybird/HelperProcess.h b/Ladybird/HelperProcess.h index bce225c9b48..36db98d0ab5 100644 --- a/Ladybird/HelperProcess.h +++ b/Ladybird/HelperProcess.h @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -26,5 +27,6 @@ ErrorOr> launch_web_content_process( ErrorOr> launch_image_decoder_process(ReadonlySpan candidate_image_decoder_paths); ErrorOr> launch_web_worker_process(ReadonlySpan candidate_web_worker_paths, NonnullRefPtr); ErrorOr> launch_request_server_process(ReadonlySpan candidate_request_server_paths, StringView serenity_resource_root, Vector const& certificates); +ErrorOr> launch_sql_server_process(ReadonlySpan candidate_sql_server_paths); ErrorOr connect_new_request_server_client(Protocol::RequestClient&); diff --git a/Ladybird/Qt/main.cpp b/Ladybird/Qt/main.cpp index 578a34ffcbe..c49a0d83231 100644 --- a/Ladybird/Qt/main.cpp +++ b/Ladybird/Qt/main.cpp @@ -117,7 +117,9 @@ ErrorOr serenity_main(Main::Arguments arguments) if (!disable_sql_database) { auto sql_server_paths = TRY(get_paths_for_helper_process("SQLServer"sv)); - database = TRY(WebView::Database::create(move(sql_server_paths))); + auto sql_client = TRY(launch_sql_server_process(sql_server_paths)); + + database = TRY(WebView::Database::create(sql_client)); } auto cookie_jar = database ? TRY(WebView::CookieJar::create(*database)) : WebView::CookieJar::create(); diff --git a/Ladybird/WebContent/CMakeLists.txt b/Ladybird/WebContent/CMakeLists.txt index d09de4361b7..bcd94f5f6ca 100644 --- a/Ladybird/WebContent/CMakeLists.txt +++ b/Ladybird/WebContent/CMakeLists.txt @@ -81,7 +81,7 @@ endif() target_include_directories(WebContent PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services/) target_include_directories(WebContent PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) target_include_directories(WebContent PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..) -target_link_libraries(WebContent PRIVATE LibAudio LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibWeb LibWebSocket LibProtocol LibWebView LibURL) +target_link_libraries(WebContent PRIVATE LibAudio LibCore LibFileSystem LibGfx LibImageDecoderClient LibIPC LibJS LibMain LibSQL LibWeb LibWebSocket LibProtocol LibWebView LibURL) if (HAVE_PULSEAUDIO) target_compile_definitions(WebContent PRIVATE HAVE_PULSEAUDIO=1) diff --git a/Ladybird/WebWorker/CMakeLists.txt b/Ladybird/WebWorker/CMakeLists.txt index 5be2980545a..e9735a9b4a7 100644 --- a/Ladybird/WebWorker/CMakeLists.txt +++ b/Ladybird/WebWorker/CMakeLists.txt @@ -19,7 +19,7 @@ add_library(webworker STATIC ${WEBWORKER_SOURCES}) target_include_directories(webworker PRIVATE ${SERENITY_SOURCE_DIR}/Userland/Services/) target_include_directories(webworker PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) target_include_directories(webworker PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/..) -target_link_libraries(webworker PUBLIC LibCore LibFileSystem LibGfx LibIPC LibJS LibProtocol LibWeb LibWebView LibLocale LibImageDecoderClient LibMain LibURL) +target_link_libraries(webworker PUBLIC LibCore LibFileSystem LibGfx LibIPC LibJS LibProtocol LibWeb LibWebView LibLocale LibImageDecoderClient LibMain LibSQL LibURL) add_executable(WebWorker main.cpp) target_include_directories(WebWorker PRIVATE ${SERENITY_SOURCE_DIR}/Userland/) diff --git a/Meta/gn/secondary/Ladybird/BUILD.gn b/Meta/gn/secondary/Ladybird/BUILD.gn index 226aea3af87..39ddaefc496 100644 --- a/Meta/gn/secondary/Ladybird/BUILD.gn +++ b/Meta/gn/secondary/Ladybird/BUILD.gn @@ -187,6 +187,7 @@ executable("headless-browser") { "//Userland/Libraries/LibJS", "//Userland/Libraries/LibMain", "//Userland/Libraries/LibProtocol", + "//Userland/Libraries/LibSQL", "//Userland/Libraries/LibTLS", "//Userland/Libraries/LibURL", "//Userland/Libraries/LibWeb", diff --git a/Meta/gn/secondary/Ladybird/WebContent/BUILD.gn b/Meta/gn/secondary/Ladybird/WebContent/BUILD.gn index 6cd08e07521..c33d6b43833 100644 --- a/Meta/gn/secondary/Ladybird/WebContent/BUILD.gn +++ b/Meta/gn/secondary/Ladybird/WebContent/BUILD.gn @@ -37,6 +37,7 @@ executable("WebContent") { "//Userland/Libraries/LibJS", "//Userland/Libraries/LibMain", "//Userland/Libraries/LibProtocol", + "//Userland/Libraries/LibSQL", "//Userland/Libraries/LibURL", "//Userland/Libraries/LibWeb", "//Userland/Libraries/LibWebSocket", diff --git a/Meta/gn/secondary/Ladybird/WebWorker/BUILD.gn b/Meta/gn/secondary/Ladybird/WebWorker/BUILD.gn index ec6bec47e6f..949d65221be 100644 --- a/Meta/gn/secondary/Ladybird/WebWorker/BUILD.gn +++ b/Meta/gn/secondary/Ladybird/WebWorker/BUILD.gn @@ -15,6 +15,7 @@ executable("WebWorker") { "//Userland/Libraries/LibLocale", "//Userland/Libraries/LibMain", "//Userland/Libraries/LibProtocol", + "//Userland/Libraries/LibSQL", "//Userland/Libraries/LibURL", "//Userland/Libraries/LibWeb", "//Userland/Libraries/LibWeb:WebWorkerClientEndpoint", diff --git a/Userland/Libraries/LibWebView/Database.cpp b/Userland/Libraries/LibWebView/Database.cpp index 16e4d05c4be..66cc4d56c3c 100644 --- a/Userland/Libraries/LibWebView/Database.cpp +++ b/Userland/Libraries/LibWebView/Database.cpp @@ -7,10 +7,6 @@ #include #include -#if !defined(AK_OS_SERENITY) -# include -#endif - namespace WebView { static constexpr auto database_name = "Browser"sv; @@ -21,16 +17,6 @@ ErrorOr> Database::create() return create(move(sql_client)); } -#if !defined(AK_OS_SERENITY) - -ErrorOr> Database::create(ReadonlySpan candidate_sql_server_paths) -{ - auto [sql_client, _] = TRY(Core::launch_singleton_process("SQLServer"sv, candidate_sql_server_paths)); - return create(move(sql_client)); -} - -#endif - ErrorOr> Database::create(NonnullRefPtr sql_client) { auto connection_id = sql_client->connect(database_name); diff --git a/Userland/Libraries/LibWebView/Database.h b/Userland/Libraries/LibWebView/Database.h index e26cbf8d9fa..3508f241e23 100644 --- a/Userland/Libraries/LibWebView/Database.h +++ b/Userland/Libraries/LibWebView/Database.h @@ -29,9 +29,7 @@ class Database : public RefCounted { public: static ErrorOr> create(); -#if !defined(AK_OS_SERENITY) - static ErrorOr> create(ReadonlySpan candidate_sql_server_paths); -#endif + static ErrorOr> create(NonnullRefPtr); ErrorOr prepare_statement(StringView statement); @@ -59,8 +57,6 @@ public: } private: - static ErrorOr> create(NonnullRefPtr); - struct ExecutionKey { constexpr bool operator==(ExecutionKey const&) const = default; diff --git a/Userland/Utilities/headless-browser.cpp b/Userland/Utilities/headless-browser.cpp index 63a97b8e26a..f170a75ae57 100644 --- a/Userland/Utilities/headless-browser.cpp +++ b/Userland/Utilities/headless-browser.cpp @@ -75,7 +75,8 @@ public: (void)certificates; #else auto sql_server_paths = TRY(get_paths_for_helper_process("SQLServer"sv)); - auto database = TRY(WebView::Database::create(move(sql_server_paths))); + auto sql_client = TRY(launch_sql_server_process(sql_server_paths)); + auto database = TRY(WebView::Database::create(move(sql_client))); auto request_server_paths = TRY(get_paths_for_helper_process("RequestServer"sv)); request_client = TRY(launch_request_server_process(request_server_paths, resources_folder, certificates));