5.3.2 浏览历史记录插件
在这一节中,我们会实现一个更复杂的Chrome插件。该插件可以记录Chrome浏览器的浏览历史,包括浏览网页的标题、浏览日期和URL。单击URL,可以在Chrome浏览器中显示该页面。
根据插件功能描述,可以为ChatGPT提供如下文本。
编写一个Chrome插件,在插件弹出的页面中显示曾经浏览过的网站的title,以及访问网站的时间(精确到秒),按时间顺序从高到低显示网站的title和时间,并且要隐藏记录网站的URL,单击title可以进入该网站。给出完整的代码和中文注释。
本节中要实现的插件比上一节中实现的字典插件多了一个窗口,也就是单击插件图标,会显示一个窗口,在窗口中会显示Chrome浏览器的浏览历史。所以使用上面的文字会多生成两个文件,分别是页面的.html文件和.js文件。
manifest.json文件的代码如下。
代码位置:src/web/extensions/webhistory/manifest.json
{
"manifest_version": 3,
"name": "浏览历史记录",
"version": "1.0",
"description": "显示浏览历史记录的标题和时间",
"permissions": [
"history"
],
"action": {
"default_popup": "popup.html",
"default_icon": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
}
},
"icons": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
},
"background": {
"service_worker": "background.js"
}
}
在manifest.json中通过default_popup属性引用了一个popup.html文件,该文件生成的页面就是单击插件按钮后显示的页面,在该页面中会显示浏览历史。
background.js文件的代码如下。
代码位置:src/web/extensions/webhistory/background.js
// 在插件安装后,清除所有历史记录
chrome.runtime.onInstalled.addListener(function() {
chrome.history.deleteAll(function() {
console.log('所有历史记录已清除');
});
});
在这段代码中,当安装插件时,调用chrome.history.deleteAll()方法以清除浏览器的所有历史记录。这样做的目的是保护用户隐私或重置插件功能。
清除浏览器历史记录可以防止用户在安装插件后查看插件安装前的浏览历史记录。这是为了保护用户隐私,确保插件不会访问、获取或利用用户的浏览历史信息。
此外,清除浏览器历史记录还可以为插件提供一个干净的起点。有些插件可能需要与浏览器历史记录交互,清除历史记录可以确保插件在初始状态下没有任何干扰或误操作。
popup.html文件的代码如下。
代码位置:src/web/extensions/webhistory/popup.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>浏览历史记录</title>
<style>
body {
width: 300px;
min-height: 200px;
padding: 10px;
}
ul {
list-style-type: none;
padding: 0;
}
li {
margin-bottom: 10px;
cursor: pointer;
}
</style>
<script src="popup.js"></script>
</head>
<body>
<h2>浏览历史记录</h2>
<ul id="history-list"></ul>
</body>
</html>
popup.js文件的代码如下。
代码位置:src/web/extensions/webhistory/popup.js
// 获取历史记录
chrome.history.search({text: '', maxResults: 10}, function(historyItems) {
var historyList = document.getElementById('history-list');
// 按时间顺序从高到低显示历史记录
historyItems.sort(function(a, b) {
return b.lastVisitTime - a.lastVisitTime;
});
// 显示历史记录的标题和访问时间
historyItems.forEach(function(historyItem) {
var listItem = document.createElement('li');
var title = document.createElement('span');
var time = document.createElement('span');
// 设置标题和时间
title.textContent = historyItem.title;
time.textContent = new Date(historyItem.lastVisitTime).toLocaleString();
// 单击标题,打开对应的网站
title.addEventListener('click', function() {
chrome.tabs.create({url: historyItem.url});
});
// 添加标题和时间到列表项中
listItem.appendChild(title);
listItem.appendChild(time);
// 添加列表项到列表中
historyList.appendChild(listItem);
});
});
浏览历史记录插件的安装方式与字典插件的安装方式大致相同。只是在安装完后,需要单击Chrome浏览器右上角扩展程序管理页面按钮(图5-13最右侧按钮),在显示的页面中,单击“浏览历史记录”插件右侧像钉子一样的按钮,钉子按钮变成实心后,浏览历史记录插件的图标就会显示在Chrome浏览器右侧的工具栏上。
现在多浏览一些网站,然后单击图5-14右上方的浏览历史记录插件的图标,就会显示“浏览历史记录”页面。单击某一个历史记录,会在Chrome中装载当前历史的URL。
图5-13 将浏览历史记录插件的图标显示在Chrome浏览器右侧的工具栏
图5-14 “浏览历史记录”页面
5.3.3 计算器插件
在这一节中,我们会将前面实现的Web版计算器移植到Chrome插件中,这个移植相当简单。首先,将calc.html、calc.css和calc.js文件放到插件目录下。然后,按下面的代码编写manifest.json文件即可。
manifest.json文件代码如下。
代码位置:src/web/extensions/calc/manifest.json
{
"manifest_version": 2,
"name": "Calc",
"description": "计算器",
"version": "1.0",
"permissions": [
"activeTab"
],
"browser_action": {
"default_popup": "calc.html",
"default_icon": {
"16": "icon16.png",
"48": "icon48.png",
"128": "icon128.png"
}
}
}
按上面的代码实现的计算器插件的安装和运行都没问题,但单击“=”按键没有任何反应,究其原因是Chrome插件默认禁止通过eval()函数动态执行代码,可以在manifest.json中添加如下注释。
// 在Chrome插件中支持eval()函数动态执行代码
GitHub Copilot会生成如下配置。
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
注意,JSON是不支持任何形式注释的,但可以临时使用“//”形式表示注释,生成代码以后,将注释删除即可。
现在按前面的方式安装计算器插件,并在Chrome浏览器中显示计算器插件图标,单击计算器插件图标,会显示图5-15所示的效果。
也可以通过按键或直接在文本框中输入表达式,如图5-16所示,然后单击“=”按钮计算表达式。
图5-15 计算器插件的效果
图5-16 在计算器插件中输入表达式
5.4 小结
在本章中,我们又完成了一次自动化Web编程之旅。Web是一类重要的应用,尤其是HTML、CSS这些内容让初学者,甚至是资深Web前端开发人员,都感觉比较头疼。当用它们开发非常复杂的Web UI时,不仅工作量很大,而且需要一遍一遍地调试程序。不过有了ChatGPT和GitHub Copilot,就像有了两个可以7×24h陪伴的智能助手,尽管它们不能完全帮我们编写所有的代码,但至少可以助我们一臂之力。