Полезная информация

В мире Mozilla происходит много интересных событий. Но вам не нужно постоянно посещать новостные сайты, чтобы быть в курсе всех изменений. Зайдите на ленту новостей Mozilla Россия.

Разработка » Неправильная отработка метода nsICookieManager2->Add (XPCOM dll) » 10-08-2011 08:33:25

Shutnik пишет

плохо читали документацию

у вас есть другие варианты перевода слова "relevant" в данном контексте? мой вариант перевода: "aExpiry... Only relevant if aIsSession is false" = значение переменной aExpiry учитывается только в том случае, если aIsSession=false (т.е. в противном случае оно может быть любым и не должно влиять на срок жизни куки, поскольку он и так отмечен концом сессии)

Shutnik пишет

открою вам тайну, уже установленная кука таким образом удалится

в курсе, имеенно так я их и удаляю

Shutnik пишет

сессионная кука гарантированно удаляется при завершении сессии, ничего не мешает ей истечь по установленной дате

и где же это написано в документации, которую я плохо читал??? хотя предвижу ваш ответ: "это подразумевается", и это было бы так, если бы отсутствовало предложение "Only relevant if aIsSession is false", которое и вносит всю путаницу для тех, кто хорошо читает
[url]https://developer.mozilla.org/En/NsICookieManager2#add%28%29[

Разработка » Проблема с подключение NPAPI плагина к FireFox » 02-12-2010 09:45:48

Оказалось, что под Chrome тоже все нормально работает. У меня просто было неправильное обращение к объекту в скрипте (помог пример test.html, который так же был в составе проекта).

Ещё раз спасибо, Unghost, за ценную ссылку!!!

Разработка » Проблема с подключение NPAPI плагина к FireFox » 01-12-2010 15:52:28

Спасибо за ссылку! Очень хороший пример плагина - легко собрался и действительно подключился простым копированием его в папку плагинов.

Правда подключился только к FireFox, Chrome его тоже, к сожалению, не воспринял (хотя вроде делал все, как описано здесь http://code.google.com/chrome/extensions/npapi.html)

Разработка » Проблема с подключение NPAPI плагина к FireFox » 01-12-2010 14:12:45

В смысле через реестр? Там ведь написано только, где в реестре посмотреть путь к папке плагинов для использования его в инсталляционном скрипте... Я на самом деле пробовал просто кидать свою dll в папку ...Mozilla Firefox\plugins, но безрезультатно. Или должно работать? Так-то я конечно допускаю, что и сам плагин может оказаться неработоспособным, принимая во внимание эту статью http://stackoverflow.com/questions/1962 … gle-chrome, однако как это проверить? (под дебаггером у меня не вызывается ни одна из инициализационных функций)

Разработка » Неправильная отработка метода nsICookieManager2->Add (XPCOM dll) » 01-12-2010 13:54:19

Отловил ошибку в работе метода 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 плагина к FireFox » 01-12-2010 13:24:13

Собрал тестовый 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 (и как теперь указывать, что это плагин?).

В общем, прошу тех, кто знает, поделиться информацией о том, как правильно оформить инсталлер плагина (или даже просто подключить свой плагин вручную).

Разработка » Проблемы компиляции расширений под Gecko SDK 2.0b » 28-09-2010 11:47:14

Возможно, эта тема несколько преждевременна (пока не вышел релиз 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).
Так ли это? Или здесь есть какой-то нюанс?

Разработка » Создание обработчика событий браузера в VC++ » 04-03-2010 17:25:12

Добился нормального получения nsCOMPtr<nsIWeakReference> listener и даже AddWebBrowserListener возвращает True. Однако уведомления о событиях все равно не приходят... Как бы проверить, что еще может быть не так? Как, например, проверить, что у меня рабочая ссылка на nsIWebBrowser (помимо возвращенного положительного результата от do_GetService)?

Разработка » Создание обработчика событий браузера в VC++ » 04-03-2010 15:02:29

Решил пойти по другому пути. В исходниках мозиллы нашел некий класс CWebBrowserContainer. Этот класс, похоже, используется объектом CMozillaBrowser для получения каких-то событий. По крайней мере, я нашел в нем конструкцию подключения, схожую с моей. Однако, CWebBrowserContainer не реализует интерфейсы nsISupportsWeakReference и nsIWeakReference, вместо этого он просто наследует класс nsWeakReference. Я добавил исходники nsWeakReference в свой проект, занаследовал от него свой класс и это чудо не только скомпилировалось но и... не завалилось. Но теперь я просто получаю в nsCOMPtr<nsIWeakReference> listener нуль. Вопрос: может ли это быть из-за того, что я линкую библиотеки старого XPCOM SDK? (правда Unresolved Externals не возникают, а новое SDK подключать проблематично)

Разработка » Создание обработчика событий браузера в VC++ » 04-03-2010 08:18:25

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

Разработка » Создание обработчика событий браузера в VC++ » 03-03-2010 14:50:14

Схема, наконец-то, начала компилироваться, однако, конечно же, пока не работает! :)

