From 63632159cebdbbb84d38461a09a8f1342be038b0 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Sun, 22 Sep 2024 23:12:36 +0100 Subject: [PATCH] UI: Add an option to enable autoplay globally --- .../AppKit/Application/ApplicationDelegate.mm | 4 ++++ Ladybird/AppKit/UI/LadybirdWebView.h | 2 ++ Ladybird/AppKit/UI/LadybirdWebView.mm | 5 +++++ Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp | 5 +++++ Ladybird/AppKit/UI/LadybirdWebViewBridge.h | 2 ++ Ladybird/AppKit/UI/TabController.h | 2 ++ Ladybird/AppKit/UI/TabController.mm | 15 +++++++++++++++ Ladybird/Qt/BrowserWindow.cpp | 7 +++++++ Ladybird/Qt/Settings.cpp | 11 +++++++++++ Ladybird/Qt/Settings.h | 4 ++++ Ladybird/Qt/SettingsDialog.cpp | 13 +++++++++++++ Ladybird/Qt/SettingsDialog.h | 1 + Ladybird/Qt/Tab.cpp | 5 +++++ Ladybird/Qt/Tab.h | 2 ++ Userland/Libraries/LibWebView/Application.cpp | 3 +++ Userland/Libraries/LibWebView/Options.h | 6 ++++++ .../Libraries/LibWebView/ViewImplementation.cpp | 9 +++++++++ .../Libraries/LibWebView/ViewImplementation.h | 2 ++ 18 files changed, 98 insertions(+) diff --git a/Ladybird/AppKit/Application/ApplicationDelegate.mm b/Ladybird/AppKit/Application/ApplicationDelegate.mm index 36f8b15e92e..e01cfa988bf 100644 --- a/Ladybird/AppKit/Application/ApplicationDelegate.mm +++ b/Ladybird/AppKit/Application/ApplicationDelegate.mm @@ -561,6 +561,10 @@ [submenu addItem:search_engine_menu_item]; + [submenu addItem:[[NSMenuItem alloc] initWithTitle:@"Enable Autoplay" + action:@selector(toggleAutoplay:) + keyEquivalent:@""]]; + [menu setSubmenu:submenu]; return menu; } diff --git a/Ladybird/AppKit/UI/LadybirdWebView.h b/Ladybird/AppKit/UI/LadybirdWebView.h index b1f8964ba01..51157b5813a 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.h +++ b/Ladybird/AppKit/UI/LadybirdWebView.h @@ -86,6 +86,8 @@ - (void)debugRequest:(ByteString const&)request argument:(ByteString const&)argument; +- (void)setEnableAutoplay:(BOOL)enabled; + - (void)viewSource; @end diff --git a/Ladybird/AppKit/UI/LadybirdWebView.mm b/Ladybird/AppKit/UI/LadybirdWebView.mm index 8887cf20eca..2bbf199b408 100644 --- a/Ladybird/AppKit/UI/LadybirdWebView.mm +++ b/Ladybird/AppKit/UI/LadybirdWebView.mm @@ -257,6 +257,11 @@ struct HideCursor { m_web_view_bridge->debug_request(request, argument); } +- (void)setEnableAutoplay:(BOOL)enabled +{ + m_web_view_bridge->set_enable_autoplay(enabled); +} + - (void)viewSource { m_web_view_bridge->get_source(); diff --git a/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp b/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp index ef13f4526ff..ac6097dc099 100644 --- a/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp +++ b/Ladybird/AppKit/UI/LadybirdWebViewBridge.cpp @@ -106,6 +106,11 @@ void WebViewBridge::enqueue_input_event(Web::KeyEvent event) ViewImplementation::enqueue_input_event(move(event)); } +void WebViewBridge::set_enable_autoplay(bool enabled) +{ + ViewImplementation::set_enable_autoplay(enabled); +} + Optional WebViewBridge::paintable() { Gfx::Bitmap* bitmap = nullptr; diff --git a/Ladybird/AppKit/UI/LadybirdWebViewBridge.h b/Ladybird/AppKit/UI/LadybirdWebViewBridge.h index 79848750f09..5cd2decbe22 100644 --- a/Ladybird/AppKit/UI/LadybirdWebViewBridge.h +++ b/Ladybird/AppKit/UI/LadybirdWebViewBridge.h @@ -48,6 +48,8 @@ public: void enqueue_input_event(Web::DragEvent); void enqueue_input_event(Web::KeyEvent); + void set_enable_autoplay(bool enabled); + struct Paintable { Gfx::Bitmap& bitmap; Gfx::IntSize bitmap_size; diff --git a/Ladybird/AppKit/UI/TabController.h b/Ladybird/AppKit/UI/TabController.h index 5ec71b95b55..1464ae60776 100644 --- a/Ladybird/AppKit/UI/TabController.h +++ b/Ladybird/AppKit/UI/TabController.h @@ -17,6 +17,7 @@ struct TabSettings { BOOL should_show_line_box_borders { NO }; BOOL scripting_enabled { YES }; BOOL block_popups { YES }; + BOOL autoplay_enabled { NO }; BOOL same_origin_policy_enabled { NO }; ByteString user_agent_name { "Disabled"sv }; ByteString navigator_compatibility_mode { "chrome"sv }; @@ -48,6 +49,7 @@ struct TabSettings { - (void)setPopupBlocking:(BOOL)block_popups; - (void)setScripting:(BOOL)enabled; +- (void)setAutoplay:(BOOL)enabled; - (void)debugRequest:(ByteString const&)request argument:(ByteString const&)argument; - (void)focusLocationToolbarItem; diff --git a/Ladybird/AppKit/UI/TabController.mm b/Ladybird/AppKit/UI/TabController.mm index 6996d491776..50c12e5b66e 100644 --- a/Ladybird/AppKit/UI/TabController.mm +++ b/Ladybird/AppKit/UI/TabController.mm @@ -101,6 +101,7 @@ static NSString* const TOOLBAR_TAB_OVERVIEW_IDENTIFIER = @"ToolbarTabOverviewIde m_settings = { .scripting_enabled = WebView::Application::chrome_options().disable_scripting == WebView::DisableScripting::Yes ? NO : YES, .block_popups = WebView::Application::chrome_options().allow_popups == WebView::AllowPopups::Yes ? NO : YES, + .autoplay_enabled = WebView::Application::web_content_options().enable_autoplay == WebView::EnableAutoplay::Yes ? YES : NO, }; if (auto const& user_agent_preset = WebView::Application::web_content_options().user_agent_preset; user_agent_preset.has_value()) @@ -163,6 +164,7 @@ static NSString* const TOOLBAR_TAB_OVERVIEW_IDENTIFIER = @"ToolbarTabOverviewIde { [self setPopupBlocking:m_settings.block_popups]; [self setScripting:m_settings.scripting_enabled]; + [self setAutoplay:m_settings.autoplay_enabled]; } - (void)zoomIn:(id)sender @@ -387,6 +389,17 @@ static NSString* const TOOLBAR_TAB_OVERVIEW_IDENTIFIER = @"ToolbarTabOverviewIde [self debugRequest:"block-pop-ups" argument:block_popups ? "on" : "off"]; } +- (void)toggleAutoplay:(id)sender +{ + m_settings.autoplay_enabled = !m_settings.autoplay_enabled; + [self setAutoplay:m_settings.autoplay_enabled]; +} + +- (void)setAutoplay:(BOOL)enabled +{ + [[[self tab] web_view] setEnableAutoplay:m_settings.autoplay_enabled]; +} + - (void)toggleSameOriginPolicy:(id)sender { m_settings.same_origin_policy_enabled = !m_settings.same_origin_policy_enabled; @@ -628,6 +641,8 @@ static NSString* const TOOLBAR_TAB_OVERVIEW_IDENTIFIER = @"ToolbarTabOverviewIde [item setState:(m_settings.user_agent_name == [[item title] UTF8String]) ? NSControlStateValueOn : NSControlStateValueOff]; } else if ([item action] == @selector(setNavigatorCompatibilityMode:)) { [item setState:(m_settings.navigator_compatibility_mode == [[[item title] lowercaseString] UTF8String]) ? NSControlStateValueOn : NSControlStateValueOff]; + } else if ([item action] == @selector(toggleAutoplay:)) { + [item setState:m_settings.autoplay_enabled ? NSControlStateValueOn : NSControlStateValueOff]; } return YES; diff --git a/Ladybird/Qt/BrowserWindow.cpp b/Ladybird/Qt/BrowserWindow.cpp index d86c8e704e9..05eda9a1adc 100644 --- a/Ladybird/Qt/BrowserWindow.cpp +++ b/Ladybird/Qt/BrowserWindow.cpp @@ -103,6 +103,12 @@ BrowserWindow::BrowserWindow(Vector const& initial_urls, IsPopupWindow }); }); + QObject::connect(Settings::the(), &Settings::enable_autoplay_changed, this, [this](bool enable) { + for_each_tab([enable](auto& tab) { + tab.set_enable_autoplay(enable); + }); + }); + QObject::connect(Settings::the(), &Settings::preferred_languages_changed, this, [this](QStringList languages) { Vector preferred_languages; preferred_languages.ensure_capacity(languages.length()); @@ -818,6 +824,7 @@ void BrowserWindow::initialize_tab(Tab* tab) tab->set_preferred_languages(preferred_languages); tab->set_navigator_compatibility_mode(navigator_compatibility_mode()); tab->set_enable_do_not_track(Settings::the()->enable_do_not_track()); + tab->set_enable_autoplay(WebView::Application::web_content_options().enable_autoplay == WebView::EnableAutoplay::Yes || Settings::the()->enable_autoplay()); tab->view().set_preferred_color_scheme(m_preferred_color_scheme); } diff --git a/Ladybird/Qt/Settings.cpp b/Ladybird/Qt/Settings.cpp index 48e89e540e1..ad331d73035 100644 --- a/Ladybird/Qt/Settings.cpp +++ b/Ladybird/Qt/Settings.cpp @@ -142,6 +142,17 @@ void Settings::set_enable_do_not_track(bool enable) emit enable_do_not_track_changed(enable); } +bool Settings::enable_autoplay() +{ + return m_qsettings->value("enable_autoplay", false).toBool(); +} + +void Settings::set_enable_autoplay(bool enable) +{ + m_qsettings->setValue("enable_autoplay", enable); + emit enable_autoplay_changed(enable); +} + bool Settings::show_menubar() { return m_qsettings->value("show_menubar", false).toBool(); diff --git a/Ladybird/Qt/Settings.h b/Ladybird/Qt/Settings.h index 2c7649ea2d0..6697eb00313 100644 --- a/Ladybird/Qt/Settings.h +++ b/Ladybird/Qt/Settings.h @@ -67,6 +67,9 @@ public: bool enable_do_not_track(); void set_enable_do_not_track(bool enable); + bool enable_autoplay(); + void set_enable_autoplay(bool enable); + bool show_menubar(); void set_show_menubar(bool show_menubar); @@ -76,6 +79,7 @@ signals: void search_engine_changed(WebView::SearchEngine engine); void preferred_languages_changed(QStringList const& languages); void enable_do_not_track_changed(bool enable); + void enable_autoplay_changed(bool enable); protected: Settings(); diff --git a/Ladybird/Qt/SettingsDialog.cpp b/Ladybird/Qt/SettingsDialog.cpp index 47d0694c9ff..9c155b735f5 100644 --- a/Ladybird/Qt/SettingsDialog.cpp +++ b/Ladybird/Qt/SettingsDialog.cpp @@ -9,6 +9,7 @@ #include "Settings.h" #include "StringUtils.h" #include +#include #include #include #include @@ -65,6 +66,17 @@ SettingsDialog::SettingsDialog(QMainWindow* window) Settings::the()->set_enable_do_not_track(state == Qt::Checked); }); + m_enable_autoplay = new QCheckBox(this); + if (WebView::Application::web_content_options().enable_autoplay == WebView::EnableAutoplay::Yes) { + m_enable_autoplay->setChecked(true); + } else { + m_enable_autoplay->setChecked(Settings::the()->enable_autoplay()); + } + + QObject::connect(m_enable_autoplay, &QCheckBox::stateChanged, this, [&](int state) { + Settings::the()->set_enable_autoplay(state == Qt::Checked); + }); + setup_search_engines(); m_layout->addRow(new QLabel("Page on New Tab", this), m_new_tab_page); @@ -74,6 +86,7 @@ SettingsDialog::SettingsDialog(QMainWindow* window) m_layout->addRow(new QLabel("Enable Autocomplete", this), m_enable_autocomplete); m_layout->addRow(new QLabel("Autocomplete Engine", this), m_autocomplete_engine_dropdown); m_layout->addRow(new QLabel("Send web sites a \"Do Not Track\" request", this), m_enable_do_not_track); + m_layout->addRow(new QLabel("Enable autoplay on all websites", this), m_enable_autoplay); setWindowTitle("Settings"); setLayout(m_layout); diff --git a/Ladybird/Qt/SettingsDialog.h b/Ladybird/Qt/SettingsDialog.h index d8f6b18aaaf..623b2b8d98b 100644 --- a/Ladybird/Qt/SettingsDialog.h +++ b/Ladybird/Qt/SettingsDialog.h @@ -34,6 +34,7 @@ private: QCheckBox* m_enable_autocomplete { nullptr }; QPushButton* m_autocomplete_engine_dropdown { nullptr }; QCheckBox* m_enable_do_not_track { nullptr }; + QCheckBox* m_enable_autoplay { nullptr }; }; } diff --git a/Ladybird/Qt/Tab.cpp b/Ladybird/Qt/Tab.cpp index 4555387c84b..185275775c7 100644 --- a/Ladybird/Qt/Tab.cpp +++ b/Ladybird/Qt/Tab.cpp @@ -965,4 +965,9 @@ void Tab::set_enable_do_not_track(bool enable) m_view->set_enable_do_not_track(enable); } +void Tab::set_enable_autoplay(bool enable) +{ + m_view->set_enable_autoplay(enable); +} + } diff --git a/Ladybird/Qt/Tab.h b/Ladybird/Qt/Tab.h index 573b081e06c..d5e1f9eeb15 100644 --- a/Ladybird/Qt/Tab.h +++ b/Ladybird/Qt/Tab.h @@ -78,6 +78,8 @@ public: void set_enable_do_not_track(bool); + void set_enable_autoplay(bool); + bool url_is_hidden() const { return m_location_edit->url_is_hidden(); } void set_url_is_hidden(bool url_is_hidden) { m_location_edit->set_url_is_hidden(url_is_hidden); } diff --git a/Userland/Libraries/LibWebView/Application.cpp b/Userland/Libraries/LibWebView/Application.cpp index 4cc013c5b14..78e7b7f187a 100644 --- a/Userland/Libraries/LibWebView/Application.cpp +++ b/Userland/Libraries/LibWebView/Application.cpp @@ -69,6 +69,7 @@ void Application::initialize(Main::Arguments const& arguments, URL::URL new_tab_ bool log_all_js_exceptions = false; bool enable_idl_tracing = false; bool enable_http_cache = false; + bool enable_autoplay = false; bool expose_internals_object = false; bool force_cpu_painting = false; bool force_fontconfig = false; @@ -88,6 +89,7 @@ void Application::initialize(Main::Arguments const& arguments, URL::URL new_tab_ args_parser.add_option(log_all_js_exceptions, "Log all JavaScript exceptions", "log-all-js-exceptions"); args_parser.add_option(enable_idl_tracing, "Enable IDL tracing", "enable-idl-tracing"); args_parser.add_option(enable_http_cache, "Enable HTTP cache", "enable-http-cache"); + args_parser.add_option(enable_autoplay, "Enable multimedia autoplay", "enable-autoplay"); args_parser.add_option(expose_internals_object, "Expose internals object", "expose-internals-object"); args_parser.add_option(force_cpu_painting, "Force CPU painting", "force-cpu-painting"); args_parser.add_option(force_fontconfig, "Force using fontconfig for font loading", "force-fontconfig"); @@ -145,6 +147,7 @@ void Application::initialize(Main::Arguments const& arguments, URL::URL new_tab_ .expose_internals_object = expose_internals_object ? ExposeInternalsObject::Yes : ExposeInternalsObject::No, .force_cpu_painting = force_cpu_painting ? ForceCPUPainting::Yes : ForceCPUPainting::No, .force_fontconfig = force_fontconfig ? ForceFontconfig::Yes : ForceFontconfig::No, + .enable_autoplay = enable_autoplay ? EnableAutoplay::Yes : EnableAutoplay::No, }; create_platform_options(m_chrome_options, m_web_content_options); diff --git a/Userland/Libraries/LibWebView/Options.h b/Userland/Libraries/LibWebView/Options.h index b5c9803f3b5..13209efaee8 100644 --- a/Userland/Libraries/LibWebView/Options.h +++ b/Userland/Libraries/LibWebView/Options.h @@ -40,6 +40,11 @@ enum class DisableSQLDatabase { Yes, }; +enum class EnableAutoplay { + No, + Yes, +}; + struct ChromeOptions { Vector urls; Vector raw_urls; @@ -108,6 +113,7 @@ struct WebContentOptions { ExposeInternalsObject expose_internals_object { ExposeInternalsObject::No }; ForceCPUPainting force_cpu_painting { ForceCPUPainting::No }; ForceFontconfig force_fontconfig { ForceFontconfig::No }; + EnableAutoplay enable_autoplay { EnableAutoplay::No }; }; } diff --git a/Userland/Libraries/LibWebView/ViewImplementation.cpp b/Userland/Libraries/LibWebView/ViewImplementation.cpp index 2ffc4e986a8..22d14130cfc 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.cpp +++ b/Userland/Libraries/LibWebView/ViewImplementation.cpp @@ -193,6 +193,15 @@ void ViewImplementation::set_enable_do_not_track(bool enable) client().async_set_enable_do_not_track(page_id(), enable); } +void ViewImplementation::set_enable_autoplay(bool enable) +{ + if (enable) { + client().async_set_autoplay_allowed_on_all_websites(page_id()); + } else { + client().async_set_autoplay_allowlist(page_id(), {}); + } +} + ByteString ViewImplementation::selected_text() { return client().get_selected_text(page_id()); diff --git a/Userland/Libraries/LibWebView/ViewImplementation.h b/Userland/Libraries/LibWebView/ViewImplementation.h index d2ddaea0a8f..7a7f997f125 100644 --- a/Userland/Libraries/LibWebView/ViewImplementation.h +++ b/Userland/Libraries/LibWebView/ViewImplementation.h @@ -73,6 +73,8 @@ public: void set_enable_do_not_track(bool); + void set_enable_autoplay(bool); + ByteString selected_text(); Optional selected_text_with_whitespace_collapsed(); void select_all();