2013-07-29 53 views
0

我正試圖添加一個函數到我的Firefox擴展中,當點擊站點A上的一個按鈕時觸發事件從站點B刪除cookie。網站A和B不共享域,但網站B運行在注入站點A的iframe中。我需要Firefox內容腳本中的點擊事件觸發內容腳本或Firefox擴展主要中的事件以刪除所有從網站B的餅乾。如何使用Firefox 22+擴展刪除跨站點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++; 
      } 
     } 
    } 
}; 
+0

包括你的錯誤。它可能有助於縮小範圍。 –

+0

除了未來關於組件被刪除的錯誤之外,沒有其他錯誤被拋出。然而,第一個警報從不會觸發。 – TauterTwiggy

回答

1

你不能從內容腳本訪問XPCOM。內容腳本和main.js之間的通信使用port mechanism,並從後者刪除cookie。

+0

感謝您的提示幫助我找出實際問題。 – TauterTwiggy

1

它似乎將正確執行任務的代碼編輯到問題中,而不是作爲答案發布。不幸的是,似乎有一個錯誤,它遍歷所有的cookie,而不是你想要刪除的域中的那些。對於Deleting cookies with JavaScript in Firefox extension這個問題,我修改了這個問題中的代碼以提高效率,並修復了這個錯誤。考慮到我已經在編寫代碼,我在這裏發佈它,以便其他人不需要去弄清代碼是否被編輯到問題中並找到代碼的問題。

問題是cookie.blocked傳遞給cookieManager.remove(),當沒有爲nsICookie定義blocked屬性時。應該通過的是false,假設沒有意圖阻止來自該主機的cookie。實際上,undefined目前正在通過。

僅通過使用nsICookieManager2接口來完成對來自相關主機而不是所有cookie的cookies的迭代。具體是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; 
};