/* * Copyright (c) 2023, Cameron Youell * Copyright (c) 2025, Tim Flynn * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include namespace WebView { struct AutocompleteEngine { StringView name; StringView query_url; }; enum class AutocompleteResultKind { Intermediate, Final, }; static constexpr auto default_autocomplete_suggestion_limit = 8uz; enum class AutocompleteSuggestionSource { LiteralURL, History, Search, }; enum class AutocompleteSuggestionSection { None, History, SearchSuggestions, }; struct WEBVIEW_API AutocompleteSuggestion { AutocompleteSuggestionSource source { AutocompleteSuggestionSource::Search }; AutocompleteSuggestionSection section { AutocompleteSuggestionSection::None }; String text; Optional title; Optional subtitle; Optional favicon_base64_png; }; WEBVIEW_API ReadonlySpan autocomplete_engines(); WEBVIEW_API Optional find_autocomplete_engine_by_name(StringView name); WEBVIEW_API StringView autocomplete_section_title(AutocompleteSuggestionSection); WEBVIEW_API bool autocomplete_urls_match(StringView left, StringView right); WEBVIEW_API bool autocomplete_url_can_complete(StringView query, StringView suggestion); class WEBVIEW_API Autocomplete { public: Autocomplete(); ~Autocomplete(); Function, AutocompleteResultKind)> on_autocomplete_query_complete; void query_autocomplete_engine(String, size_t max_suggestions = default_autocomplete_suggestion_limit); void cancel_pending_query(); private: static ErrorOr> received_autocomplete_respsonse(AutocompleteEngine const&, Optional content_type, StringView response); void invoke_autocomplete_query_complete(Vector suggestions, AutocompleteResultKind) const; String m_query; size_t m_max_suggestions { default_autocomplete_suggestion_limit }; Vector m_history_suggestions; RefPtr m_request; }; }