fune/browser/components/extensions/ext-history.js
Bob Silverberg 751592d0c5 Bug 1265836 - Part 2: Change normalizeTime to return a date rather than a number. r=aswan
Also update browser.history.deleteRange to use normalizeTime

MozReview-Commit-ID: EQ3NLSIRTe8

--HG--
extra : transplant_source : %8B%0D%9ERe%2A%FA%1F%01%B4%A2%BBcCb%EB%8F%8A%A4%09
2016-05-24 09:00:17 -04:00

92 lines
3.1 KiB
JavaScript

/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
XPCOMUtils.defineLazyGetter(this, "History", () => {
Cu.import("resource://gre/modules/PlacesUtils.jsm");
return PlacesUtils.history;
});
Cu.import("resource://gre/modules/ExtensionUtils.jsm");
const {
normalizeTime,
} = ExtensionUtils;
/*
* Converts a nsINavHistoryResultNode into a plain object
*
* https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsINavHistoryResultNode
*/
function convertNavHistoryResultNode(node) {
return {
id: node.pageGuid,
url: node.uri,
title: node.title,
lastVisitTime: PlacesUtils.toDate(node.time).getTime(),
visitCount: node.accessCount,
};
}
/*
* Converts a nsINavHistoryContainerResultNode into an array of objects
*
* https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsINavHistoryContainerResultNode
*/
function convertNavHistoryContainerResultNode(container) {
let results = [];
container.containerOpen = true;
for (let i = 0; i < container.childCount; i++) {
let node = container.getChild(i);
results.push(convertNavHistoryResultNode(node));
}
container.containerOpen = false;
return results;
}
extensions.registerSchemaAPI("history", "history", (extension, context) => {
return {
history: {
deleteAll: function() {
return History.clear();
},
deleteRange: function(filter) {
let newFilter = {
beginDate: normalizeTime(filter.startTime),
endDate: normalizeTime(filter.endTime),
};
// History.removeVisitsByFilter returns a boolean, but our API should return nothing
return History.removeVisitsByFilter(newFilter).then(() => undefined);
},
deleteUrl: function(details) {
let url = details.url;
// History.remove returns a boolean, but our API should return nothing
return History.remove(url).then(() => undefined);
},
search: function(query) {
let beginTime = (query.startTime == null) ?
PlacesUtils.toPRTime(Date.now() - 24 * 60 * 60 * 1000) :
PlacesUtils.toPRTime(normalizeTime(query.startTime));
let endTime = (query.endTime == null) ?
Number.MAX_VALUE :
PlacesUtils.toPRTime(normalizeTime(query.endTime));
if (beginTime > endTime) {
return Promise.reject({message: "The startTime cannot be after the endTime"});
}
let options = History.getNewQueryOptions();
options.sortingMode = options.SORT_BY_DATE_DESCENDING;
options.maxResults = query.maxResults || 100;
let historyQuery = History.getNewQuery();
historyQuery.searchTerms = query.text;
historyQuery.beginTime = beginTime;
historyQuery.endTime = endTime;
let queryResult = History.executeQuery(historyQuery, options).root;
let results = convertNavHistoryContainerResultNode(queryResult);
return Promise.resolve(results);
},
},
};
});