mirror of
https://github.com/LadybirdBrowser/ladybird
synced 2026-05-11 09:27:00 +02:00
Remember the zoom level for each host so that returning to a site restores the zoom the user previously chose, matching what other browsers have done for years. When the user zooms in, zooms out, or resets the zoom, the resulting level is written to Settings keyed by the current page's host. On navigation, when a view's URL host changes, the stored level for the new host is applied (or the global default if there is no override). Per-host zoom changes are broadcast through the SettingsObserver so that two tabs viewing the same host stay in sync as soon as the user adjusts zoom in either one. Zoom changes from within the page (such as internals.setBrowserZoom hook) and the WebContent restart path do not persist, only user-initiated zoom changes do.
157 lines
5.1 KiB
C++
157 lines
5.1 KiB
C++
/*
|
|
* Copyright (c) 2025-2026, Tim Flynn <trflynn89@ladybird.org>
|
|
*
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <AK/Badge.h>
|
|
#include <AK/HashMap.h>
|
|
#include <AK/HashTable.h>
|
|
#include <AK/JsonValue.h>
|
|
#include <AK/Optional.h>
|
|
#include <LibHTTP/Cache/DiskCacheSettings.h>
|
|
#include <LibIPC/Forward.h>
|
|
#include <LibURL/URL.h>
|
|
#include <LibWebView/Autocomplete.h>
|
|
#include <LibWebView/Forward.h>
|
|
#include <LibWebView/Options.h>
|
|
#include <LibWebView/SearchEngine.h>
|
|
|
|
namespace WebView {
|
|
|
|
struct BrowsingBehavior {
|
|
bool enable_autoscroll { true };
|
|
};
|
|
|
|
struct SiteSetting {
|
|
SiteSetting();
|
|
|
|
bool enabled_globally { false };
|
|
OrderedHashTable<String> site_filters;
|
|
};
|
|
|
|
struct BrowsingDataSettings {
|
|
HTTP::DiskCacheSettings disk_cache_settings;
|
|
};
|
|
|
|
enum class GlobalPrivacyControl {
|
|
No,
|
|
Yes,
|
|
};
|
|
|
|
class WEBVIEW_API SettingsObserver {
|
|
public:
|
|
explicit SettingsObserver();
|
|
virtual ~SettingsObserver();
|
|
|
|
virtual void new_tab_page_url_changed() { }
|
|
virtual void show_bookmarks_bar_changed() { }
|
|
virtual void default_zoom_level_factor_changed() { }
|
|
virtual void zoom_per_host_changed(StringView host) { (void)host; }
|
|
virtual void languages_changed() { }
|
|
virtual void browsing_behavior_changed() { }
|
|
virtual void search_engine_changed() { }
|
|
virtual void autocomplete_engine_changed() { }
|
|
virtual void autoplay_settings_changed() { }
|
|
virtual void browsing_data_settings_changed() { }
|
|
virtual void global_privacy_control_changed() { }
|
|
virtual void dns_settings_changed() { }
|
|
};
|
|
|
|
class WEBVIEW_API Settings {
|
|
public:
|
|
static Settings create(Badge<Application>);
|
|
|
|
JsonValue serialize_json() const;
|
|
|
|
URL::URL const& new_tab_page_url() const { return m_new_tab_page_url; }
|
|
void set_new_tab_page_url(URL::URL);
|
|
|
|
bool show_bookmarks_bar() const { return m_show_bookmarks_bar; }
|
|
void set_show_bookmarks_bar(bool);
|
|
|
|
double default_zoom_level_factor() const { return m_default_zoom_level_factor; }
|
|
void set_default_zoom_level_factor(double);
|
|
|
|
Optional<double> zoom_for_host(StringView host) const;
|
|
void set_zoom_for_host(StringView host, double zoom_level);
|
|
|
|
static Vector<String> parse_json_languages(JsonValue const&);
|
|
Vector<String> const& languages() const { return m_languages; }
|
|
void set_languages(Vector<String>);
|
|
|
|
static BrowsingBehavior parse_browsing_behavior(JsonValue const&);
|
|
BrowsingBehavior const& browsing_behavior() const { return m_browsing_behavior; }
|
|
void set_browsing_behavior(BrowsingBehavior);
|
|
|
|
Optional<SearchEngine> const& search_engine() const { return m_search_engine; }
|
|
void set_search_engine(Optional<StringView> search_engine_name);
|
|
|
|
static Optional<SearchEngine> parse_custom_search_engine(JsonValue const&);
|
|
void add_custom_search_engine(SearchEngine);
|
|
void remove_custom_search_engine(SearchEngine const&);
|
|
|
|
Optional<AutocompleteEngine> const& autocomplete_engine() const { return m_autocomplete_engine; }
|
|
void set_autocomplete_engine(Optional<StringView> autocomplete_engine_name);
|
|
|
|
SiteSetting const& autoplay_settings() const { return m_autoplay; }
|
|
void set_autoplay_enabled_globally(bool);
|
|
void add_autoplay_site_filter(String const&);
|
|
void remove_autoplay_site_filter(String const&);
|
|
void remove_all_autoplay_site_filters();
|
|
|
|
static BrowsingDataSettings parse_browsing_data_settings(JsonValue const&);
|
|
BrowsingDataSettings const& browsing_data_settings() const { return m_browsing_data_settings; }
|
|
void set_browsing_data_settings(BrowsingDataSettings);
|
|
|
|
GlobalPrivacyControl global_privacy_control() const { return m_global_privacy_control; }
|
|
void set_global_privacy_control(GlobalPrivacyControl);
|
|
|
|
static DNSSettings parse_dns_settings(JsonValue const&);
|
|
DNSSettings const& dns_settings() const { return m_dns_settings; }
|
|
void set_dns_settings(DNSSettings const&, bool override_by_command_line = false);
|
|
|
|
static void add_observer(Badge<SettingsObserver>, SettingsObserver&);
|
|
static void remove_observer(Badge<SettingsObserver>, SettingsObserver&);
|
|
|
|
private:
|
|
explicit Settings(ByteString settings_path);
|
|
|
|
void persist_settings();
|
|
|
|
Optional<SearchEngine> find_search_engine_by_name(StringView name);
|
|
|
|
ByteString m_settings_path;
|
|
|
|
URL::URL m_new_tab_page_url;
|
|
bool m_show_bookmarks_bar { true };
|
|
double m_default_zoom_level_factor { 0 };
|
|
HashMap<String, double> m_zoom_per_host;
|
|
Vector<String> m_languages;
|
|
BrowsingBehavior m_browsing_behavior;
|
|
Optional<SearchEngine> m_search_engine;
|
|
Vector<SearchEngine> m_custom_search_engines;
|
|
Optional<AutocompleteEngine> m_autocomplete_engine;
|
|
SiteSetting m_autoplay;
|
|
BrowsingDataSettings m_browsing_data_settings;
|
|
GlobalPrivacyControl m_global_privacy_control { GlobalPrivacyControl::No };
|
|
DNSSettings m_dns_settings { SystemDNS() };
|
|
bool m_dns_override_by_command_line { false };
|
|
|
|
Vector<SettingsObserver&> m_observers;
|
|
};
|
|
|
|
}
|
|
|
|
namespace IPC {
|
|
|
|
template<>
|
|
WEBVIEW_API ErrorOr<void> encode(Encoder&, WebView::BrowsingBehavior const&);
|
|
|
|
template<>
|
|
WEBVIEW_API ErrorOr<WebView::BrowsingBehavior> decode(Decoder&);
|
|
|
|
}
|