Страницы: 1
Пишу плагин для фф.
Нашел способ смены стиля для странички, код джаваскрипт:
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)
Отсутствует
Программисты-разработчики расширений для ФФ. У кого-нибудь работает подобная вешь?
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)
Отсутствует
3 подряд сообщение пишу сам себе, наверняка кому-нибудь пригодится:
По исходникам из примера http://www.codeproject.com/KB/library/firefox_component.aspx?msg=2345250
Длл собирается с бубнами описание проблем тут http://forums.mozillazine.org/viewtopic.php?f=19&t=1096635&p=5811925
Отсутствует
Страницы: 1