正如Alexander O'Mara在评论中提到的,Chrome 和 Firefox JavaScript 扩展运行在比网页中包含的 JavaScript 具有更高权限的上下文中。在更高的权限级别,他们被允许对 cookie 进行更改。您的困惑可能是您正在阅读的网页讨论了从网页运行的 JavaScript 的可能性。
虽然我没有测试它,但以下代码似乎可以满足您的需求:
var {Cc, Ci} = require("chrome");
function DeleteAllCookiesForDomain( domain ) {
var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager);
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, false);
cookie_count++;
}
}
}
return cookie_count;
};
上面的代码是从如何删除带有 Firefox 22+ 扩展的跨站点 cookie?.
但是,上面的代码效率很低,因为它遍历了所有 cookie,而不仅仅是您有兴趣删除的域中的那些。以下使用nsICookieManager2接口仅对您要删除的域的那些 cookie 进行迭代:
//For SDK
var {Cc, Ci} = require("chrome");
var cookieManager = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager2);
//*/
/*//For restartless/bootstrap/overlay
Components.utils.import("resource://gre/modules/Services.jsm");
var cookieManager = Services.cookies;
//*/
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;
};