Есть пара подозрительных мест в реализации, но какие именно работают некорректно - не понятно. Может у кого будут идеи? Вот эти места:
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++ » 02-03-2010 12:35:18

Добрый день. Есть необходимость добавить в свое расширение, написанное на VC++, обработчик событий браузера (в частности, чтобы отлавливать переход пользователя по ссылке). В книжке "Creating XPCOM Components" описывается пример плагина (WebLock), который, по-видимому, содержит данный функционал, но к сожалению исходного кода к нему я не нашел, а того, что есть в книге, мне оказалось недостаточно.

Если я правильно понял для решения моей задачи нужно:
1) создать собственный класс, реализующий интерфейс nsIWebProgressListener и реализовать в нем метод onLocationChange
2) запросить интерфейс nsIWebBrowser и передать в его методе addWebBrowserListener экземпляр собственного класса и IDD nsIWebProgressListener
так?

Как бы то ни было, проверить эту схему мне пока не удалось, поскольку не удается даже скомпилировать проект: во-первых, на сколько я понял, необходимо самому реализовать методы nsISupport в своем классе,  или это можно сделать каким-ниб

Разработка » Изменение поискового плагина "на лету" » 20-11-2009 16:04:31

Пишу XPCOM компонент на C++. Появилась необходимость отслеживать значение поискового плагина по-умолчанию и в случае его изменения выдавать сообщение с предложением переключиться на прежнее значение. Для этого я отслеживаю значение browser.search.defaultenginename и в случае его изменения и положительного ответа пользователя на мое предложение устанавливаю туда свое значение. Кроме того, я также меняю значение browser.search.selectedEngine, однако визуально это изменение применяется только после перезапуска FireFox.

В связи с этим вопрос: есть ли какой-нибудь сервис/интерфейс, позволяющий применить это изменение сразу, т.е. чтобы после нажатия пользователем кнопки ОК на диалоге, поисковый плагин сразу же поменялся бы на панели браузера?

Разработка » Применение Gecko SDK в Delphi » 21-08-2009 12:10:20

Вообще, экземпляр моего объекта похоже даже не создается (по крайней мере в конструктор объекта я под дебеггером не попал), ведь я никогда явно не запрашиваю свой интерфейс. Поэтому куда сунуть вызов своей функции даже не заню, может переписать NS_GENERIC_FACTORY_CONSTRUCTOR под себя, добавив в конец вызов этой функции, или это не поможет? (надо будет проверить на досуге)

Разработка » Применение Gecko SDK в Delphi » 18-08-2009 16:47:02

