| 
									
										
										
										
											2022-07-03 20:44:58 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2022, Andreas Kling <kling@serenityos.org> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * SPDX-License-Identifier: BSD-2-Clause | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 21:26:51 +02:00
										 |  |  | #include "BrowserWindow.h"
 | 
					
						
							| 
									
										
										
										
											2023-04-24 14:51:19 +02:00
										 |  |  | #include "EventLoopImplementationQt.h"
 | 
					
						
							| 
									
										
										
										
											2023-02-02 03:03:46 -07:00
										 |  |  | #include "HelperProcess.h"
 | 
					
						
							| 
									
										
										
										
											2022-07-14 05:41:13 +02:00
										 |  |  | #include "Settings.h"
 | 
					
						
							| 
									
										
										
										
											2022-10-05 15:23:41 +02:00
										 |  |  | #include "Utilities.h"
 | 
					
						
							| 
									
										
										
										
											2023-01-27 10:41:24 +01:00
										 |  |  | #include "WebContentView.h"
 | 
					
						
							| 
									
										
										
										
											2023-01-21 00:30:05 +01:00
										 |  |  | #include <AK/OwnPtr.h>
 | 
					
						
							| 
									
										
										
										
											2022-12-05 13:09:42 -05:00
										 |  |  | #include <Browser/CookieJar.h>
 | 
					
						
							|  |  |  | #include <Browser/Database.h>
 | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  | #include <LibCore/ArgsParser.h>
 | 
					
						
							| 
									
										
										
										
											2022-10-05 15:23:41 +02:00
										 |  |  | #include <LibCore/EventLoop.h>
 | 
					
						
							| 
									
										
										
										
											2022-10-24 11:18:22 +02:00
										 |  |  | #include <LibCore/System.h>
 | 
					
						
							| 
									
										
										
										
											2023-03-22 02:35:30 +11:00
										 |  |  | #include <LibFileSystem/FileSystem.h>
 | 
					
						
							| 
									
										
										
										
											2022-10-05 15:23:41 +02:00
										 |  |  | #include <LibGfx/Font/FontDatabase.h>
 | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  | #include <LibMain/Main.h>
 | 
					
						
							| 
									
										
										
										
											2022-12-05 13:09:42 -05:00
										 |  |  | #include <LibSQL/SQLClient.h>
 | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  | #include <QApplication>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-21 00:30:05 +01:00
										 |  |  | AK::OwnPtr<Browser::Settings> s_settings; | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-24 11:18:22 +02:00
										 |  |  | static ErrorOr<void> handle_attached_debugger() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #ifdef AK_OS_LINUX
 | 
					
						
							|  |  |  |     // Let's ignore SIGINT if we're being debugged because GDB
 | 
					
						
							|  |  |  |     // incorrectly forwards the signal to us even when it's set to
 | 
					
						
							|  |  |  |     // "nopass". See https://sourceware.org/bugzilla/show_bug.cgi?id=9425
 | 
					
						
							|  |  |  |     // for details.
 | 
					
						
							| 
									
										
										
										
											2023-02-09 03:02:46 +01:00
										 |  |  |     auto unbuffered_status_file = TRY(Core::File::open("/proc/self/status"sv, Core::File::OpenMode::Read)); | 
					
						
							|  |  |  |     auto status_file = TRY(Core::BufferedFile::create(move(unbuffered_status_file))); | 
					
						
							| 
									
										
										
										
											2022-10-24 11:18:22 +02:00
										 |  |  |     auto buffer = TRY(ByteBuffer::create_uninitialized(4096)); | 
					
						
							|  |  |  |     while (TRY(status_file->can_read_line())) { | 
					
						
							|  |  |  |         auto line = TRY(status_file->read_line(buffer)); | 
					
						
							|  |  |  |         auto const parts = line.split_view(':'); | 
					
						
							|  |  |  |         if (parts.size() < 2 || parts[0] != "TracerPid"sv) | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  |         auto tracer_pid = parts[1].to_uint<u32>(); | 
					
						
							|  |  |  |         if (tracer_pid != 0UL) { | 
					
						
							|  |  |  |             dbgln("Debugger is attached, ignoring SIGINT"); | 
					
						
							|  |  |  |             TRY(Core::System::signal(SIGINT, SIG_IGN)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  |     return {}; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  | ErrorOr<int> serenity_main(Main::Arguments arguments) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2023-04-24 14:51:19 +02:00
										 |  |  |     QApplication app(arguments.argc, arguments.argv); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     Core::EventLoop::make_implementation = Ladybird::EventLoopImplementationQt::create; | 
					
						
							| 
									
										
										
										
											2022-10-05 15:23:41 +02:00
										 |  |  |     Core::EventLoop event_loop; | 
					
						
							| 
									
										
										
										
											2023-04-25 16:53:07 +02:00
										 |  |  |     static_cast<Ladybird::EventLoopImplementationQt&>(event_loop.impl()).set_main_loop(); | 
					
						
							| 
									
										
										
										
											2022-10-05 15:23:41 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-24 11:18:22 +02:00
										 |  |  |     TRY(handle_attached_debugger()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-07 17:08:29 -06:00
										 |  |  |     platform_init(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // NOTE: We only instantiate this to ensure that Gfx::FontDatabase has its default queries initialized.
 | 
					
						
							|  |  |  |     Gfx::FontDatabase::set_default_font_query("Katica 10 400 0"); | 
					
						
							|  |  |  |     Gfx::FontDatabase::set_fixed_width_font_query("Csilla 10 400 0"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-09 20:32:45 +03:00
										 |  |  |     StringView raw_url; | 
					
						
							| 
									
										
										
										
											2022-12-15 09:18:52 -05:00
										 |  |  |     StringView webdriver_content_ipc_path; | 
					
						
							| 
									
										
										
										
											2023-04-15 01:04:28 +01:00
										 |  |  |     bool enable_callgrind_profiling = false; | 
					
						
							| 
									
										
										
										
											2023-04-20 14:26:06 -04:00
										 |  |  |     bool disable_sql_database = false; | 
					
						
							| 
									
										
										
										
											2022-11-14 11:08:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  |     Core::ArgsParser args_parser; | 
					
						
							|  |  |  |     args_parser.set_general_help("The Ladybird web browser :^)"); | 
					
						
							| 
									
										
										
										
											2022-10-09 20:32:45 +03:00
										 |  |  |     args_parser.add_positional_argument(raw_url, "URL to open", "url", Core::ArgsParser::Required::No); | 
					
						
							| 
									
										
										
										
											2022-12-15 09:18:52 -05:00
										 |  |  |     args_parser.add_option(webdriver_content_ipc_path, "Path to WebDriver IPC for WebContent", "webdriver-content-path", 0, "path"); | 
					
						
							| 
									
										
										
										
											2023-04-15 01:04:28 +01:00
										 |  |  |     args_parser.add_option(enable_callgrind_profiling, "Enable Callgrind profiling", "enable-callgrind-profiling", 'P'); | 
					
						
							| 
									
										
										
										
											2023-04-20 14:26:06 -04:00
										 |  |  |     args_parser.add_option(disable_sql_database, "Disable SQL database", "disable-sql-database", 0); | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  |     args_parser.parse(arguments); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-27 00:37:31 +00:00
										 |  |  |     auto get_formatted_url = [&](StringView const& raw_url) -> ErrorOr<URL> { | 
					
						
							| 
									
										
										
										
											2023-02-01 19:06:27 +01:00
										 |  |  |         URL url = raw_url; | 
					
						
							| 
									
										
										
										
											2023-03-22 02:35:30 +11:00
										 |  |  |         if (FileSystem::exists(raw_url)) | 
					
						
							| 
									
										
										
										
											2023-03-27 00:37:31 +00:00
										 |  |  |             url = URL::create_with_file_scheme(TRY(FileSystem::real_path(raw_url)).to_deprecated_string()); | 
					
						
							| 
									
										
										
										
											2023-02-01 19:06:27 +01:00
										 |  |  |         else if (!url.is_valid()) | 
					
						
							|  |  |  |             url = DeprecatedString::formatted("http://{}", raw_url); | 
					
						
							|  |  |  |         return url; | 
					
						
							|  |  |  |     }; | 
					
						
							| 
									
										
										
										
											2023-01-27 10:41:24 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-20 14:26:06 -04:00
										 |  |  |     RefPtr<Browser::Database> database; | 
					
						
							| 
									
										
										
										
											2023-01-29 07:20:20 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-20 14:26:06 -04:00
										 |  |  |     if (!disable_sql_database) { | 
					
						
							|  |  |  |         auto sql_server_paths = TRY(get_paths_for_helper_process("SQLServer"sv)); | 
					
						
							|  |  |  |         auto sql_client = TRY(SQL::SQLClient::launch_server_and_create_client(move(sql_server_paths))); | 
					
						
							|  |  |  |         database = TRY(Browser::Database::create(move(sql_client))); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     auto cookie_jar = database ? TRY(Browser::CookieJar::create(*database)) : Browser::CookieJar::create(); | 
					
						
							| 
									
										
										
										
											2022-12-05 13:09:42 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-21 00:30:05 +01:00
										 |  |  |     s_settings = adopt_own_if_nonnull(new Browser::Settings()); | 
					
						
							| 
									
										
										
										
											2023-04-15 01:04:28 +01:00
										 |  |  |     BrowserWindow window(cookie_jar, webdriver_content_ipc_path, enable_callgrind_profiling ? WebView::EnableCallgrindProfiling::Yes : WebView::EnableCallgrindProfiling::No); | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  |     window.setWindowTitle("Ladybird"); | 
					
						
							|  |  |  |     window.resize(800, 600); | 
					
						
							|  |  |  |     window.show(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-27 00:37:31 +00:00
										 |  |  |     if (auto url = TRY(get_formatted_url(raw_url)); url.is_valid()) { | 
					
						
							| 
									
										
										
										
											2022-07-03 21:26:51 +02:00
										 |  |  |         window.view().load(url); | 
					
						
							| 
									
										
										
										
											2023-02-01 19:07:15 +01:00
										 |  |  |     } else if (!s_settings->homepage().isEmpty()) { | 
					
						
							|  |  |  |         auto home_url = TRY(ak_string_from_qstring(s_settings->homepage())); | 
					
						
							| 
									
										
										
										
											2023-03-27 00:37:31 +00:00
										 |  |  |         window.view().load(TRY(get_formatted_url(home_url.bytes_as_string_view()))); | 
					
						
							| 
									
										
										
										
											2023-02-01 19:07:15 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-24 14:51:19 +02:00
										 |  |  |     return event_loop.exec(); | 
					
						
							| 
									
										
										
										
											2022-07-03 20:36:07 +02:00
										 |  |  | } |