2023-11-08 18:47:41 +00:00
/*
* Copyright ( c ) 2023 , Andrew Kaster < akaster @ serenityos . org >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
# include <Ladybird/FontPlugin.h>
# include <Ladybird/HelperProcess.h>
# include <Ladybird/Utilities.h>
# include <LibCore/ArgsParser.h>
# include <LibCore/EventLoop.h>
# include <LibCore/LocalServer.h>
2024-08-01 11:03:03 +00:00
# include <LibCore/Process.h>
2023-11-08 18:47:41 +00:00
# include <LibCore/StandardPaths.h>
# include <LibCore/System.h>
# include <LibFileSystem/FileSystem.h>
# include <LibIPC/SingleServer.h>
# include <LibMain/Main.h>
# include <LibWeb/Bindings/MainThreadVM.h>
# include <LibWeb/Loader/GeneratedPagesLoader.h>
# include <LibWeb/Loader/ResourceLoader.h>
# include <LibWeb/Platform/EventLoopPlugin.h>
# include <LibWeb/Platform/EventLoopPluginSerenity.h>
# include <LibWeb/WebSockets/WebSocket.h>
# include <LibWebView/RequestServerAdapter.h>
# include <LibWebView/WebSocketClientAdapter.h>
# include <WebWorker/ConnectionFromClient.h>
2024-07-06 02:41:07 +00:00
# if defined(HAVE_QT)
# include <Ladybird / Qt / EventLoopImplementationQt.h>
# include <Ladybird / Qt / RequestManagerQt.h>
# include <QCoreApplication>
# endif
2024-04-18 00:44:39 +00:00
static ErrorOr < void > initialize_lagom_networking ( int request_server_socket ) ;
2023-11-08 18:47:41 +00:00
ErrorOr < int > serenity_main ( Main : : Arguments arguments )
{
2023-12-11 18:19:41 +00:00
AK : : set_rich_debug_enabled ( true ) ;
2024-04-15 23:39:48 +00:00
int request_server_socket { - 1 } ;
2024-01-06 20:13:59 +00:00
StringView serenity_resource_root ;
2024-07-10 11:50:21 +00:00
Vector < ByteString > certificates ;
2024-07-06 02:41:07 +00:00
bool use_lagom_networking { false } ;
2024-08-01 11:03:03 +00:00
bool wait_for_debugger = false ;
2023-11-08 18:47:41 +00:00
Core : : ArgsParser args_parser ;
2024-04-15 23:39:48 +00:00
args_parser . add_option ( request_server_socket , " File descriptor of the request server socket " , " request-server-socket " , ' s ' , " request-server-socket " ) ;
2024-01-06 20:13:59 +00:00
args_parser . add_option ( serenity_resource_root , " Absolute path to directory for serenity resources " , " serenity-resource-root " , ' r ' , " serenity-resource-root " ) ;
2024-07-06 02:41:07 +00:00
args_parser . add_option ( use_lagom_networking , " Enable Lagom servers for networking " , " use-lagom-networking " ) ;
2024-07-10 11:50:21 +00:00
args_parser . add_option ( certificates , " Path to a certificate file " , " certificate " , ' C ' , " certificate " ) ;
2024-08-01 11:03:03 +00:00
args_parser . add_option ( wait_for_debugger , " Wait for debugger " , " wait-for-debugger " ) ;
2023-11-08 18:47:41 +00:00
args_parser . parse ( arguments ) ;
2024-08-01 11:03:03 +00:00
if ( wait_for_debugger )
Core : : Process : : wait_for_debugger_and_break ( ) ;
2024-07-06 02:41:07 +00:00
# if defined(HAVE_QT)
QCoreApplication app ( arguments . argc , arguments . argv ) ;
Core : : EventLoopManager : : install ( * new Ladybird : : EventLoopManagerQt ) ;
# endif
Core : : EventLoop event_loop ;
2023-11-08 18:47:41 +00:00
platform_init ( ) ;
Web : : Platform : : EventLoopPlugin : : install ( * new Web : : Platform : : EventLoopPluginSerenity ) ;
2024-06-04 13:18:48 +00:00
Web : : Platform : : FontPlugin : : install ( * new Ladybird : : FontPlugin ( false ) ) ;
2023-11-08 18:47:41 +00:00
2024-07-06 02:41:07 +00:00
# if defined(HAVE_QT)
if ( ! use_lagom_networking )
2024-07-10 11:50:21 +00:00
Web : : ResourceLoader : : initialize ( Ladybird : : RequestManagerQt : : create ( certificates ) ) ;
2024-07-06 02:41:07 +00:00
else
# endif
TRY ( initialize_lagom_networking ( request_server_socket ) ) ;
2023-11-08 18:47:41 +00:00
2024-07-09 08:59:25 +00:00
TRY ( Web : : Bindings : : initialize_main_thread_vm ( Web : : HTML : : EventLoop : : Type : : Worker ) ) ;
2023-11-08 18:47:41 +00:00
auto client = TRY ( IPC : : take_over_accepted_client_from_system_server < WebWorker : : ConnectionFromClient > ( ) ) ;
return event_loop . exec ( ) ;
}
2024-04-18 00:44:39 +00:00
static ErrorOr < void > initialize_lagom_networking ( int request_server_socket )
2023-11-08 18:47:41 +00:00
{
2024-04-15 23:39:48 +00:00
auto socket = TRY ( Core : : LocalSocket : : adopt_fd ( request_server_socket ) ) ;
TRY ( socket - > set_blocking ( true ) ) ;
2024-08-07 03:51:20 +00:00
auto new_client = TRY ( try_make_ref_counted < Requests : : RequestClient > ( move ( socket ) ) ) ;
2024-04-15 23:39:48 +00:00
Web : : ResourceLoader : : initialize ( TRY ( WebView : : RequestServerAdapter : : try_create ( move ( new_client ) ) ) ) ;
2023-11-08 18:47:41 +00:00
return { } ;
}