Как удалить межсайтовые куки с расширением Firefox 22+?
Я пытаюсь добавить функцию в мое расширение Firefox, чтобы инициировать событие для удаления файлов cookie с сайта B при нажатии кнопки на сайте A. Сайт A и B не имеют общего домена, но сайт B работает в iframe, внедренном в сайт A. Мне нужно событие click в скрипте контента Firefox, чтобы вызвать событие либо в скрипте контента, либо в главном расширении Firefox, чтобы удалить все куки с сайта B.
У меня есть слушатель щелчка, назначенный на кнопку и стрельбу. Я уже добился такого же эффекта в 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++;
}
}
}
};
2 ответа
Вы не можете получить доступ к XPCOM из скрипта контента. Используйте механизм порта для связи между скриптом содержимого и main.js и удалите куки из последнего.
Похоже, код, который будет правильно выполнять задачу, был отредактирован в вопросе, а не опубликован в качестве ответа. К сожалению, кажется, что есть ошибка, и она перебирает все куки, а не только те в домене, из которого вы хотите удалить. На вопрос " Удаление файлов cookie с помощью JavaScript в расширении Firefox" я изменил код в этом вопросе, чтобы сделать его более эффективным, и исправил ошибку. Учитывая, что я уже работал над кодом, я публикую его здесь, чтобы другим не нужно было выяснять, что код был отредактирован в вопросе, и находить проблемы с кодом.
Ошибка в том, что cookie.blocked
передается cookieManager.remove()
когда нет blocked
атрибут, определенный для nsICookie. Что должно быть передано там false
при условии, что нет намерения блокировать куки с этого хоста. Как это, undefined
в настоящее время передается.
Итерирование только тех куки с рассматриваемого хоста, а не всех куки, осуществляется с помощью интерфейса nsICookieManager2. В частности, 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;
};