/* * Copyright (c) 2026-present, the Ladybird developers. * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace WebView { struct WEBVIEW_API HistoryEntry { String url; Optional title; u64 visit_count { 0 }; UnixDateTime last_visited_time; }; class WEBVIEW_API HistoryStore { AK_MAKE_NONCOPYABLE(HistoryStore); AK_MAKE_NONMOVABLE(HistoryStore); public: static ErrorOr> create(Database::Database&); static NonnullOwnPtr create(); static NonnullOwnPtr create_disabled(); ~HistoryStore(); void record_visit(URL::URL const&, Optional title = {}, UnixDateTime visited_at = UnixDateTime::now()); void update_title(URL::URL const&, String const& title); Optional entry_for_url(URL::URL const&); Vector autocomplete_suggestions(StringView query, size_t limit = 8); void clear(); void remove_entries_accessed_since(UnixDateTime since); private: struct Statements { Database::StatementID upsert_entry { 0 }; Database::StatementID update_title { 0 }; Database::StatementID get_entry { 0 }; Database::StatementID search_entries { 0 }; Database::StatementID clear_entries { 0 }; Database::StatementID delete_entries_accessed_since { 0 }; }; class TransientStorage { public: void record_visit(String url, Optional title, UnixDateTime visited_at); void update_title(String const& url, String title); Optional entry_for_url(String const& url); Vector autocomplete_suggestions(StringView query, size_t limit); void clear(); void remove_entries_accessed_since(UnixDateTime since); private: HashMap m_entries; }; struct PersistedStorage { void record_visit(String const& url, Optional const& title, UnixDateTime visited_at); void update_title(String const& url, String const& title); Optional entry_for_url(String const& url); Vector autocomplete_suggestions(StringView query, size_t limit); void clear(); void remove_entries_accessed_since(UnixDateTime since); Database::Database& database; Statements statements; }; explicit HistoryStore(Optional, bool is_disabled = false); static Optional normalize_url(URL::URL const&); Optional m_persisted_storage; TransientStorage m_transient_storage; bool m_is_disabled { false }; }; }