From cda31615dae34ced8bbf70a210395b63bfbfed36 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Tue, 25 Jun 2024 22:18:49 +0100 Subject: [PATCH] LibWeb: Add WrapAround option to find in page This allows `Page::find_in_page()` to optionally not return a result if the start or end of the document has been reached. --- Userland/Libraries/LibWeb/Page/Page.cpp | 14 ++++++++++---- Userland/Libraries/LibWeb/Page/Page.h | 5 +++++ 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Userland/Libraries/LibWeb/Page/Page.cpp b/Userland/Libraries/LibWeb/Page/Page.cpp index c3e5a0255a7..a4d52f97063 100644 --- a/Userland/Libraries/LibWeb/Page/Page.cpp +++ b/Userland/Libraries/LibWeb/Page/Page.cpp @@ -619,15 +619,21 @@ Page::FindInPageResult Page::perform_find_in_page_query(FindInPageQuery const& q if (direction.has_value()) { if (direction.value() == SearchDirection::Forward) { - if (m_find_in_page_match_index >= all_matches.size() - 1) + if (m_find_in_page_match_index >= all_matches.size() - 1) { + if (query.wrap_around == WrapAround::No) + return {}; m_find_in_page_match_index = 0; - else + } else { m_find_in_page_match_index++; + } } else { - if (m_find_in_page_match_index == 0) + if (m_find_in_page_match_index == 0) { + if (query.wrap_around == WrapAround::No) + return {}; m_find_in_page_match_index = all_matches.size() - 1; - else + } else { m_find_in_page_match_index--; + } } } diff --git a/Userland/Libraries/LibWeb/Page/Page.h b/Userland/Libraries/LibWeb/Page/Page.h index 2011013737f..c455e0013d3 100644 --- a/Userland/Libraries/LibWeb/Page/Page.h +++ b/Userland/Libraries/LibWeb/Page/Page.h @@ -190,9 +190,14 @@ public: void clear_selection(); + enum class WrapAround { + Yes, + No, + }; struct FindInPageQuery { String string {}; CaseSensitivity case_sensitivity { CaseSensitivity::CaseInsensitive }; + WrapAround wrap_around { WrapAround::Yes }; }; struct FindInPageResult { size_t current_match_index { 0 };