0

サイト A のボタンがクリックされたときにサイト B から Cookie を削除するイベントをトリガーする関数を Firefox 拡張機能に追加しようとしています。サイト A と B はドメインを共有していませんが、サイト B はサイト A に挿入された iframe で実行されています。サイト 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++;
            }
        }
    }
};
4

2 に答える 2

1

タスクを正しく実行するコードは、回答として投稿されるのではなく、質問に編集されたようです。残念ながら、バグがあるようで、削除したいドメインの Cookie だけでなく、すべての Cookie を反復処理します。Firefox 拡張機能で JavaScript を使用して Cookie を削除するという質問については、この質問のコードをより効率的に修正し、バグを修正しました。私はすでにコードに取り組んでいるので、他の人がコードが質問に編集されたことを理解し、コードの問題を見つける必要がないように、ここに投稿しています。

nsICookieに属性が定義されていない場合にcookie.blocked渡されるバグです。そのホストからの Cookie をブロックする意図がないと仮定すると、そこに渡す必要があるのは です。そのまま、現在通過中です。cookieManager.remove()blockedfalseundefined

すべての Cookie ではなく、問題のホストからの Cookie のみを反復処理するには、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;
};
于 2016-02-02T05:29:12.863 に答える