Чтение файлов cookie веб-страницы из расширения Firefox (XUL) - PullRequest
3 голосов
/ 06 октября 2009

Я создаю расширение для браузера Firefox. Я хотел бы прочитать cookie, который был установлен HTML-страницей с использованием JavaScript в XUL-файле. Возможно ли это?

Я пытался использовать document.cookie, но это не работает:

function readCookie(name) {
  var ca = document.cookie.split(';');
  var nameEQ = name + "=";
  for(var i=0; i < ca.length; i++) {
    var c = ca[i];
    while (c.charAt(0)==' ') c = c.substring(1, c.length); //delete spaces
    if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
  return "";
}

function createCookie(name, value, days) {
  if (days) {
    var date = new Date();
    date.setTime(date.getTime()+(days*24*60*60*1000));
    var expires = "; expires="+date.toGMTString();
    }
  else var expires = "";
  document.cookie = name+"="+value+expires+"; path=/";
}

function eraseCookie(name) {
  createCookie(name, "", -1);
}

Не могли бы вы помочь мне? Заранее спасибо.

Ответы [ 4 ]

14 голосов
/ 25 сентября 2010

Эти фрагменты кода могут помочь

///By this method you can iterate throug each cookie by its name or value... 

function ReadCookie()   
{
var cookieMgr = Components.classes["@mozilla.org/cookiemanager;1"]
         .getService(Components.interfaces.nsICookieManager);

for (var e = cookieMgr.enumerator; e.hasMoreElements();) {
 var cookie = e.getNext().QueryInterface(Components.interfaces.nsICookie); 
  dump(cookie.host + ";" + cookie.name + "=" + cookie.value + "\n");

 ///Your code here to check your cookie or your implementation...
 ///You can use cookie name or value to select your cookie...

}
}

/// Если вы хотите читать куки по имени домена, вы можете использовать этот код ...

function GetCookie(){
try
{
alert("Getting Cookies");
    var ios = Components.classes["@mozilla.org/network/io-service;1"]
            .getService(Components.interfaces.nsIIOService);
var uri = ios.newURI("http://www.yoursite.com/", null, null);

var cookieSvc =
   Components.classes["@mozilla.org/cookieService;1"]
             .getService(Components.interfaces.nsICookieService);
var cookie = cookieSvc.getCookieString(uri, null);

///Your logic here...
}
catch (errorInfo)
{
    alert(errorInfo);
}

}

Надеюсь, это поможет:)

5 голосов
/ 06 октября 2009

Вы, вероятно, хотите использовать интерфейс nsICookieService: https://developer.mozilla.org/en/Code_snippets/Cookies

(Найден через полезный поиск в Центре разработки дополнений Mozilla : https://addons.mozilla.org/en-US/developers/search?q=cookie)

1 голос
/ 28 октября 2009

Есть как минимум два разных способа сделать это:

Во-первых, если вы просто хотите взаимодействовать с хранилищем файлов cookie Firefox, вы можете использовать интерфейсы nsICookieManager и nsICookieManager2 для запроса, добавления и удаления файлов cookie.

Во-вторых, если вам удобнее использовать подход document.cookie и вы хотите работать с документами, которые уже загружены в браузер, вы можете сделать это, но важно помнить, что нужно получить правильный документ. работать с. Когда вы просто используете document в коде XUL, вы ссылаетесь на объект документа, связанный с окном браузера, в котором вы работаете. В этом окне может быть загружено несколько страниц на разных вкладках, каждая из которых будет иметь свой собственный объект документа. В результате вам сначала нужно найти интересующий вас объект документа. Например, один из способов сделать это - зарегистрироваться, чтобы получать уведомления о загрузке страниц, а затем проверять страницы по мере их загрузки, чтобы определить, являются ли они интересными. представляет интерес. Например, ваш код XUL может выглядеть так:

function pageLoad (event) {
  if (event.originalTarget instanceof HTMLDocument) {
    var doc = event.originalTarget;

    if (doc.URL.match(/^https?:\/\/[^\/]*\.example\.com\//)) {
      ⋮
      doc.cookie = 'cookie_name' + "=" + value + ";expires=" +
                   (new Date(2050, 10, 23)).toGMTString();
      ⋮
    }
  }
}

var appcontent = document.getElementById("appcontent");  // locate browser

if (appcontent)
  appcontent.addEventListener("load", function (e) { pageLoad(e); }, true);

При таком подходе вы можете взаимодействовать только с теми файлами cookie, которые связаны с этой страницей, используя механизмы, с которыми вы знакомы, и не беспокоясь о работе с файлами cookie, связанными с совершенно разными страницами.

1 голос
/ 06 октября 2009

Вы также можете захотеть взглянуть на существующие расширения, которые работают с cookie, такие как FireCookie.

...