>Форум Mozilla Россия http://forum.mozilla-russia.org/index.php >Разработка http://forum.mozilla-russia.org/viewforum.php?id=18 >очистка куков с определенного хоста http://forum.mozilla-russia.org/viewtopic.php?id=50697 |
bidlocoder > 17-07-2011 03:18:37 |
доброго времени суток дело вот в чем, к большой радости пользователей и к горю разработчиков 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 уже работать не хочет(((((((( |
Infocatcher > 17-07-2011 03:55:03 |
Причем Выделить код Код: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); // Сюрприз :) |
hydrolizer > 17-07-2011 03:57:13 |
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. |
hydrolizer > 17-07-2011 12:02:17 |
Кстати, я ради интереса проверил на 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] - т.е. получается, что вызов на объекте instanceof при возможности приведения типа объекта к типу, на который мы проверяем, эквивалентен вызову на объекте QueryInterface с указанием того типа, на принадлежность к которому мы проверяем - видимо, при проверке система пытается получить от объекта слева интерфейс, указанный справа, и проверить эквивалентность результата; если всё в порядке, то проверяемый объект сохраняет тип, к которому его привели для проверки. |
bidlocoder > 31-07-2011 21:30:50 |
спасибо всем, как всегда все оказалось очень просто))) |