2022-07-03 21:44:58 +03:00
/*
* Copyright ( c ) 2022 , Andreas Kling < kling @ serenityos . org >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
2022-07-03 22:26:51 +03:00
# include "BrowserWindow.h"
2022-07-14 06:41:13 +03:00
# include "Settings.h"
2022-10-05 16:23:41 +03:00
# include "Utilities.h"
2022-12-05 21:09:42 +03:00
# include <Browser/CookieJar.h>
# include <Browser/Database.h>
2022-07-03 21:36:07 +03:00
# include <LibCore/ArgsParser.h>
2022-10-05 16:23:41 +03:00
# include <LibCore/EventLoop.h>
2022-10-09 20:32:45 +03:00
# include <LibCore/File.h>
2022-10-24 12:18:22 +03:00
# include <LibCore/Stream.h>
# include <LibCore/System.h>
2022-10-05 16:23:41 +03:00
# include <LibGfx/Font/FontDatabase.h>
2022-07-03 21:36:07 +03:00
# include <LibMain/Main.h>
2022-12-05 21:09:42 +03:00
# include <LibSQL/SQLClient.h>
2022-07-03 21:36:07 +03:00
# include <QApplication>
2022-07-14 06:41:13 +03:00
Browser : : Settings * s_settings ;
2022-07-03 21:36:07 +03:00
2022-10-24 12:18:22 +03: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.
auto unbuffered_status_file = TRY ( Core : : Stream : : File : : open ( " /proc/self/status " sv , Core : : Stream : : OpenMode : : Read ) ) ;
auto status_file = TRY ( Core : : Stream : : BufferedFile : : create ( move ( unbuffered_status_file ) ) ) ;
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 21:36:07 +03:00
ErrorOr < int > serenity_main ( Main : : Arguments arguments )
{
2022-10-05 16:23:41 +03:00
// NOTE: This is only used for the Core::Socket inside the IPC connections.
// FIXME: Refactor things so we can get rid of this somehow.
Core : : EventLoop event_loop ;
2022-10-24 12:18:22 +03:00
TRY ( handle_attached_debugger ( ) ) ;
2022-12-10 01:10:09 +03:00
auto sql_client = TRY ( SQL : : SQLClient : : launch_server_and_create_client ( " ./SQLServer/SQLServer " sv ) ) ;
auto database = TRY ( Browser : : Database : : create ( move ( sql_client ) ) ) ;
2022-10-05 16:23:41 +03:00
QApplication app ( arguments . argc , arguments . argv ) ;
2022-07-03 21:36:07 +03:00
2022-10-08 02:08:29 +03: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-11-14 19:08:44 +03:00
int webdriver_fd_passing_socket { - 1 } ;
2022-07-03 21:36:07 +03: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-11-14 19:08:44 +03:00
args_parser . add_option ( webdriver_fd_passing_socket , " File descriptor of the passing socket for the WebDriver connection " , " webdriver-fd-passing-socket " , ' d ' , " webdriver_fd_passing_socket " ) ;
2022-07-03 21:36:07 +03:00
args_parser . parse ( arguments ) ;
2022-12-05 21:09:42 +03:00
auto cookie_jar = TRY ( Browser : : CookieJar : : create ( * database ) ) ;
BrowserWindow window ( cookie_jar , webdriver_fd_passing_socket ) ;
2022-10-01 21:46:24 +03:00
s_settings = new Browser : : Settings ( & window ) ;
2022-07-03 21:36:07 +03:00
window . setWindowTitle ( " Ladybird " ) ;
window . resize ( 800 , 600 ) ;
window . show ( ) ;
2022-10-09 20:32:45 +03:00
URL url = raw_url ;
if ( Core : : File : : exists ( raw_url ) )
url = URL : : create_with_file_scheme ( Core : : File : : real_path_for ( raw_url ) ) ;
else if ( ! url . is_valid ( ) )
2022-12-04 21:43:54 +03:00
url = DeprecatedString : : formatted ( " http://{} " , raw_url ) ;
2022-10-09 20:32:45 +03:00
if ( url . is_valid ( ) )
2022-07-03 22:26:51 +03:00
window . view ( ) . load ( url ) ;
2022-07-03 21:36:07 +03:00
2022-09-07 21:33:15 +03:00
return app . exec ( ) ;
2022-07-03 21:36:07 +03:00
}