А вообще нет. Пардон за беспокойство - код работает :) Правда он работает, когда фф окончательно загрузился, а вот с моментом загрузки - проблема: мне нужно перебить сессионную куку новой, когда первая грузится из sessionstore.js. А вот как отловить момент "догрузки" фф - не ясно. Если слишко рано пытаться выставлять куку (а ставлю я ее на событии DLL_PROCESS_ATTACH) - фф периодически валится или вообще ее не выставляет, а подгружает старую, из сохраненной сессии. А вот если ее ставить с задержкой в потоке - то уже чаще ставится (но тоже не всегда).

Что касается макроса NS_SUCCEEDED, он возвращает 1 в случае успешного завершения (проверено). А точку перед доменом - да нужно ставить (но этим я озаботился еще раньше).

Разработка » Применение Gecko SDK в Delphi » 17-08-2009 15:32:26

Спасибо 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 имеет значение, как ее устанавливать сессионной или нет? (пока разницы не заметил)

Разработка » регистрация xpcom-компонент в составе расширения для FireFox » 08-04-2009 13:05:06

Большое спасибо за подсказку и ссылку! Быстро нашел то, что мне нужно.

Разработка » регистрация xpcom-компонент в составе расширения для FireFox » 08-04-2009 10:18:37

Печально, если так... Мне-то как раз надо, чтобы dll всегда подгружалась, поскольку я использую ее для взаимодействия с внешним приложением. Т.е. мне не требуется вызывать ее интерфейсы из браузера. Может быть, все-таки есть способ заставить ее грузиться всегда?

Разработка » регистрация xpcom-компонент в составе расширения для FireFox » 07-04-2009 18:10:27

Столкнулся со странной проблемой. После регистриации компоненты она отрабатывает только один раз. Т.е. при следующей загрузке браузера соответсвующая dll не подгружается. Для того, чтобы ее снова запустить необходимо каждый раз удалять файлы compreg.dat и xpti.dat из папки профиля. Как это можно исправить?

Разработка » Инициализация nsACString в C » 07-04-2009 16:39:51

Спасибо за пример и поясняющую ссылку! Теперь заработало!

P.S. Оказывается я пытался абстрактные классы проинициализировать, забавное получилось недоразумение :)

Разработка » Инициализация nsACString в C » 07-04-2009 13:12:22

Есть переменная типа char*. Нужно перевести ее в тип nsACString для дальнейшей передачи в параметрах фукнции. Подскажите, пожалуйста, как это сделать.

Кроме того, порывшись в коде самой Мозиллы, обнаружил, что там часто используется тип nsCAutoString, а вот в SDK он почему-то не определен. Его можно как-то задействовать в своем приложении?

Разработка » Применение Gecko SDK в Delphi » 02-04-2009 17:34:16

Еще раз спасибо за быстрый ответ!

Вообщем-то я и сам сомневался, что включенный пример работает. Похоже, что этот SDK писался просто под другой GRE...

Мне нужно читать и записывать cookies из/в базу браузера, установленного в системе, из внешнего приложения. FireFox3 использует SQLite для хранения кук. С этим я уже разобрался. Все бы хорошо, но этот механизм не позволяет редактировать куки "на лету": т.е. пока браузер запущен, он не видит изменений, сделанных извне (хотя и видит их после перезапуска).

Т.е. в моем случае, на сколько я понял, может помочь только написание расширения? Что ж, буду рад если подскажете, как это лучше сделать. На каком языке его лучше писать, так чтобы можно было потом обеспечить нормальное взаимодействие с приложением на дельфях?


P.S. Спасибо за пояснение по поводу xpidl-компилятора! Действительно все делал вручную.

Разработка » Применение Gecko SDK в Delphi » 02-04-2009 12:08:25

Благодарю за Ваши пояснения и исправления в определении интерфеса!

Программа теперь отрабатывает нормально, НО, к сожалению, желаемого результата от нее все равно пока получить не могу. Вот полный текст программы:

[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

Разработка » Применение Gecko SDK в Delphi » 01-04-2009 18:17:39

Есть необходимость использовать 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

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]