From b177e0dd66fc3509992d416a40f98e22ac7ddc0e Mon Sep 17 00:00:00 2001 From: Sam Atkins Date: Wed, 31 Jan 2024 16:33:55 +0000 Subject: [PATCH] ClipboardHistory: Be more careful about the history limit Previously, if the number of history items was already above the history limit, then it would never trim old history items. This could happen if the ClipboardHistory.json file was manually edited. Prevent this by sorting and trimming the data that is read in. For good measure, also guard against `> m_history_limit` in add_item(). --- .../ClipboardHistory/ClipboardHistoryModel.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Userland/Applets/ClipboardHistory/ClipboardHistoryModel.cpp b/Userland/Applets/ClipboardHistory/ClipboardHistoryModel.cpp index 3e44359deb..4172ce86f1 100644 --- a/Userland/Applets/ClipboardHistory/ClipboardHistoryModel.cpp +++ b/Userland/Applets/ClipboardHistory/ClipboardHistoryModel.cpp @@ -9,6 +9,7 @@ #include "ClipboardHistoryModel.h" #include #include +#include #include #include #include @@ -119,14 +120,14 @@ ErrorOr ClipboardHistoryModel::invalidate_model_and_file() return {}; } -void ClipboardHistoryModel::add_item(const GUI::Clipboard::DataAndType& item) +void ClipboardHistoryModel::add_item(GUI::Clipboard::DataAndType const& item) { m_history_items.remove_first_matching([&](ClipboardItem& existing) { return existing.data_and_type.data == item.data && existing.data_and_type.mime_type == item.mime_type; }); - if (m_history_items.size() == m_history_limit) { - m_history_items.take_last(); + if (m_history_items.size() >= m_history_limit) { + m_history_items.resize(m_history_limit - 1); } m_history_items.prepend({ item, Core::DateTime::now() }); @@ -198,6 +199,13 @@ ErrorOr ClipboardHistoryModel::read_from_file(ByteString const& path) return Error::from_string_literal("JSON entry is not an object."); TRY(m_history_items.try_append(TRY(ClipboardItem::from_json(item.as_object())))); } + // Ensure the data is how we expect: Limited to m_history_limit and sorted newest-to-oldest. + quick_sort(m_history_items, [](ClipboardItem const& a, ClipboardItem const& b) -> bool { + return a.time > b.time; + }); + if (m_history_items.size() > m_history_limit) + m_history_items.resize(m_history_limit); + return {}; };