доброго времени суток дело вот в чем, к большой радости пользователей и к горю разработчиков mozilla начала просто огромными шагами развивать firefox, конечно это здорово но в связи с этим у я уже не первый раз сталкиваюсь стем что  нововведения очень плохо задокументированы

еще недавно  я  легко пользовался функцией для очистки куков для определенного хоста, типа

Выделить код

Код:

function dchost(host) {
    var cmgr = Components.classes["@mozilla.org/cookiemanager;1"].getService();
    cmgr = cmgr.QueryInterface(Components.interfaces.nsICookieManager);
    var enumerator = cmgr.getCookiesFromHost(host);
    var count = 0;
    var showPolicyField = false;
    while (enumerator.hasMoreElements()) {
        var nextCookie = enumerator.getNext();
        nextCookie = nextCookie.QueryInterface(Components.interfaces.nsICookie);
        cmgr.remove(nextCookie.host, nextCookie.name, nextCookie.path, false);

    }
}

а вот в 4-5 уже работать не хочет((((((((
какие предложения?

nsICookieManager2 ?

Причем

Выделить код

Код:

var cm = Components.classes["@mozilla.org/cookiemanager;1"]
    .getService(Components.interfaces.nsICookieManager);
alert("getCookiesFromHost" in cm); // false
var cm2 = Components.classes["@mozilla.org/cookiemanager;1"]
    .getService(Components.interfaces.nsICookieManager2);
alert("getCookiesFromHost" in cm); // Сюрприз :)
bidlocoder пишет

какие предложения?

Для начала - впредь вместо работать не хочет приводить подробное описание того, как работать не хочет: полные сообщения возникающих ошибок, описание ситуации, в которой ошибка возникает, и т.п. Далее: читать MDN. Например, здесь, здесь, и здесь написано, что интерфейсы были last changed in Gecko 1.7 и in Gecko 1.9.2, а FF4.0 и FF5.0 - это Gecko 2.0 и Gecko 5.0 соответственно. В третьих, опять читать MDN: у интерфейса nsICookieManager нет метода getCookiesFromHost, этот метод есть у интерфейса nsICookieManager2. Возможно, раньше в силу каких-то причин QueryInterface при реализации объектом интерфейса выше по иерархии наследования, и при запросе интерфейса ниже по иерархии наследования, отдавал фактический тип (что, по моему скромному, не есть правильно - отдавать надо то, что запрашивают). Вам следует делать вызов QueryInterface с указанием Ci.nsICookieManager2.

Кстати, я ради интереса проверил на 3.6.17 (уж что было под рукой) - при QueryInterface(Ci.nsICookieManager) (без 2) возвращаемый экземпляр сервиса имеет фактический тип, соответствующий тому, который запрашивали - т.е. в точности nsICookieManager, и, соответственно, не содержит метода getCookiesFromHost. И заодно наткнулся на один интересный эффект (наблюдается и в 3.6, и в 4.0/5.0). Тест был таков:

Выделить код

Код:

var cmgr = Cc["@mozilla.org/cookiemanager;1"].getService(Ci.nsICookieManager);
var console = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService);
console.logStringMessage(cmgr);
console.logStringMessage("getCookiesFromHost" in cmgr);
console.logStringMessage(cmgr instanceof Ci.nsICookieManager2);
console.logStringMessage(cmgr);
console.logStringMessage("getCookiesFromHost" in cmgr);

И результаты теста таковы:

[xpconnect wrapped nsICookieManager]
false
true
[xpconnect wrapped (nsISupports, nsICookieManager, nsICookieManager2)]
true

- т.е. получается, что вызов на объекте instanceof при возможности приведения типа объекта к типу, на который мы проверяем, эквивалентен вызову на объекте QueryInterface с указанием того типа, на принадлежность к которому мы проверяем - видимо, при проверке система пытается получить от объекта слева интерфейс, указанный справа, и проверить эквивалентность результата; если всё в порядке, то проверяемый объект сохраняет тип, к которому его привели для проверки.

спасибо всем, как всегда все оказалось очень просто)))