main.cpp 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /*
  2. * Copyright (c) 2023, Andrew Kaster <akaster@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <Ladybird/FontPlugin.h>
  7. #include <Ladybird/HelperProcess.h>
  8. #include <Ladybird/Utilities.h>
  9. #include <LibCore/ArgsParser.h>
  10. #include <LibCore/EventLoop.h>
  11. #include <LibCore/LocalServer.h>
  12. #include <LibCore/StandardPaths.h>
  13. #include <LibCore/System.h>
  14. #include <LibFileSystem/FileSystem.h>
  15. #include <LibIPC/SingleServer.h>
  16. #include <LibMain/Main.h>
  17. #include <LibWeb/Bindings/MainThreadVM.h>
  18. #include <LibWeb/Loader/GeneratedPagesLoader.h>
  19. #include <LibWeb/Loader/ResourceLoader.h>
  20. #include <LibWeb/Platform/EventLoopPlugin.h>
  21. #include <LibWeb/Platform/EventLoopPluginSerenity.h>
  22. #include <LibWeb/WebSockets/WebSocket.h>
  23. #include <LibWebView/RequestServerAdapter.h>
  24. #include <LibWebView/WebSocketClientAdapter.h>
  25. #include <WebWorker/ConnectionFromClient.h>
  26. #if defined(HAVE_QT)
  27. # include <Ladybird/Qt/EventLoopImplementationQt.h>
  28. # include <Ladybird/Qt/RequestManagerQt.h>
  29. # include <QCoreApplication>
  30. #endif
  31. static ErrorOr<void> initialize_lagom_networking(int request_server_socket);
  32. ErrorOr<int> serenity_main(Main::Arguments arguments)
  33. {
  34. AK::set_rich_debug_enabled(true);
  35. int request_server_socket { -1 };
  36. StringView serenity_resource_root;
  37. Vector<ByteString> certificates;
  38. bool use_lagom_networking { false };
  39. Core::ArgsParser args_parser;
  40. args_parser.add_option(request_server_socket, "File descriptor of the request server socket", "request-server-socket", 's', "request-server-socket");
  41. args_parser.add_option(serenity_resource_root, "Absolute path to directory for serenity resources", "serenity-resource-root", 'r', "serenity-resource-root");
  42. args_parser.add_option(use_lagom_networking, "Enable Lagom servers for networking", "use-lagom-networking");
  43. args_parser.add_option(certificates, "Path to a certificate file", "certificate", 'C', "certificate");
  44. args_parser.parse(arguments);
  45. #if defined(HAVE_QT)
  46. QCoreApplication app(arguments.argc, arguments.argv);
  47. Core::EventLoopManager::install(*new Ladybird::EventLoopManagerQt);
  48. #endif
  49. Core::EventLoop event_loop;
  50. platform_init();
  51. Web::Platform::EventLoopPlugin::install(*new Web::Platform::EventLoopPluginSerenity);
  52. Web::Platform::FontPlugin::install(*new Ladybird::FontPlugin(false));
  53. #if defined(HAVE_QT)
  54. if (!use_lagom_networking)
  55. Web::ResourceLoader::initialize(Ladybird::RequestManagerQt::create(certificates));
  56. else
  57. #endif
  58. TRY(initialize_lagom_networking(request_server_socket));
  59. TRY(Web::Bindings::initialize_main_thread_vm(Web::HTML::EventLoop::Type::Worker));
  60. auto client = TRY(IPC::take_over_accepted_client_from_system_server<WebWorker::ConnectionFromClient>());
  61. return event_loop.exec();
  62. }
  63. static ErrorOr<void> initialize_lagom_networking(int request_server_socket)
  64. {
  65. auto socket = TRY(Core::LocalSocket::adopt_fd(request_server_socket));
  66. TRY(socket->set_blocking(true));
  67. auto new_client = TRY(try_make_ref_counted<Protocol::RequestClient>(move(socket)));
  68. Web::ResourceLoader::initialize(TRY(WebView::RequestServerAdapter::try_create(move(new_client))));
  69. return {};
  70. }