Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
/**
* Registers a one-time places observer for 'page-visited',
* which resolves a promise on being called.
*/
function promiseVisitAdded(callback) {
return new Promise(resolve => {
async function listener(events) {
PlacesObservers.removeListener(["page-visited"], listener);
Assert.equal(events.length, 1, "Right number of visits notified");
Assert.equal(events[0].type, "page-visited");
await callback(events[0]);
resolve();
}
PlacesObservers.addListener(["page-visited"], listener);
});
}
/**
* Asynchronous task that adds a visit to the history database.
*/
async function task_add_visit(uri, timestamp, transition) {
uri = uri || NetUtil.newURI("http://firefox.com/");
timestamp = timestamp || Date.now() * 1000;
await PlacesTestUtils.addVisits({
uri,
transition: transition || TRANSITION_TYPED,
visitDate: timestamp,
});
return [uri, timestamp];
}
add_task(async function test_visitAdded() {
let promiseNotify = promiseVisitAdded(async function (visit) {
Assert.ok(visit.visitId > 0);
Assert.equal(visit.url, testuri.spec);
Assert.equal(visit.visitTime, testtime / 1000);
Assert.equal(visit.referringVisitId, 0);
Assert.equal(visit.transitionType, TRANSITION_TYPED);
let uri = NetUtil.newURI(visit.url);
await check_guid_for_uri(uri, visit.pageGuid);
Assert.ok(!visit.hidden);
Assert.equal(visit.visitCount, 1);
Assert.equal(visit.typedCount, 1);
});
let testuri = NetUtil.newURI("http://firefox.com/");
let testtime = Date.now() * 1000;
await task_add_visit(testuri, testtime);
await promiseNotify;
});
add_task(async function test_visitAdded() {
let promiseNotify = promiseVisitAdded(async function (visit) {
Assert.ok(visit.visitId > 0);
Assert.equal(visit.url, testuri.spec);
Assert.equal(visit.visitTime, testtime / 1000);
Assert.equal(visit.referringVisitId, 0);
Assert.equal(visit.transitionType, TRANSITION_FRAMED_LINK);
let uri = NetUtil.newURI(visit.url);
await check_guid_for_uri(uri, visit.pageGuid);
Assert.ok(visit.hidden);
Assert.equal(visit.visitCount, 1);
Assert.equal(visit.typedCount, 0);
});
let testuri = NetUtil.newURI("http://hidden.firefox.com/");
let testtime = Date.now() * 1000;
await task_add_visit(testuri, testtime, TRANSITION_FRAMED_LINK);
await promiseNotify;
});
add_task(async function test_multiple_onVisit() {
let testuri = NetUtil.newURI("http://self.firefox.com/");
let promiseNotifications = new Promise(resolve => {
async function listener(aEvents) {
Assert.equal(aEvents.length, 3, "Right number of visits notified");
for (let i = 0; i < aEvents.length; i++) {
Assert.equal(aEvents[i].type, "page-visited");
let visit = aEvents[i];
Assert.equal(testuri.spec, visit.url);
Assert.ok(visit.visitId > 0);
Assert.ok(visit.visitTime > 0);
Assert.ok(!visit.hidden);
let uri = NetUtil.newURI(visit.url);
await check_guid_for_uri(uri, visit.pageGuid);
switch (i) {
case 0:
Assert.equal(visit.referringVisitId, 0);
Assert.equal(visit.transitionType, TRANSITION_LINK);
Assert.equal(visit.visitCount, 1);
Assert.equal(visit.typedCount, 0);
break;
case 1:
Assert.ok(visit.referringVisitId > 0);
Assert.equal(visit.transitionType, TRANSITION_LINK);
Assert.equal(visit.visitCount, 2);
Assert.equal(visit.typedCount, 0);
break;
case 2:
Assert.equal(visit.referringVisitId, 0);
Assert.equal(visit.transitionType, TRANSITION_TYPED);
Assert.equal(visit.visitCount, 3);
Assert.equal(visit.typedCount, 1);
PlacesObservers.removeListener(["page-visited"], listener);
resolve();
break;
}
}
}
PlacesObservers.addListener(["page-visited"], listener);
});
await PlacesTestUtils.addVisits([
{ uri: testuri, transition: TRANSITION_LINK },
{ uri: testuri, referrer: testuri, transition: TRANSITION_LINK },
{ uri: testuri, transition: TRANSITION_TYPED },
]);
await promiseNotifications;
});
add_task(async function test_pageRemovedFromStore() {
let [testuri] = await task_add_visit();
let testguid = await PlacesTestUtils.getDatabaseValue("moz_places", "guid", {
url: testuri,
});
const promiseNotify = PlacesTestUtils.waitForNotification("page-removed");
await PlacesUtils.history.remove(testuri);
const events = await promiseNotify;
Assert.equal(events.length, 1, "Right number of page-removed notified");
Assert.equal(events[0].type, "page-removed");
Assert.ok(events[0].isRemovedFromStore);
Assert.equal(events[0].url, testuri.spec);
Assert.equal(events[0].pageGuid, testguid);
Assert.equal(events[0].reason, PlacesVisitRemoved.REASON_DELETED);
});
add_task(async function test_pageRemovedAllVisits() {
const promiseNotify = PlacesTestUtils.waitForNotification("page-removed");
let msecs24hrsAgo = Date.now() - 86400 * 1000;
let [testuri] = await task_add_visit(undefined, msecs24hrsAgo * 1000);
// Add a bookmark so the page is not removed.
await PlacesUtils.bookmarks.insert({
parentGuid: PlacesUtils.bookmarks.unfiledGuid,
title: "test",
url: testuri,
});
let testguid = await PlacesTestUtils.getDatabaseValue("moz_places", "guid", {
url: testuri,
});
await PlacesUtils.history.remove(testuri);
const events = await promiseNotify;
Assert.equal(events.length, 1, "Right number of page-removed notified");
Assert.equal(events[0].type, "page-removed");
Assert.ok(!events[0].isRemovedFromStore);
Assert.equal(events[0].url, testuri.spec);
// Can't use do_check_guid_for_uri() here because the visit is already gone.
Assert.equal(events[0].pageGuid, testguid);
Assert.equal(events[0].reason, PlacesVisitRemoved.REASON_DELETED);
Assert.ok(!events[0].isPartialVisistsRemoval); // All visits have been removed.
});
add_task(async function test_pageTitleChanged() {
const [testuri] = await task_add_visit();
const title = "test-title";
const promiseNotify =
PlacesTestUtils.waitForNotification("page-title-changed");
await PlacesTestUtils.addVisits({
uri: testuri,
title,
});
const events = await promiseNotify;
Assert.equal(events.length, 1, "Right number of title changed notified");
Assert.equal(events[0].type, "page-title-changed");
Assert.equal(events[0].url, testuri.spec);
Assert.equal(events[0].title, title);
await check_guid_for_uri(testuri, events[0].pageGuid);
});