0

我正在尝试向我的 Firefox 扩展添加一个函数,以在单击站点 A 上的按钮时触发从站点 B 删除 cookie 的事件。站点 A 和 B 不共享域,但站点 B 在注入站点 A 的 iframe 中运行。我需要 Firefox 内容脚本中的 click 事件来触发内容脚本或 Firefox 扩展主程序中的事件以删除所有来自站点 B 的 cookie。

我将单击侦听器分配给按钮并触发。我已经通过扩展在 Google Chrome 中实现了同样的效果。我收到有关使用组件的错误,但找不到替代组件的解决方案。它只需要在 Firefox 22+ 上运行。我正在使用 addon-sdk-1.14 来开发扩展。

内容脚本.js

function DeleteCookies() {
    var payload="Delete";
    self.port.emit("Delete", payload);
}

主.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++;
            }
        }
    }
};
4

2 回答 2

1

您不能从内容脚本访问 XPCOM。使用端口机制在内容脚本和 main.js 之间进行通信,并从后者中删除 cookie。

于 2013-07-29T19:52:43.347 回答
1

似乎将正确执行任务的代码编辑到问题中,而不是作为答案发布。不幸的是,似乎存在一个错误,它会遍历所有 cookie,而不仅仅是您希望删除的域中的那些。对于Deleting cookies with JavaScript in Firefox extension问题,我修改了这个问题中的代码以提高效率,并修复了错误。鉴于我已经处理过代码,我将其发布在这里,这样其他人就不需要通过弄清楚代码被编辑到问题中并找到代码的问题。

该错误是在没有为nsICookie定义属性时cookie.blocked传递给的。假设没有阻止来自该主机的 cookie 的意图,应该在那里传递什么。照原样,目前正在通过。cookieManager.remove()blockedfalseundefined

通过使用nsICookieManager2接口,仅迭代来自相关主机的那些 cookie,而不是所有 cookie。具体getCookiesFromHost()方法。

更新后的代码是:

内容脚本.js

function DeleteCookies() {
    var payload="Delete";
    self.port.emit("Delete", payload);
}

主.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;
};
于 2016-02-02T05:29:12.863 回答