Страницы: 1
плохо читали документацию
у вас есть другие варианты перевода слова "relevant" в данном контексте? мой вариант перевода: "aExpiry... Only relevant if aIsSession is false" = значение переменной aExpiry учитывается только в том случае, если aIsSession=false (т.е. в противном случае оно может быть любым и не должно влиять на срок жизни куки, поскольку он и так отмечен концом сессии)
открою вам тайну, уже установленная кука таким образом удалится
в курсе, имеенно так я их и удаляю
сессионная кука гарантированно удаляется при завершении сессии, ничего не мешает ей истечь по установленной дате
и где же это написано в документации, которую я плохо читал??? хотя предвижу ваш ответ: "это подразумевается", и это было бы так, если бы отсутствовало предложение "Only relevant if aIsSession is false", которое и вносит всю путаницу для тех, кто хорошо читает
[url]https://developer.mozilla.org/En/NsICookieManager2#add%28%29[
Оказалось, что под Chrome тоже все нормально работает. У меня просто было неправильное обращение к объекту в скрипте (помог пример test.html, который так же был в составе проекта).
Ещё раз спасибо, Unghost, за ценную ссылку!!!
Спасибо за ссылку! Очень хороший пример плагина - легко собрался и действительно подключился простым копированием его в папку плагинов.
Правда подключился только к FireFox, Chrome его тоже, к сожалению, не воспринял (хотя вроде делал все, как описано здесь http://code.google.com/chrome/extensions/npapi.html)
В смысле через реестр? Там ведь написано только, где в реестре посмотреть путь к папке плагинов для использования его в инсталляционном скрипте... Я на самом деле пробовал просто кидать свою dll в папку ...Mozilla Firefox\plugins, но безрезультатно. Или должно работать? Так-то я конечно допускаю, что и сам плагин может оказаться неработоспособным, принимая во внимание эту статью http://stackoverflow.com/questions/1962 … gle-chrome, однако как это проверить? (под дебаггером у меня не вызывается ни одна из инициализационных функций)
Отловил ошибку в работе метода nsICookieManager2->Add (xulrunner-1.9.2) для установки сессионной куки (при вызове ее из dll компоненты, не знаю, что будет в скриптовой версии). В SDK о последнем параметре этой функции говорится:
aExpiry
Holds the expiration date, in seconds since the epoch. Only relevant if aIsSession is false.
Однако, оказалось, что это параметр "relevant" в любом случае! Т.е. если при установке сессионной куки его просто указать равным нулю, то кука не поставится; и поставится она только в том случае, если этот параметр будет больше текущих даты/времени. Более того, не смотря на то, что в менеджере кук, установленная через данную функцию кука будет значится как сессионная, она удалится, как только наступит время aExpiry.
Собрал тестовый NPAPI плагин отсюда: http://git.webvm.net/?p=npsimple;a=summary Однако, не смог разобраться как его подключить к FireFox.
Читал о возможных методах установки здесь: https://developer.mozilla.org/en/Gecko_ … g Plug-ins, но так и не понял, как хотя бы какой-нибудь из них использовать. Пробовал собрать xpi последним способом, используя Add-on Builder, положив в папку plugins свою dll, однако не нашел информации о том, как нужно поправить install.rdf, чтобы в итоге получился плагин, а не расширение. В документации к install.rdf вообще обнаружил такую строку: Firefox 2 and previous supported a value of 16 to represent plug-ins. In Firefox 3 this has been removed (и как теперь указывать, что это плагин?).
В общем, прошу тех, кто знает, поделиться информацией о том, как правильно оформить инсталлер плагина (или даже просто подключить свой плагин вручную).
…Возможно, эта тема несколько преждевременна (пока не вышел релиз SDK 2.0), однако, хотелось бы уже сейчас сделать свои расширения совместимыми с FireFox 4, а не ждать, когда они отвалятся с ее официальным выпуском, и только тогда начинать шевелиться.
Итак первый вопрос по самому SDK. После перехода с 1.9.2 на 2.0b7 у меня (да и не только у меня одного) возникли следующие ошибки (при компиляции в VC++):
.../mozalloc.h(107) : error C3646: 'NS_ATTR_MALLOC' : unknown override specifier
.../mozalloc.h(107) : error C3646: 'NS_WARN_UNUSED_RESULT' : unknown override specifier
эти дефайны почему-то нигде не определяются
Единственное объяснение этой проблемы я вижу в том, что исходник mozalloc.h забыли обновить (причем как отдельно в SDK, так и в самом FireFox).
Так ли это? Или здесь есть какой-то нюанс?
Добился нормального получения nsCOMPtr<nsIWeakReference> listener и даже AddWebBrowserListener возвращает True. Однако уведомления о событиях все равно не приходят... Как бы проверить, что еще может быть не так? Как, например, проверить, что у меня рабочая ссылка на nsIWebBrowser (помимо возвращенного положительного результата от do_GetService)?
Решил пойти по другому пути. В исходниках мозиллы нашел некий класс CWebBrowserContainer. Этот класс, похоже, используется объектом CMozillaBrowser для получения каких-то событий. По крайней мере, я нашел в нем конструкцию подключения, схожую с моей. Однако, CWebBrowserContainer не реализует интерфейсы nsISupportsWeakReference и nsIWeakReference, вместо этого он просто наследует класс nsWeakReference. Я добавил исходники nsWeakReference в свой проект, занаследовал от него свой класс и это чудо не только скомпилировалось но и... не завалилось. Но теперь я просто получаю в nsCOMPtr<nsIWeakReference> listener нуль. Вопрос: может ли это быть из-за того, что я линкую библиотеки старого XPCOM SDK? (правда Unresolved Externals не возникают, а новое SDK подключать проблематично)
Elexander, интерфейсы nsISupportsWeakReference и nsIWeakReference у меня реализуются, но под дебаггером я в них еще ни разу не попадал. Может быть я не правильно их реализую:
NS_METHOD CWebProgressListener::QueryReferent(const nsIID & uuid, void **result) { *result = this; return NS_OK; } NS_METHOD CWebProgressListener::GetWeakReference(nsIWeakReference **_retval) { *_retval = this; return NS_OK; }
дизасемблер места падения:
[code]
01117549 push offset `nsISupportsWeakReference::GetIID'::`2'::iid (11292B4h)
0111754E mov dword ptr [ebp-0Ch],eax
01117551 lea eax,[ebp-10h]
01117554 push eax
01117555 lea ecx,[ebp+8]
01117558 call nsCOMPtr_base::assign_from_qi_with_error (1117496h)
0111755D mov eax,dword ptr [ebp+8]
01117560 test eax,eax
01117562 je NS_GetWeakReference+43h (1117571h)
01117564 mov ecx,dword ptr [eax]
01117566 lea edx,[ebp-8]
01117569 pus
Схема, наконец-то, начала компилироваться, однако, конечно же, пока не работает! :)
Есть пара подозрительных мест в реализации, но какие именно работают некорректно - не понятно. Может у кого будут идеи? Вот эти места:
1) класс-обработчик, который я создаю не является полноценным XPCOM объектом (т.е. у него нету ID, и методы nsISupport реализуются вручную)
2) недостаточно полная реализация всех методов, требующихся для регистрации подписки
В итоге ниже приведенные код падает с Access Violation на строке вызова AddWebBrowserListener:
[code]
CWebProgressListener *wpl = new CWebProgressListener();
nsCOMPtr<nsIWebBrowser> webBrowser;
nsresult nsRes;
webBrowser = do_GetService("@mozilla.org/embedding/browser/nsWebBrowser;1",&nsRes);
if (NS_SUCCEEDED(nsRes))
{
nsCOMPtr<nsIWeakReference> listener( do_GetWeakReference(static_cast<nsIWebProgressListener*>(wpl),&nsRes));
if (NS_SUCCEEDED(nsRes))
{
PRBool bRes = webBrowser->AddWebBr
Добрый день. Есть необходимость добавить в свое расширение, написанное на VC++, обработчик событий браузера (в частности, чтобы отлавливать переход пользователя по ссылке). В книжке "Creating XPCOM Components" описывается пример плагина (WebLock), который, по-видимому, содержит данный функционал, но к сожалению исходного кода к нему я не нашел, а того, что есть в книге, мне оказалось недостаточно.
Если я правильно понял для решения моей задачи нужно:
1) создать собственный класс, реализующий интерфейс nsIWebProgressListener и реализовать в нем метод onLocationChange
2) запросить интерфейс nsIWebBrowser и передать в его методе addWebBrowserListener экземпляр собственного класса и IDD nsIWebProgressListener
так?
Как бы то ни было, проверить эту схему мне пока не удалось, поскольку не удается даже скомпилировать проект: во-первых, на сколько я понял, необходимо самому реализовать методы nsISupport в своем классе, или это можно сделать каким-ниб
…Пишу XPCOM компонент на C++. Появилась необходимость отслеживать значение поискового плагина по-умолчанию и в случае его изменения выдавать сообщение с предложением переключиться на прежнее значение. Для этого я отслеживаю значение browser.search.defaultenginename и в случае его изменения и положительного ответа пользователя на мое предложение устанавливаю туда свое значение. Кроме того, я также меняю значение browser.search.selectedEngine, однако визуально это изменение применяется только после перезапуска FireFox.
В связи с этим вопрос: есть ли какой-нибудь сервис/интерфейс, позволяющий применить это изменение сразу, т.е. чтобы после нажатия пользователем кнопки ОК на диалоге, поисковый плагин сразу же поменялся бы на панели браузера?
Вообще, экземпляр моего объекта похоже даже не создается (по крайней мере в конструктор объекта я под дебеггером не попал), ведь я никогда явно не запрашиваю свой интерфейс. Поэтому куда сунуть вызов своей функции даже не заню, может переписать NS_GENERIC_FACTORY_CONSTRUCTOR под себя, добавив в конец вызов этой функции, или это не поможет? (надо будет проверить на досуге)
А вообще нет. Пардон за беспокойство - код работает :) Правда он работает, когда фф окончательно загрузился, а вот с моментом загрузки - проблема: мне нужно перебить сессионную куку новой, когда первая грузится из sessionstore.js. А вот как отловить момент "догрузки" фф - не ясно. Если слишко рано пытаться выставлять куку (а ставлю я ее на событии DLL_PROCESS_ATTACH) - фф периодически валится или вообще ее не выставляет, а подгружает старую, из сохраненной сессии. А вот если ее ставить с задержкой в потоке - то уже чаще ставится (но тоже не всегда).
Что касается макроса NS_SUCCEEDED, он возвращает 1 в случае успешного завершения (проверено). А точку перед доменом - да нужно ставить (но этим я озаботился еще раньше).
Спасибо Elexander'у за ссылки! Написал на С++ компонент, связался с ним через pipe, вроде все заработало.
Но недавно столкнулся с необходимостью записывать сессионные куки, и возникла проблема. Вот вырезка из кода:
if (t) bRes = NS_SUCCEEDED(cookieMgr2->Add(aDomain, aPath, aName, aValue, PR_FALSE, PR_FALSE, PR_FALSE, t)); else bRes = NS_SUCCEEDED(cookieMgr2->Add(aDomain, aPath, aName, aValue, PR_FALSE, PR_FALSE, PR_TRUE, t)); // сессионная
В обоих ветвях результат возвращаяется положительный (1). Однако сессионная кука в FireFox почему-то не появляется. Что может быть не так в коде?
И еще вопрос: для установки куки вида <name>=deleted имеет значение, как ее устанавливать сессионной или нет? (пока разницы не заметил)
Большое спасибо за подсказку и ссылку! Быстро нашел то, что мне нужно.
Печально, если так... Мне-то как раз надо, чтобы dll всегда подгружалась, поскольку я использую ее для взаимодействия с внешним приложением. Т.е. мне не требуется вызывать ее интерфейсы из браузера. Может быть, все-таки есть способ заставить ее грузиться всегда?
Столкнулся со странной проблемой. После регистриации компоненты она отрабатывает только один раз. Т.е. при следующей загрузке браузера соответсвующая dll не подгружается. Для того, чтобы ее снова запустить необходимо каждый раз удалять файлы compreg.dat и xpti.dat из папки профиля. Как это можно исправить?
Спасибо за пример и поясняющую ссылку! Теперь заработало!
P.S. Оказывается я пытался абстрактные классы проинициализировать, забавное получилось недоразумение :)
Есть переменная типа char*. Нужно перевести ее в тип nsACString для дальнейшей передачи в параметрах фукнции. Подскажите, пожалуйста, как это сделать.
Кроме того, порывшись в коде самой Мозиллы, обнаружил, что там часто используется тип nsCAutoString, а вот в SDK он почему-то не определен. Его можно как-то задействовать в своем приложении?
Еще раз спасибо за быстрый ответ!
Вообщем-то я и сам сомневался, что включенный пример работает. Похоже, что этот SDK писался просто под другой GRE...
Мне нужно читать и записывать cookies из/в базу браузера, установленного в системе, из внешнего приложения. FireFox3 использует SQLite для хранения кук. С этим я уже разобрался. Все бы хорошо, но этот механизм не позволяет редактировать куки "на лету": т.е. пока браузер запущен, он не видит изменений, сделанных извне (хотя и видит их после перезапуска).
Т.е. в моем случае, на сколько я понял, может помочь только написание расширения? Что ж, буду рад если подскажете, как это лучше сделать. На каком языке его лучше писать, так чтобы можно было потом обеспечить нормальное взаимодействие с приложением на дельфях?
P.S. Спасибо за пояснение по поводу xpidl-компилятора! Действительно все делал вручную.
Благодарю за Ваши пояснения и исправления в определении интерфеса!
Программа теперь отрабатывает нормально, НО, к сожалению, желаемого результата от нее все равно пока получить не могу. Вот полный текст программы:
[code]program Project1;
{$APPTYPE CONSOLE}
uses
nsXPCOM,
nsXPCOMGlue,
nsTypes,
nsError,
nsGeckoStrings,
nsNetUtil,
SysUtils;
const
NS_COOKIEMANAGER_CONTRACTID = '@mozilla.org/cookiemanager;1';
type
nsICookie2 = interface(nsICookie)
['{736619fe-8d09-4e59-8223-32f176c22977}']
end;
nsICookieManager2 = interface(nsICookieManager)
['{5047cab4-9cb2-4927-a4ab-77422bc3bc67}']
function add ( domain: nsACString; path: nsACString; name: nsACString; value: nsACString; isSecure: PRBool;
isHttpOnly: PRBool; isSession: PRBool; expiry: PRInt64 ): nsresult; stdcall;
function cookieExists ( cookie: nsICookie2; out _retval: PRBool ): nsresult; stdcall;
function countCookiesFromHost ( host: nsACString; out _retval: PRUint32
Есть необходимость использовать XPCOM в Delphi. Конкретно - для управления Cookies из своего приложения.
Скачал и установил Gecko SDK под Delphi. Скомпилировал прилагаемый пример - запускается (хотя правильно ли он работает, я так и не понял, но под дебаггером вроде все идет нормально).
Далее, поскольку требуемых мне интерфейсов в текущей версии Gecko SDK под Delphi не оказалось, описал их самостоятельно.
Теперь сама проблема: подгрузить интерфейсы удается (указатель получаю), но вызов их функций в лучшем случае просто не приводит к ожидаемым результатам, в худшем - инициирует аварийный выход. Если кто знает, подскажите, пожалуйста, что не так делаю.
Вот доопределенные мною интерфейсы:
[code]const
NS_COOKIEMANAGER_CONTRACTID = '@mozilla.org/cookiemanager;1';
type
nsICookie2 = interface(nsICookie)
['{736619fe-8d09-4e59-8223-32f176c22977}']
end;
nsICookieManager2 = interface(nsICookieManager)
['{5047cab4-9cb2-4927-a4ab-77422bc3bc67}']
procedure add ( do
Страницы: 1