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..a96f457350 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(history_metadata::delete_all_metadata_for_search) + } + /// 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");