我正在尝试向我的Firefox扩展添加一个功能,以便在单击站点A上的按钮时触发从站点B删除cookie的事件。站点A和B不共享域,但站点B在注入站点A的iframe中运行。我需要在Firefox内容脚本中单击事件来触发内容脚本或Firefox扩展主体中的事件以删除所有来自网站B的cookie。
我将点击侦听器分配给按钮并触发。我已经在Google Chrome中使用扩展程序实现了同样的效果。我收到有关使用组件的错误,但我找不到使用而不是组件的解决方案。它只需要在Firefox 22+上运行。我正在使用addon-sdk-1.14来开发扩展。
ContentScript.js
function DeleteCookies() {
var payload="Delete";
self.port.emit("Delete", payload);
}
Main.js
var {Cc, Ci} = require("chrome");
pageMod.PageMod({
include: "*",
contentScriptFile: [ self.data.url("jquery-1.9.1.js")
,self.data.url("script.js")],
onAttach: function(worker) {
worker.port.on('Delete',function (){ DeleteCookies();});
}
});
function DeleteCookies() {
var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager);
var domain= "siteB.com";
var iter = cookieManager.enumerator;
var cookie_count = 0;
while (iter.hasMoreElements()) {
var cookie = iter.getNext();
if (cookie instanceof Ci.nsICookie) {
if (domain.indexOf(cookie.host.toUpperCase()) != -1) {
cookieManager.remove(cookie.host, cookie.name, cookie.path, cookie.blocked);
cookie_count++;
}
}
}
};
答案 0 :(得分:1)
您无法从内容脚本访问XPCOM。使用port mechanism进行内容脚本和main.js之间的通信,并从后者中删除cookie。
答案 1 :(得分:1)
似乎正确执行任务的代码已编辑到问题中,而不是作为答案发布。不幸的是,似乎存在一个错误,它会遍历所有cookie,而不仅仅是您希望删除的域中的那些cookie。对于问题Deleting cookies with JavaScript in Firefox extension,我修改了这个问题中的代码以提高效率,并修复了错误。鉴于我已经在编写代码,我在这里发布它,以便其他人不需要通过确定代码被编辑到问题中并找到代码的问题。
如果没有为cookieManager.remove()
定义cookie.blocked
属性,则会将blocked
传递给nsICookie。应该传递的内容是false
,假设没有意图阻止来自该主机的cookie。实际上,undefined
目前正在通过。
只使用nsICookieManager2界面来迭代来自相关主机的cookie,而不是所有cookie。特别是getCookiesFromHost()
方法。
更新的代码是:
ContentScript.js
function DeleteCookies() {
var payload="Delete";
self.port.emit("Delete", payload);
}
Main.js
var {Cc, Ci} = require("chrome");
pageMod.PageMod({
include: "*",
contentScriptFile: [ self.data.url("jquery-1.9.1.js")
,self.data.url("script.js")],
onAttach: function(worker) {
worker.port.on('Delete',function (){ DeleteCookies();});
}
});
var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
function DeleteCookies() {
DeleteAllCookiesForDomain("siteB.com");
};
function DeleteAllCookiesForDomain( domain ) {
var iter = cookieManager.getCookiesFromHost(domain);
var cookie_count = 0;
while (iter.hasMoreElements()) {
var cookie = iter.getNext();
if (cookie instanceof Ci.nsICookie) {
cookieManager.remove(cookie.host, cookie.name, cookie.path, false);
cookie_count++;
}
}
return cookie_count;
};