Страницы: 1
доброго времени суток дело вот в чем, к большой радости пользователей и к горю разработчиков 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 уже работать не хочет((((((((
какие предложения?
Отсутствует
Причем
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); // Сюрприз :)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
какие предложения?
Для начала - впредь вместо работать не хочет приводить подробное описание того, как работать не хочет: полные сообщения возникающих ошибок, описание ситуации, в которой ошибка возникает, и т.п. Далее: читать 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
Отсутствует
спасибо всем, как всегда все оказалось очень просто)))
Отсутствует
Страницы: 1