From 7f046cfebb172bcfa9ed5aa44e8345fe45495a96 Mon Sep 17 00:00:00 2001 From: cyndichin Date: Mon, 24 Nov 2025 13:43:07 -0500 Subject: [PATCH 1/2] Add convenience metadata_delete_search_terms method to delete search terms in history metadata --- CHANGELOG.md | 4 + components/places/src/ffi.rs | 5 + components/places/src/places.udl | 3 + .../places/src/storage/history_metadata.rs | 96 +++++++++++++++++++ 4 files changed, 108 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d1d1c5707..9d9722b552 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,10 @@ ### Logins - fix `count_by_origin` and `count_by_form_action_origin` with punicode origins +### Places +- `places::storage::history_metadata::delete_all_metadata_for_search()` was added to delete the search terms in history metadata. ([#7101](https://github.com/mozilla/application-services/pull/7101)) + + # v146.0 (_2025-11-10_) ## ✨ What's New ✨ diff --git a/components/places/src/ffi.rs b/components/places/src/ffi.rs index 610bba5c29..2d6f93a8a5 100644 --- a/components/places/src/ffi.rs +++ b/components/places/src/ffi.rs @@ -263,6 +263,11 @@ impl PlacesConnection { }) } + #[handle_error(crate::Error)] + pub fn metadata_delete_search_terms(&self) -> ApiResult<()> { + self.with_conn(|conn| history_metadata::delete_all_metadata_for_search(conn)) + } + /// Add an observation to the database. #[handle_error(crate::Error)] pub fn apply_observation(&self, visit: VisitObservation) -> ApiResult<()> { diff --git a/components/places/src/places.udl b/components/places/src/places.udl index 13e190d4e6..3a9e86db92 100644 --- a/components/places/src/places.udl +++ b/components/places/src/places.udl @@ -88,6 +88,9 @@ interface PlacesConnection { [Throws=PlacesApiError] void metadata_delete_older_than(PlacesTimestamp older_than); + [Throws=PlacesApiError] + void metadata_delete_search_terms(); + [Throws=PlacesApiError] void apply_observation(VisitObservation visit); diff --git a/components/places/src/storage/history_metadata.rs b/components/places/src/storage/history_metadata.rs index 70e4a0981c..095f2da71c 100644 --- a/components/places/src/storage/history_metadata.rs +++ b/components/places/src/storage/history_metadata.rs @@ -562,6 +562,12 @@ pub fn delete_all_metadata_for_page(db: &PlacesDb, place_id: RowId) -> Result<() Ok(()) } +/// Delete all metadata for search queries table. +pub fn delete_all_metadata_for_search(db: &PlacesDb) -> Result<()> { + db.execute_cached("DELETE FROM moz_places_metadata_search_queries", [])?; + Ok(()) +} + pub fn delete_metadata( db: &PlacesDb, url: &Url, @@ -2392,6 +2398,96 @@ mod tests { assert_table_size!(&conn, "moz_places_metadata_search_queries", 0); } + #[test] + fn test_delete_all_metadata_for_search() { + let conn = PlacesDb::open_in_memory(ConnectionType::ReadWrite).expect("memory db"); + + note_observation!(&conn, + url "https://www.mozilla.org/1/", + view_time None, + search_term Some("search_term_1"), + document_type None, + referrer_url None, + title None + ); + + note_observation!(&conn, + url "https://www.mozilla.org/2/", + view_time None, + search_term Some("search_term_2"), + document_type None, + referrer_url None, + title None + ); + + assert_table_size!(&conn, "moz_places_metadata", 2); + assert_table_size!(&conn, "moz_places_metadata_search_queries", 2); + + delete_all_metadata_for_search(&conn).expect("query ok"); + + assert_table_size!(&conn, "moz_places_metadata", 0); + assert_table_size!(&conn, "moz_places_metadata_search_queries", 0); + } + + #[test] + fn test_delete_all_metadata_for_search_only_deletes_search_metadata() { + let conn = PlacesDb::open_in_memory(ConnectionType::ReadWrite).expect("memory db"); + + // url | search_term | referrer + // 1 | 1 | 0 + // 1 | 0 | 1 + // 1 | 1 | 0 + // 1 | 0 | 1 + + note_observation!(&conn, + url "https://www.mozilla.org/1/", + view_time None, + search_term Some("search_term_1"), + document_type None, + referrer_url None, + title None + ); + + note_observation!( + &conn, + url "https://www.mozilla.org/2/", + view_time Some(20000), + search_term None, + document_type Some(DocumentType::Media), + referrer_url Some("https://www.google.com/search?client=firefox-b-d&q=mozilla+firefox"), + title None + ); + + note_observation!(&conn, + url "https://www.mozilla.org/3/", + view_time None, + search_term Some("search_term_2"), + document_type None, + referrer_url None, + title None + ); + + note_observation!( + &conn, + url "https://www.mozilla.org/4/", + view_time Some(20000), + search_term None, + document_type Some(DocumentType::Regular), + referrer_url Some("https://www.google.com/search?client=firefox-b-d&q=mozilla+firefox"), + title None + ); + + assert_eq!(4, get_since(&conn, 0).expect("get worked").len()); + + assert_table_size!(&conn, "moz_places_metadata", 4); + assert_table_size!(&conn, "moz_places_metadata_search_queries", 2); + + delete_all_metadata_for_search(&conn).expect("query ok"); + + assert_table_size!(&conn, "moz_places_metadata", 2); + assert_table_size!(&conn, "moz_places_metadata_search_queries", 0); + } + #[test] fn test_if_page_missing_behavior() { let conn = PlacesDb::open_in_memory(ConnectionType::ReadWrite).expect("memory db"); From 91e0016f7d57bbd16ddee1b90594b331b0015307 Mon Sep 17 00:00:00 2001 From: cyndichin Date: Mon, 24 Nov 2025 14:08:57 -0500 Subject: [PATCH 2/2] fix: address lint err from clippy --- components/places/src/ffi.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/places/src/ffi.rs b/components/places/src/ffi.rs index 2d6f93a8a5..a96f457350 100644 --- a/components/places/src/ffi.rs +++ b/components/places/src/ffi.rs @@ -265,7 +265,7 @@ impl PlacesConnection { #[handle_error(crate::Error)] pub fn metadata_delete_search_terms(&self) -> ApiResult<()> { - self.with_conn(|conn| history_metadata::delete_all_metadata_for_search(conn)) + self.with_conn(history_metadata::delete_all_metadata_for_search) } /// Add an observation to the database.