4.3 历史

历史用于记录用户访问过页面的信息。与书签一样,历史也是浏览器很早就具有的功能,对用户来说也是一个很重要的功能。Chrome提供了history接口,允许扩展对用户的历史进行管理。

要使用history接口,需要在Manifest中声明history权限:

"permissions": [
    "history"
]

管理历史的方法包括searchgetVisitsaddUrldeleteUrldeleteRangedeleteAll。其中searchgetVisits用于读取历史,addUrl用于添加历史,deleteUrldeleteRangedeleteAll用于删除历史。

读取历史。Chrome提供了searchgetVisits两种方法读取历史。通过search方法可以读取匹配指定文字,指定时间区间,指定条目的历史结果。

chrome.history.search({
    text: 'Google',
    startTime: new Date().getTime()-24*3600*1000,
    endTime: new Date().getTime(),
    maxResults: 20
}, function(historyItemArray){
    console.log(historyItemArray);
});

上述代码会返回最近24小时内匹配“Google”的20条历史结果。startTimeendTime都是距1970年1月1日的毫秒数。返回结果是包含多个historyItem对象的数组,historyItem对象包含6个属性,分别是idurltitlelastVisitTimevisitCounttypedCount,其中typedCount是用户通过在地址栏键入访问此历史的次数。若不指定text属性,则返回全部历史结果。

getVisits方法可以获取指定URL的访问结果。必须指定完整的URL,返回的结果会绝对匹配指定的URL,也就是说,如果指定'http://www.google.com/',返回的结果不会包含'http://www.google.com/a/'的内容。不要忘记http://,这也是不可省略的。

chrome.history.getVisits(
    url: 'http://www.google.com/'
}, function(visitItemArray){
    console.log(visitItemArray);
});

返回的结果是包含多个visitItem对象的数组,visitItem对象包含5个属性,分别是idvisitIdvisitTimereferringVisitIdtransition。其中id为与指定URL匹配的对象的id,对于匹配同一URL的对象拥有相同的idvisitId是这个访问结果的idvisitId是唯一的。visitTime同样是毫秒数。transition是此访问记录打开的方式,具体解释如下。

Chrome对每一个访问记录都详细地归类了打开方式,用transition属性记录。打开方式一共分为11种,这看起来确实会让人有一些头疼。比较常见的有四种,分别为linktypedreloadform_submitlink是用户通过超级链接打开的方式,typed是用户通过在地址栏中输入网址打开的方式,reload是用户通过刷新(包括恢复关闭的标签)打开的方式,form_submit是通过提交表单打开的方式(通过脚本提交表单的情况不算此方式)。

与浏览器UI和设置相关的有两种,分别为auto_bookmarkauto_toplevelauto_bookmark是通过浏览器UI中的建议打开的方式——比如通过菜单等。auto_toplevel为浏览器设置中默认打开的方式,比如浏览器的主页,或者是通过命令行启动时附带的参数。

嵌入式框架相关的有两个,auto_subframemanual_subframe,其中auto_subframe为自动加载的嵌入式框架打开的方式,很多广告都是这样的打开方式——很多用户并不知道其实那些广告是在一个独立的页面中。manual_subframe则是用户手动加载的嵌入式框架打开的方式,比如用户操作商品菜单查看不同款式商品页面,就是手动加载嵌入式框架。

最后还有三种是和omnibox搜索建议相关的,分别为generatedkeywordkeyword_generatedgenerated为通过omnibox给出搜索建议打开的方式,所打开的页面通常为搜索引擎的结果界面。keywordkeyword_generated都是通过用户在地址栏中输入的关键字生成的URL访问的方式,但其URL并不是默认搜索引擎生成的(否则就是generated了)。

添加历史。addUrl方法可以将特定的url以当前时间为访问时间,添加至历史中。

chrome.history.addUrl({
    url: 'http://twitter.com'
}, function(){
    console.log('Twitter has been added to history.');
});

删除历史。deleteUrl可以删除指定URL的历史,deleteRange可以删除指定时间段的历史,deleteAll可以删除全部历史。

chrome.history.deleteUrl({
    url: 'http://www.google.com'
}, function(){
    console.log('Google has been deleted from history.');
});

chrome.history.deleteRange({
    startTime: new Date().getTime()-24*3600*1000,
    endTime: new Date().getTime()
}, function(){
    console.log('History in past 24 hours has been deleted.');
});

chrome.history.deleteAll(function(){
    console.log('All history has been deleted.');
});

Chrome提供两个事件,onVisitedonVisitRemoved,分别监听用户访问历史和历史被删除的事件。

chrome.history.onVisited.addListener(function(historyItem){
    console.log(historyItem);
});

chrome.history.onVisitRemoved.addListener(function(removedObject){
    console.log(removedObject);
});

对于onVisitRemoved事件,返回的removedObject结果包含两个属性,allHistoryurls。其中urls属性包含所有被删除历史的URL。allHistory为布尔型,如果所有历史均被删除,allHistory的值为ture,同时urls的值会为一个空数组。

历史和cookies一样都是用户的敏感数据,进行操作时应让用户有知情权,尤其是要将用户历史数据与第三方共享时(包括开发者自己的服务器),一定要先得到用户的同意,并且要让用户得知哪些数据会被使用。