/* * Copyright (c) 2026, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace WebView { struct WEBVIEW_API BookmarkItem { struct Bookmark { URL::URL url; Optional title; Optional favicon_base64_png; }; struct Folder { Optional title; Vector children; }; String id; UnixDateTime date_added; UnixDateTime last_modified; Variant data; bool is_bookmark() const { return data.has(); } bool is_folder() const { return data.has(); } Bookmark const& bookmark() const { return data.get(); } Bookmark& bookmark() { return data.get(); } Folder const& folder() const { return data.get(); } Folder& folder() { return data.get(); } }; class WEBVIEW_API BookmarkStoreObserver { public: explicit BookmarkStoreObserver(); virtual ~BookmarkStoreObserver(); virtual void bookmarks_changed() { } }; class WEBVIEW_API BookmarkStore { public: static BookmarkStore create(Badge); Vector const& root_items() const { return m_items; } bool is_bookmarked(URL::URL const&) const; Optional find_bookmark_by_url(URL::URL const&) const; Optional find_item_by_id(StringView id) const; void import_items(JsonArray const& items_array); void add_bookmark(URL::URL url, Optional title, Optional favicon_base64, Optional target_folder_id = {}); void add_folder(Optional title, Optional target_folder_id = {}); void edit_bookmark(StringView id, URL::URL url, Optional title); void edit_folder(StringView id, Optional title); void move_item(StringView id, Optional target_folder_id, size_t index); void remove_item(StringView id); void update_favicon(URL::URL const& url, String favicon_base64); JsonValue serialize_items() const; static void add_observer(Badge, BookmarkStoreObserver&); static void remove_observer(Badge, BookmarkStoreObserver&); private: explicit BookmarkStore(ByteString bookmarks_path); Optional find_mutable_item_by_id(StringView id); Optional&> find_containing_item_list(StringView id); void persist_bookmarks(); void notify_observers(); ByteString m_bookmarks_path; Vector m_items; Vector m_observers; }; }