我需要编写一个 Firefox 扩展程序来创建 URL 的黑名单和白名单,并检查以确保用户在用户尝试这样做时想要导航到它们。我正在使用附加到每个页面的主脚本和内容脚本(使用 PageMod)来执行此操作;我使用 jQuery 将一个侦听器附加到每个使用 window.onbeforeunload 执行函数的链接(带有标签“a”)。我有两个问题:
- 我将如何提示/询问用户是否真的想访问该站点?
- 如果用户决定不这样做,我将如何阻止浏览器导航到该站点?
现在我的代码在两个脚本之间传递消息以实现我的目标;据我所知,我只能在内容脚本中使用“文档”,并将黑名单/白名单保存在主脚本中。我正在使用 simple-storage 来保存我的列表,并使用端口模块在脚本之间传递消息。
对于问题 1,我尝试使用 confirm(message) 来获得用户的肯定/否定响应,但弹出窗口要么不显示,要么出现片刻,然后自动得到否定响应。当我查看控制台的错误消息时,我看到“用户中止提示”错误。
对于问题 2,我已经尝试通过将 click 事件传递给函数来使用 event.preventDefault() (我认为这很有效)。有一个更好的方法吗?我见过人们使用 window.location = "" 等等来做到这一点。
无论如何,代码如下:
主.JS
var ss = require("sdk/simple-storage");
exports.main = function() {
if (!ss.storage.blacklist) {
ss.storage.blacklist = [];}
if (!ss.storage.whitelist) {
ss.storage.whitelist = [];}
var data = require("sdk/self").data;
var pageMod = require("sdk/page-mod");
pageMod.PageMod({
include: "*",
contentScriptFile: [data.url("jquery-1.10.2.min.js"),data.url("secChk.js")],
onAttach: function(worker) {
function whiteCNTD(str) {
for (var index = 0; index < ss.storage.whitelist.length; index++) {
if (ss.storage.whitelist[index] == str) {
return index;
}
}
return -1;
}
function blackCNTD(str) {
for (var index = 0; index < ss.storage.blacklist.length; index++) {
if (ss.storage.blacklist[index] == str) {
return index;
}
}
return -1;
}
function checkLists(URL) {
if (whiteCNTD(URL) == -1) {
if (blackCNTD(URL) != -1) {
var bool = false;
worker.port.emit("navq", "Do you want to go to this link and add it to the whitelist?");
worker.port.on("yes", function() {
bool = true;
});
worker.port.on("no", function() {
bool = false;
});
if (bool == true) {
ss.storage.blacklist.splice(index, 1);
ss.storage.whitelist.push(URL);
return true;
}
else {
return false;
}
}
else {
var bool = false;
worker.port.emit("safeq", "Is this a safe site?");
worker.port.on("yes", function() {
bool = true;
});
worker.port.on("no", function() {
bool = false;
});
if (bool == true) {
ss.storage.whitelist.push(URL);
return true;
}
else {
ss.storage.blacklist.push(URL);
return false;
}
}
}
return true;
}
worker.port.on("newURL", function(URL) {
var s = "";
s = URL;
if (checkLists(s)) {
worker.port.emit("good", s);
} else if (!checkLists(s)) {
worker.port.emit("bad", s);
}
});
}
});
}
SECCHK.JS
//Check if the site is a bad site whenever a link is clicked
$("a").click(function(event) {
window.onbeforeunload = function() {
self.port.on("navq", function(message) {
var r = confirm("Do you want to go to this link and add it to the whitelist?");
if (r == true) {
self.port.emit("yes", message);
} else if (r == false) {
self.port.emit("no", message);
}
});
self.port.on("safeq", function(message) {
var r = confirm("Is this a safe site?");
if (r == true) {
self.port.emit("yes", temp);
} else if (r == false) {
self.port.emit("no", temp);
}
});
link = document.activeElement.href;
self.port.emit("newURL", link);
self.port.on("good", function(message) {
return true;
});
self.port.on("bad", function(message) {
return false;
});
}
});