/* * Copyright (c) 2023, Andrew Kaster * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if defined(HAVE_QT) # include # include #endif static ErrorOr initialize_resource_loader(GC::Heap&, int request_server_socket); ErrorOr serenity_main(Main::Arguments arguments) { AK::set_rich_debug_enabled(true); int request_server_socket { -1 }; StringView serenity_resource_root; Vector certificates; bool wait_for_debugger = false; Core::ArgsParser args_parser; args_parser.add_option(request_server_socket, "File descriptor of the request server socket", "request-server-socket", 's', "request-server-socket"); args_parser.add_option(serenity_resource_root, "Absolute path to directory for serenity resources", "serenity-resource-root", 'r', "serenity-resource-root"); args_parser.add_option(certificates, "Path to a certificate file", "certificate", 'C', "certificate"); args_parser.add_option(wait_for_debugger, "Wait for debugger", "wait-for-debugger"); args_parser.parse(arguments); if (wait_for_debugger) Core::Process::wait_for_debugger_and_break(); #if defined(HAVE_QT) QCoreApplication app(arguments.argc, arguments.argv); Core::EventLoopManager::install(*new WebView::EventLoopManagerQt); #endif Core::EventLoop event_loop; WebView::platform_init(); Web::Platform::EventLoopPlugin::install(*new Web::Platform::EventLoopPluginSerenity); Web::Platform::FontPlugin::install(*new WebView::FontPlugin(false)); TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Worker)); TRY(initialize_resource_loader(Web::Bindings::main_thread_vm().heap(), request_server_socket)); auto client = TRY(IPC::take_over_accepted_client_from_system_server()); return event_loop.exec(); } static ErrorOr initialize_resource_loader(GC::Heap& heap, int request_server_socket) { static_assert(IsSame, "Need to handle other IPC transports here"); auto socket = TRY(Core::LocalSocket::adopt_fd(request_server_socket)); TRY(socket->set_blocking(true)); auto request_client = TRY(try_make_ref_counted(IPC::Transport(move(socket)))); Web::ResourceLoader::initialize(heap, move(request_client)); return {}; }