Как удалить межсайтовые куки с расширением 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;
};
Другие вопросы по тегам