forked from mirrors/gecko-dev
206 lines
5.2 KiB
JavaScript
206 lines
5.2 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const { ChromeMigrationUtils } = ChromeUtils.import(
|
|
"resource:///modules/ChromeMigrationUtils.jsm"
|
|
);
|
|
|
|
const SOURCE_PROFILE_DIR = "Library/Application Support/Google/Chrome/Default/";
|
|
|
|
const PROFILE = {
|
|
id: "Default",
|
|
name: "Person 1",
|
|
};
|
|
|
|
/**
|
|
* TEST_URLS reflects the data stored in '${SOURCE_PROFILE_DIR}HistoryMaster'.
|
|
* The main object reflects the data in the 'urls' table. The visits property
|
|
* reflects the associated data in the 'visits' table.
|
|
*/
|
|
const TEST_URLS = [
|
|
{
|
|
id: 1,
|
|
url: "http://example.com/",
|
|
title: "test",
|
|
visit_count: 1,
|
|
typed_count: 0,
|
|
last_visit_time: 13193151310368000,
|
|
hidden: 0,
|
|
visits: [
|
|
{
|
|
id: 1,
|
|
url: 1,
|
|
visit_time: 13193151310368000,
|
|
from_visit: 0,
|
|
transition: 805306370,
|
|
segment_id: 0,
|
|
visit_duration: 10745006,
|
|
incremented_omnibox_typed_score: 0,
|
|
},
|
|
],
|
|
},
|
|
{
|
|
id: 2,
|
|
url: "http://invalid.com/",
|
|
title: "test2",
|
|
visit_count: 1,
|
|
typed_count: 0,
|
|
last_visit_time: 13193154948901000,
|
|
hidden: 0,
|
|
visits: [
|
|
{
|
|
id: 2,
|
|
url: 2,
|
|
visit_time: 13193154948901000,
|
|
from_visit: 0,
|
|
transition: 805306376,
|
|
segment_id: 0,
|
|
visit_duration: 6568270,
|
|
incremented_omnibox_typed_score: 0,
|
|
},
|
|
],
|
|
},
|
|
];
|
|
|
|
async function setVisitTimes(time) {
|
|
let loginDataFile = do_get_file(`${SOURCE_PROFILE_DIR}History`);
|
|
let dbConn = await Sqlite.openConnection({ path: loginDataFile.path });
|
|
|
|
await dbConn.execute(`UPDATE urls SET last_visit_time = :last_visit_time`, {
|
|
last_visit_time: time,
|
|
});
|
|
await dbConn.execute(`UPDATE visits SET visit_time = :visit_time`, {
|
|
visit_time: time,
|
|
});
|
|
|
|
await dbConn.close();
|
|
}
|
|
|
|
function setExpectedVisitTimes(time) {
|
|
for (let urlInfo of TEST_URLS) {
|
|
urlInfo.last_visit_time = time;
|
|
urlInfo.visits[0].visit_time = time;
|
|
}
|
|
}
|
|
|
|
function assertEntryMatches(entry, urlInfo, dateWasInFuture = false) {
|
|
info(`Checking url: ${urlInfo.url}`);
|
|
Assert.ok(entry, `Should have stored an entry`);
|
|
|
|
Assert.equal(entry.url, urlInfo.url, "Should have the correct URL");
|
|
Assert.equal(entry.title, urlInfo.title, "Should have the correct title");
|
|
Assert.equal(
|
|
entry.visits.length,
|
|
urlInfo.visits.length,
|
|
"Should have the correct number of visits"
|
|
);
|
|
|
|
for (let index in urlInfo.visits) {
|
|
Assert.equal(
|
|
entry.visits[index].transition,
|
|
PlacesUtils.history.TRANSITIONS.LINK,
|
|
"Should have Link type transition"
|
|
);
|
|
|
|
if (dateWasInFuture) {
|
|
Assert.lessOrEqual(
|
|
entry.visits[index].date.getTime(),
|
|
new Date().getTime(),
|
|
"Should have moved the date to no later than the current date."
|
|
);
|
|
} else {
|
|
Assert.equal(
|
|
entry.visits[index].date.getTime(),
|
|
ChromeMigrationUtils.chromeTimeToDate(
|
|
urlInfo.visits[index].visit_time,
|
|
new Date()
|
|
).getTime(),
|
|
"Should have the correct date"
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
function setupHistoryFile() {
|
|
removeHistoryFile();
|
|
let file = do_get_file(`${SOURCE_PROFILE_DIR}HistoryMaster`);
|
|
file.copyTo(file.parent, "History");
|
|
}
|
|
|
|
function removeHistoryFile() {
|
|
let file = do_get_file(`${SOURCE_PROFILE_DIR}History`, true);
|
|
try {
|
|
file.remove(false);
|
|
} catch (ex) {
|
|
// It is ok if this doesn't exist.
|
|
if (ex.result != Cr.NS_ERROR_FILE_NOT_FOUND) {
|
|
throw ex;
|
|
}
|
|
}
|
|
}
|
|
|
|
add_task(async function setup() {
|
|
registerFakePath("ULibDir", do_get_file("Library/"));
|
|
|
|
registerCleanupFunction(async () => {
|
|
await PlacesUtils.history.clear();
|
|
removeHistoryFile();
|
|
});
|
|
});
|
|
|
|
add_task(async function test_import() {
|
|
setupHistoryFile();
|
|
await PlacesUtils.history.clear();
|
|
// Update to ~10 days ago since the date can't be too old or Places may expire it.
|
|
const pastDate = new Date(new Date().getTime() - 1000 * 60 * 60 * 24 * 10);
|
|
const pastChromeTime = ChromeMigrationUtils.dateToChromeTime(pastDate);
|
|
await setVisitTimes(pastChromeTime);
|
|
setExpectedVisitTimes(pastChromeTime);
|
|
|
|
let migrator = await MigrationUtils.getMigrator("chrome");
|
|
Assert.ok(
|
|
await migrator.isSourceAvailable(),
|
|
"Sanity check the source exists"
|
|
);
|
|
|
|
await promiseMigration(
|
|
migrator,
|
|
MigrationUtils.resourceTypes.HISTORY,
|
|
PROFILE
|
|
);
|
|
|
|
for (let urlInfo of TEST_URLS) {
|
|
let entry = await PlacesUtils.history.fetch(urlInfo.url, {
|
|
includeVisits: true,
|
|
});
|
|
assertEntryMatches(entry, urlInfo);
|
|
}
|
|
});
|
|
|
|
add_task(async function test_import_future_date() {
|
|
setupHistoryFile();
|
|
await PlacesUtils.history.clear();
|
|
const futureDate = new Date().getTime() + 6000 * 60 * 24;
|
|
await setVisitTimes(ChromeMigrationUtils.dateToChromeTime(futureDate));
|
|
|
|
let migrator = await MigrationUtils.getMigrator("chrome");
|
|
Assert.ok(
|
|
await migrator.isSourceAvailable(),
|
|
"Sanity check the source exists"
|
|
);
|
|
|
|
await promiseMigration(
|
|
migrator,
|
|
MigrationUtils.resourceTypes.HISTORY,
|
|
PROFILE
|
|
);
|
|
|
|
for (let urlInfo of TEST_URLS) {
|
|
let entry = await PlacesUtils.history.fetch(urlInfo.url, {
|
|
includeVisits: true,
|
|
});
|
|
assertEntryMatches(entry, urlInfo, true);
|
|
}
|
|
});
|