Получить историю посещений веб-страниц
Здравствуйте.
Подскажите, пожалуйста, как получить список страниц, которые открывались в браузере на основе Gecko 1.8.1 за последние n-дней. Я нашел информацию о интерфейсе nsISHistory. И пробовал получить список вот так:
var history = Components.classes["@mozilla.org/browser/shistory;1"]
.getService(Components.interfaces.nsISHistory);
var enum = history.SHistoryEnumerator;
var item;
while (enum.hasMoreElements())
{
item = enum.getNext();
alert(item.URI.spec);
}
alert('count: ' + history.count + ' index: ' + history.index);
Но, энумератор пуст, а свойства count и index равны соответственно 0 и -1.
В всех же остальных интерфейсах, явно связанных с историей посещений (nsIBrowserHistory, nsIDOMHistory, nsIGlobalHistory, nsISHistoryInternal), нужных свойств и методов я не нашел.
Буду благодарен за помощь.
Спасибо, Владимир. Воспользовался Вашей подсказкой и нашел кусок кода. URL-ы посещенных страниц удалось получить таким образом:
var rdfSrv = Components.classes["@mozilla.org/rdf/rdf-service;1"]
.getService(Components.interfaces.nsIRDFService);
var history = rdfSrv.GetDataSourceBlocking("rdf:history");
var enum = history.GetAllResources();
while (enum.hasMoreElements())
{
var item = enum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
alert(item.Value);
}
Мне осталось не понятным как для каждого URL-а получить дату посещения. Ведь GetAllResources интерфейса nsIRDFDataSource возвращает список елементов, которые поддерживают только интерфейсы nsIRDFResource и nsIRDFNode. А у них свойства типа даты нет. В тоже время, на указаной Вами странице упоминаются свойства Date, FirstVisitDate, и т.д. Как, имея nsIRDFDataService, получить список елементов с этими свойствами?
var item = enum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
var link = rdfSrv.GetResource("http://home.netscape.com/NC-rdf#Date");
alert(history.GetTarget(item, link, true).QueryInterface(Components.interfaces.nsIRDFLiteral).value);
Что-то в таком роде (не проверял). Для адреса лучше смотреть аналогично по ссылке http://home.netscape.com/NC-rdf#URL — ваш код смотрит идентификатор узла, а он не обязан быть идентичен адресу. В общем, смотрите, как работают с RDF.
Спасибо, Владимир. Ваш код рабочий, за исключением последней строчки. Тут нужно было попросить не nsIRDFLiteral, а nsIRDFDate. В остальном, Вы практически решили за меня задачу. Теперь все прояснилось. Привожу пример кода, который вытаскивает историю с датами. (Может кому-то пригодится).
var rdfSrv = Components.classes["@mozilla.org/rdf/rdf-service;1"]
.getService(Components.interfaces.nsIRDFService);
var history = rdfSrv.GetDataSourceBlocking("rdf:history");
var enum = history.GetAllResources();
while (enum.hasMoreElements())
{
var item = enum.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
var date = rdfSrv.GetResource("http://home.netscape.com/NC-rdf#Date");
date = history.GetTarget(item, date, true);
date = date.QueryInterface(Components.interfaces.nsIRDFDate).Value;
var url = rdfSrv.GetResource("http://home.netscape.com/NC-rdf#URL");
url = history.GetTarget(item, url, true);
url = url.QueryInterface(Components.interfaces.nsIRDFLiteral).Value;
var dateObj = new Date();
dateObj.setTime(date / 1000);
alert('date: ' + dateObj.toGMTString() + ' url: ' + url);
}
Даты в RDF-формате хранятся в виде количества микросекунд с 1 января 1970. Отрицательные значения представляют время перед той датой; положительные значения представляют время с тех пор. Один день состоит из 86,400,000,000 микросекунд. Для преобразования в формат обьекта Date JavaScript нужно разделить величину на тысячу, так как обьект Date хранит время в миллисекундах.
![[logo]](/site/images/logo.jpg)