2022-07-03 18:44:58 +00:00
/*
* Copyright ( c ) 2022 , Andreas Kling < kling @ serenityos . org >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
2022-07-03 19:26:51 +00:00
# include "BrowserWindow.h"
2023-04-24 12:51:19 +00:00
# include "EventLoopImplementationQt.h"
2022-07-14 03:41:13 +00:00
# include "Settings.h"
2023-01-27 09:41:24 +00:00
# include "WebContentView.h"
2023-01-20 23:30:05 +00:00
# include <AK/OwnPtr.h>
2023-08-05 16:42:26 +00:00
# include <Ladybird/HelperProcess.h>
# include <Ladybird/Utilities.h>
2022-07-03 18:36:07 +00:00
# include <LibCore/ArgsParser.h>
2022-10-05 13:23:41 +00:00
# include <LibCore/EventLoop.h>
2023-08-02 08:27:58 +00:00
# include <LibCore/Process.h>
2022-10-24 09:18:22 +00:00
# include <LibCore/System.h>
2023-03-21 15:35:30 +00:00
# include <LibFileSystem/FileSystem.h>
2022-10-05 13:23:41 +00:00
# include <LibGfx/Font/FontDatabase.h>
2022-07-03 18:36:07 +00:00
# include <LibMain/Main.h>
2023-08-31 11:07:07 +00:00
# include <LibWebView/CookieJar.h>
# include <LibWebView/Database.h>
2022-07-03 18:36:07 +00:00
# include <QApplication>
2023-08-02 17:52:59 +00:00
namespace Ladybird {
bool is_using_dark_system_theme ( QWidget & widget )
{
// FIXME: Qt does not provide any method to query if the system is using a dark theme. We will have to implement
// platform-specific methods if we wish to have better detection. For now, this inspects if Qt is using a
// dark color for widget backgrounds using Rec. 709 luma coefficients.
// https://en.wikipedia.org/wiki/Rec._709#Luma_coefficients
auto color = widget . palette ( ) . color ( widget . backgroundRole ( ) ) ;
auto luma = 0.2126f * color . redF ( ) + 0.7152f * color . greenF ( ) + 0.0722f * color . blueF ( ) ;
return luma < = 0.5f ;
}
}
2022-07-03 18:36:07 +00:00
2022-10-24 09:18:22 +00: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-08-02 08:27:58 +00:00
if ( TRY ( Core : : Process : : is_being_debugged ( ) ) ) {
dbgln ( " Debugger is attached, ignoring SIGINT " ) ;
TRY ( Core : : System : : signal ( SIGINT , SIG_IGN ) ) ;
2022-10-24 09:18:22 +00:00
}
# endif
return { } ;
}
2022-07-03 18:36:07 +00:00
ErrorOr < int > serenity_main ( Main : : Arguments arguments )
{
2023-04-24 12:51:19 +00:00
QApplication app ( arguments . argc , arguments . argv ) ;
2023-04-25 15:38:48 +00:00
Core : : EventLoopManager : : install ( * new Ladybird : : EventLoopManagerQt ) ;
2022-10-05 13:23:41 +00:00
Core : : EventLoop event_loop ;
2023-04-25 14:53:07 +00:00
static_cast < Ladybird : : EventLoopImplementationQt & > ( event_loop . impl ( ) ) . set_main_loop ( ) ;
2022-10-05 13:23:41 +00:00
2022-10-24 09:18:22 +00:00
TRY ( handle_attached_debugger ( ) ) ;
2022-10-07 23:08:29 +00: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 17:32:45 +00:00
StringView raw_url ;
2022-12-15 14:18:52 +00:00
StringView webdriver_content_ipc_path ;
2023-04-15 00:04:28 +00:00
bool enable_callgrind_profiling = false ;
2023-05-13 04:55:34 +00:00
bool enable_sql_database = false ;
2023-08-01 20:39:19 +00:00
bool use_lagom_networking = false ;
2022-11-14 16:08:44 +00:00
2022-07-03 18:36:07 +00:00
Core : : ArgsParser args_parser ;
args_parser . set_general_help ( " The Ladybird web browser :^) " ) ;
2022-10-09 17:32:45 +00:00
args_parser . add_positional_argument ( raw_url , " URL to open " , " url " , Core : : ArgsParser : : Required : : No ) ;
2023-09-03 13:14:56 +00:00
args_parser . add_option ( webdriver_content_ipc_path , " Path to WebDriver IPC for WebContent " , " webdriver-content-path " , 0 , " path " , Core : : ArgsParser : : OptionHideMode : : CommandLineAndMarkdown ) ;
2023-04-15 00:04:28 +00:00
args_parser . add_option ( enable_callgrind_profiling , " Enable Callgrind profiling " , " enable-callgrind-profiling " , ' P ' ) ;
2023-05-13 04:55:34 +00:00
args_parser . add_option ( enable_sql_database , " Enable SQL database " , " enable-sql-database " , 0 ) ;
2023-08-01 20:39:19 +00:00
args_parser . add_option ( use_lagom_networking , " Enable Lagom servers for networking " , " enable-lagom-networking " , 0 ) ;
2022-07-03 18:36:07 +00: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 18:06:27 +00:00
URL url = raw_url ;
2023-03-21 15:35:30 +00: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 18:06:27 +00:00
else if ( ! url . is_valid ( ) )
2023-05-23 08:19:27 +00:00
url = DeprecatedString : : formatted ( " https://{} " , raw_url ) ;
2023-02-01 18:06:27 +00:00
return url ;
} ;
2023-01-27 09:41:24 +00:00
2023-08-31 11:07:07 +00:00
RefPtr < WebView : : Database > database ;
2023-01-29 04:20:20 +00:00
2023-05-13 04:55:34 +00:00
if ( enable_sql_database ) {
2023-04-20 18:26:06 +00:00
auto sql_server_paths = TRY ( get_paths_for_helper_process ( " SQLServer " sv ) ) ;
2023-08-31 11:21:54 +00:00
database = TRY ( WebView : : Database : : create ( move ( sql_server_paths ) ) ) ;
2023-04-20 18:26:06 +00:00
}
2023-08-31 11:07:07 +00:00
auto cookie_jar = database ? TRY ( WebView : : CookieJar : : create ( * database ) ) : WebView : : CookieJar : : create ( ) ;
2022-12-05 18:09:42 +00:00
2023-08-08 19:59:55 +00:00
Optional < URL > initial_url ;
if ( auto url = TRY ( get_formatted_url ( raw_url ) ) ; url . is_valid ( ) )
initial_url = move ( url ) ;
Ladybird : : BrowserWindow window ( initial_url , cookie_jar , webdriver_content_ipc_path , enable_callgrind_profiling ? WebView : : EnableCallgrindProfiling : : Yes : WebView : : EnableCallgrindProfiling : : No , use_lagom_networking ? Ladybird : : UseLagomNetworking : : Yes : Ladybird : : UseLagomNetworking : : No ) ;
2022-07-03 18:36:07 +00:00
window . setWindowTitle ( " Ladybird " ) ;
2023-08-09 10:23:32 +00:00
2023-05-29 09:05:30 +00:00
if ( Ladybird : : Settings : : the ( ) - > is_maximized ( ) ) {
2023-08-09 10:23:32 +00:00
window . showMaximized ( ) ;
} else {
2023-05-29 09:05:30 +00:00
auto last_position = Ladybird : : Settings : : the ( ) - > last_position ( ) ;
2023-08-09 10:23:32 +00:00
if ( last_position . has_value ( ) )
window . move ( last_position . value ( ) ) ;
2023-05-29 09:05:30 +00:00
window . resize ( Ladybird : : Settings : : the ( ) - > last_size ( ) ) ;
2023-08-09 10:23:32 +00:00
}
2022-07-03 18:36:07 +00:00
window . show ( ) ;
2023-04-24 12:51:19 +00:00
return event_loop . exec ( ) ;
2022-07-03 18:36:07 +00:00
}