in components/places/src/storage/history.rs [2764:2911]
fn test_delete_everything() {
use crate::storage::bookmarks::{
self, BookmarkPosition, BookmarkRootGuid, InsertableBookmark,
};
use url::Url;
let _ = env_logger::try_init();
let mut conn = PlacesDb::open_in_memory(ConnectionType::ReadWrite).unwrap();
let start = Timestamp::now();
let urls = &[
Url::parse("http://example.com/1").unwrap(),
Url::parse("http://example.com/2").unwrap(),
Url::parse("http://example.com/3").unwrap(),
];
let dates = &[
Timestamp(start.0 - 10000),
Timestamp(start.0 - 5000),
Timestamp(start.0),
];
for url in urls {
for &date in dates {
get_custom_observed_page(&mut conn, url.as_str(), |o| o.with_at(date)).unwrap();
}
}
bookmarks::insert_bookmark(
&conn,
InsertableBookmark {
parent_guid: BookmarkRootGuid::Unfiled.into(),
position: BookmarkPosition::Append,
date_added: None,
last_modified: None,
guid: Some("bookmarkAAAA".into()),
url: urls[2].clone(),
title: Some("A".into()),
}
.into(),
)
.expect("Should insert bookmark with URL 3");
conn.execute(
"WITH entries(url, input) AS (
VALUES(:url1, 'hi'), (:url3, 'bye')
)
INSERT INTO moz_inputhistory(place_id, input, use_count)
SELECT h.id, e.input, 1
FROM entries e
JOIN moz_places h ON h.url_hash = hash(e.url) AND
h.url = e.url",
&[(":url1", &urls[1].as_str()), (":url3", &urls[2].as_str())],
)
.expect("Should insert autocomplete history entries");
delete_everything(&conn).expect("Should delete everything except URL 3");
std::thread::sleep(std::time::Duration::from_millis(50));
// Should leave bookmarked URLs alone, and keep autocomplete history for
// those URLs.
let mut places_stmt = conn.prepare("SELECT url FROM moz_places").unwrap();
let remaining_urls: Vec<String> = places_stmt
.query_and_then([], |row| -> rusqlite::Result<_> { row.get::<_, String>(0) })
.expect("Should fetch remaining URLs")
.map(std::result::Result::unwrap)
.collect();
assert_eq!(remaining_urls, &["http://example.com/3"]);
let mut input_stmt = conn.prepare("SELECT input FROM moz_inputhistory").unwrap();
let remaining_inputs: Vec<String> = input_stmt
.query_and_then([], |row| -> rusqlite::Result<_> { row.get::<_, String>(0) })
.expect("Should fetch remaining autocomplete history entries")
.map(std::result::Result::unwrap)
.collect();
assert_eq!(remaining_inputs, &["bye"]);
bookmarks::delete_bookmark(&conn, &"bookmarkAAAA".into())
.expect("Should delete bookmark with URL 3");
delete_everything(&conn).expect("Should delete all URLs");
assert_eq!(
0,
conn.query_one::<i64>("SELECT COUNT(*) FROM moz_historyvisits")
.unwrap(),
);
apply_synced_visits(
&conn,
&SyncGuid::random(),
&url::Url::parse("http://www.example.com/123").unwrap(),
&None,
&[
HistoryRecordVisit {
// This should make it in
date: Timestamp::now().into(),
transition: VisitType::Link as u8,
unknown_fields: UnknownFields::new(),
},
HistoryRecordVisit {
// This should not.
date: start.into(),
transition: VisitType::Link as u8,
unknown_fields: UnknownFields::new(),
},
],
&UnknownFields::new(),
)
.unwrap();
assert_eq!(
1,
conn.query_one::<i64>("SELECT COUNT(*) FROM moz_places")
.unwrap(),
);
// Only one visit should be applied.
assert_eq!(
1,
conn.query_one::<i64>("SELECT COUNT(*) FROM moz_historyvisits")
.unwrap(),
);
// Check that we don't insert a place if all visits are too old.
apply_synced_visits(
&conn,
&SyncGuid::random(),
&url::Url::parse("http://www.example.com/1234").unwrap(),
&None,
&[HistoryRecordVisit {
date: start.into(),
transition: VisitType::Link as u8,
unknown_fields: UnknownFields::new(),
}],
&UnknownFields::new(),
)
.unwrap();
// unchanged.
assert_eq!(
1,
conn.query_one::<i64>("SELECT COUNT(*) FROM moz_places")
.unwrap(),
);
assert_eq!(
1,
conn.query_one::<i64>("SELECT COUNT(*) FROM moz_historyvisits")
.unwrap(),
);
}