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

Пользователи не любят читать документацию. Станьте оригинальным, будьте не как все. Ознакомьтесь с нашей базой знаний.

№113-03-2010 00:08:11

hyp1k
Участник
 
Группа: Members
Зарегистрирован: 12-03-2010
Сообщений: 3
UA: Firefox 3.6

Нужна помощь в написании плагина. С++, минимум JS.

Пишу плагин для фф.
Нашел способ смены стиля для странички, код джаваскрипт:

Выделить код

Код:

var sss = Components.classes["@mozilla.org/content/style-sheet-service;1"]
                    .getService(Components.interfaces.nsIStyleSheetService);
var ios = Components.classes["@mozilla.org/network/io-service;1"]
                    .getService(Components.interfaces.nsIIOService);
var u = ios.newURI("chrome://myext/content/myext.css", null, null);
if(sss.sheetRegistered(u, sss.USER_SHEET))
  sss.unregisterSheet(u, sss.USER_SHEET);

Хочу то же самое написать на С++ и оформить в качестве длл. Может кто-нибудь поможет с примерчиком, как вызвать интерфейс Components.interfaces.nsIStyleSheetService из С++.

Вижу по заголовочным файлам в sdk xulrunner, что возможностей море, но как ими воспользоваться не знаю.

Например есть интерфейс

Выделить код

Код:

nsIDOMCSSStyleSheet interface 
 
void deleteRule(in unsigned long index)

unsigned long insertRule(in DOMString rule, in unsigned long index)

как бы можно воспользоваться функцией insertRule, но как/откуда получить корректно объект типа nsIDOMCSSStyleSheet.

Хочется чтобы из джава скрипта вызывалась 1 функция xpcom, которая вешает обработчик на загрузку страницы и менает стиль, подгружая стиль по забитому url. Буду благодарен за полезную инфу, пытаюсь разобраться уже неделю вкуриваю медленно...

Отредактировано hyp1k (13-03-2010 00:28:27)

Отсутствует

 

№217-03-2010 22:26:30

hyp1k
Участник
 
Группа: Members
Зарегистрирован: 12-03-2010
Сообщений: 3
UA: Firefox 3.6

Re: Нужна помощь в написании плагина. С++, минимум JS.

Программисты-разработчики расширений для ФФ. У кого-нибудь работает подобная вешь?
http://www.codeproject.com/KB/library/firefox_component.aspx?msg=2345250
Т.е. кто-нибудь успешно передавал window из скрипта в xpcom.
Убиваюсь головой, не получается передать указатель nsIDOMWindow.

Работает такая функция
NS_IMETHODIMP Demo::Func1(const PRUnichar *inP, PRUnichar **outP NS_OUTPARAM, PRInt32 *_retval NS_OUTPARAM)

Но если добавляю nsIDOMWindow *domWindow параметр, то и все остальеные функции в этой длл перестают работать. Фаерфокс отправляет отчет об ошибке.
NS_IMETHODIMP Demo::Func1(nsIDOMWindow *domWindow, const PRUnichar *inP, PRUnichar **outP NS_OUTPARAM, PRInt32 *_retval NS_OUTPARAM)


Вот так вот работает
idl файл

Выделить код

Код:

#include "nsISupports.idl"
#include "nsrootidl.idl"

[scriptable, uuid(CB934085-D019-47d5-A6F0-623885873281)]

interface IDemo : nsISupports
{
    long func2(in wstring inP, out wstring outP);
};

Вот так вот не работает
idl файл
#include "nsISupports.idl"
#include "nsIDOMWindow.idl"
#include "nsrootidl.idl"

[scriptable, uuid(CB934085-D019-47d5-A6F0-623885873281)]

interface IDemo : nsISupports
{
    long func1(in nsIDOMWindow domWindow, in wstring inP, out wstring outP);
    long func2(in wstring inP, out wstring outP);
};

Обе функции:

Выделить код

Код:

NS_IMETHODIMP Demo::Func1(nsIDOMWindow *domWindow,const PRUnichar *inP,PRUnichar **outP,PRInt32 *_retval) {
    const wchar_t *msg = L"привет";
    *outP = (PRUnichar *) nsMemory::Clone(msg, (wcslen(msg)+1)*sizeof(wchar_t));
    *_retval = 1;
    return NS_OK;
}

NS_IMETHODIMP Demo::Func2(const PRUnichar *inP,PRUnichar **outP,PRInt32 *_retval) {
    const wchar_t *msg = L"привет";
    *outP = (PRUnichar *) nsMemory::Clone(msg, (wcslen(msg)+1)*sizeof(wchar_t));
    *_retval = 1;
    return NS_OK;
}

Джаваскрипт

            netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
            obj = Components.classes["@demo.com/XPCOMDemo/Demo;1"].createInstance();
            obj = obj.QueryInterface(Components.interfaces.IDemo);                   
            var x={};               
            var res = obj.func2("aa",x);
            alert('func2("aa",x) returned ' + res +  '. x is '+x.value);


Т.е. делаю 2 сборки в одной есть первая функция, в другой ее нету. Первая работает вторая нет. Хотя вроде бы все правильно написал, по примеру приведенному выше. Как понять в чем ошибка.

Отредактировано hyp1k (20-03-2010 14:58:59)

Отсутствует

 

№320-03-2010 20:18:23

hyp1k
Участник
 
Группа: Members
Зарегистрирован: 12-03-2010
Сообщений: 3
UA: Firefox 3.6

Re: Нужна помощь в написании плагина. С++, минимум JS.

3 подряд сообщение пишу сам себе, наверняка кому-нибудь пригодится:
По исходникам из примера http://www.codeproject.com/KB/library/firefox_component.aspx?msg=2345250
Длл собирается с бубнами описание проблем тут http://forums.mozillazine.org/viewtopic.php?f=19&t=1096635&p=5811925

Отсутствует

 

Board footer

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