使用 Firefox Add-on SDK 读取指定主机的 cookie

Read cookies of specified host using Firefox Add-on SDK

我正在使用附加 SDK 开发 Mozilla Firefox 扩展。在每个选项卡更改事件中,我想读取在另一个选项卡中打开的指定主机的 cookie。我达到了标签更改,但我试图找出在最近激活的标签中获取指定主机的 cookie 的方法。

var tabs = require("sdk/tabs");
tabs.on('activate', function(tab) {
    // want to get cookies here. 
});

好吧,来自 tabs.on('activate') event handler, you have the tabtab 对象有一个 属性 url,您可以从中获取主机。拥有主机后,您可以获得该主机的 cookie。你还没有说明你想用它们做什么。所以,这里只是枚举它们的一种方法。

为了使用Services.cookies (nsICookieManager2) you will also need to require Chrome Authority的一些方法。

var domainToUse = 'google.com';
var { Services }  = require("resource://gre/modules/Services.jsm");
var { Cc, Cu, Ci} = require("chrome");
let cookieEnumerator = Services.cookies.getCookiesFromHost(domainToUse);
while (cookieEnumerator.hasMoreElements()) {
  let cookie = cookieEnumerator.getNext().QueryInterface(Ci.nsICookie2); 
  console.log(cookie.host + ";" + cookie.name + "=" + cookie.value + "\n");
}

Firefox 新版本的更新:
注意:至少在 Firefox 50.0a2(当前是 Firefox Developer Edition)中,需要使用稍微不同的 getCookiesFromHost() 调用来获取 cookieEnumerator。如果没有更改,对 getCookiesFromHost() 的调用将在浏览器控制台中显示一条警告消息,指示您访问 nsICookieManager2 MDN documentation page,其中没有关于警告的更新信息,也没有关于更改的任何文档。我不得不查看源代码以确定需要什么。似乎需要的是传入当前内容 document。然而,从一个背景脚本看来并不合理。另一种使用方式是只传入一个空对象,{}。因此,该行更改为:

let cookieEnumerator = Services.cookies.getCookiesFromHost(domainToUse,{});

应该是为了传入"the originAttributes of cookies that would be be retrieved."

上面的代码是从我的 answer to "How to set custom cookies using Firefox Add-on SDK (using Services from Firefox Add-on SDK)".

稍微修改而来的