1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Tests that all the operations affecting frecency are triggering a recalc.
* This currently includes:
* - adding visits (will recalc immediately)
* - removing visits
* - adding a bookmark
* - removing a bookmark
* - changing url of a bookmark+
*
* Also check setting a frecency resets recalc_frecency to 0.
**/
const TEST_URL = "https://example.com/";
const TEST_URL_2 = "https://example2.com/";
// NOTE: Until we fix Bug 1806666 this test has to run queries manually because
// the official APIs recalculate frecency immediately. After the fix, these
// helpers can be removed and the test can be much simpler.
function insertVisit(url) {
return PlacesUtils.withConnectionWrapper("insertVisit", async db => {
await db.execute(
`INSERT INTO moz_historyvisits(place_id, visit_date)
VALUES ((SELECT id FROM moz_places WHERE url = :url), 1648226608386000)`,
{ url }
);
});
}
function removeVisit(url) {
return PlacesUtils.withConnectionWrapper("insertVisit", async db => {
await db.execute(
`DELETE FROM moz_historyvisits WHERE place_id
= (SELECT id FROM moz_places WHERE url = :url)`,
{ url }
);
});
}
function resetFrecency(url) {
return PlacesUtils.withConnectionWrapper("insertVisit", async db => {
await db.execute(`UPDATE moz_places SET frecency = -1 WHERE url = :url`, {
url,
});
});
}
function changeBookmarkToUrl(guid, url) {
return PlacesUtils.withConnectionWrapper("insertVisit", async db => {
await db.execute(
`UPDATE moz_bookmarks SET fk = (SELECT id FROM moz_places WHERE url = :url )
WHERE guid = :guid`,
{
url,
guid,
}
);
});
}
function removeBookmark(guid) {
return PlacesUtils.withConnectionWrapper("insertVisit", async db => {
await db.execute(`DELETE FROM moz_bookmarks WHERE guid = :guid`, {
guid,
});
});
}
add_task(async function test_visit() {
// First add a bookmark so the page is not orphaned.
let bm = await PlacesUtils.bookmarks.insert({
url: TEST_URL,
parentGuid: PlacesUtils.bookmarks.toolbarGuid,
});
info("Add a visit check frecency is calculated immediately");
await PlacesTestUtils.addVisits(TEST_URL);
let originalFrecency = await PlacesTestUtils.fieldInDB(TEST_URL, "frecency");
Assert.ok(originalFrecency > 0, "frecency was recalculated immediately");
let recalc = await PlacesTestUtils.fieldInDB(TEST_URL, "recalc_frecency");
Assert.equal(recalc, 0, "frecency doesn't need a recalc");
info("Add a visit (raw query) check frecency is not calculated immadiately");
await insertVisit(TEST_URL);
let frecency = await PlacesTestUtils.fieldInDB(TEST_URL, "frecency");
Assert.equal(frecency, originalFrecency, "frecency is unchanged");
recalc = await PlacesTestUtils.fieldInDB(TEST_URL, "recalc_frecency");
Assert.equal(recalc, 1, "frecency needs a recalc");
info("Check setting frecency resets recalc_frecency");
await resetFrecency(TEST_URL);
recalc = await PlacesTestUtils.fieldInDB(TEST_URL, "recalc_frecency");
Assert.equal(recalc, 0, "frecency doesn't need a recalc");
info("Removing a visit sets recalc_frecency");
await removeVisit(TEST_URL);
frecency = await PlacesTestUtils.fieldInDB(TEST_URL, "frecency");
Assert.equal(frecency, -1, "frecency is unchanged");
recalc = await PlacesTestUtils.fieldInDB(TEST_URL, "recalc_frecency");
Assert.equal(recalc, 1, "frecency needs a recalc");
await PlacesUtils.history.clear();
await PlacesUtils.bookmarks.remove(bm);
});
add_task(async function test_bookmark() {
// First add a visit so the page is not orphaned.
await PlacesTestUtils.addVisits(TEST_URL);
await PlacesTestUtils.addVisits(TEST_URL_2);
info("Check adding a bookmark sets frecency immediately");
let bm = await PlacesUtils.bookmarks.insert({
url: TEST_URL,
parentGuid: PlacesUtils.bookmarks.toolbarGuid,
});
let originalFrecency = await PlacesTestUtils.fieldInDB(TEST_URL, "frecency");
Assert.ok(originalFrecency > 0, "frecency was recalculated immediately");
let recalc = await PlacesTestUtils.fieldInDB(TEST_URL, "recalc_frecency");
Assert.equal(recalc, 0, "frecency doesn't need a recalc");
info("Check changing a bookmark url sets recalc_frecency on both urls");
await changeBookmarkToUrl(bm.guid, TEST_URL_2);
let frecency = await PlacesTestUtils.fieldInDB(TEST_URL, "frecency");
Assert.equal(frecency, originalFrecency, "frecency is unchanged");
recalc = await PlacesTestUtils.fieldInDB(TEST_URL, "recalc_frecency");
Assert.equal(recalc, 1, "frecency needs a recalc");
frecency = await PlacesTestUtils.fieldInDB(TEST_URL_2, "frecency");
Assert.ok(frecency > 0, "frecency is valid");
recalc = await PlacesTestUtils.fieldInDB(TEST_URL_2, "recalc_frecency");
Assert.equal(recalc, 1, "frecency needs a recalc");
info("Check setting frecency resets recalc_frecency");
await resetFrecency(TEST_URL);
recalc = await PlacesTestUtils.fieldInDB(TEST_URL, "recalc_frecency");
Assert.equal(recalc, 0, "frecency doesn't need a recalc");
await resetFrecency(TEST_URL_2);
recalc = await PlacesTestUtils.fieldInDB(TEST_URL_2, "recalc_frecency");
Assert.equal(recalc, 0, "frecency doesn't need a recalc");
info("Removing a bookmark sets recalc_frecency");
await removeBookmark(bm.guid);
frecency = await PlacesTestUtils.fieldInDB(TEST_URL, "frecency");
Assert.equal(frecency, -1, "frecency is unchanged");
recalc = await PlacesTestUtils.fieldInDB(TEST_URL, "recalc_frecency");
Assert.equal(recalc, 0, "frecency doesn't need a recalc");
frecency = await PlacesTestUtils.fieldInDB(TEST_URL_2, "frecency");
Assert.equal(frecency, -1, "frecency is unchanged");
recalc = await PlacesTestUtils.fieldInDB(TEST_URL_2, "recalc_frecency");
Assert.equal(recalc, 1, "frecency needs a recalc");
await PlacesUtils.history.clear();
});
|