Страницы: 1
а как пробовал?
смотрел как работает добавление в закладки?
Дело в том, что любые поползновения в сторону закладок сопровождаются появлением соответствующего диалогового окна ... Смотрел исходники нескольких расширений с более-менее нужной функциональностью, но автоматом ни одно из них закладки не добавляет. Возможно сделано это по соображениям безопасности, чтобы никто не мог наплодить миллион закладок за раз.
Всем привет.
Вопрос прост. Как добавить новый элемент (ссылку) в Bookmarks toolbar. В общем случае хочу при нажатии на кнопку в моем тулбаре автоматически и без выведения дополнительных подтверждающих окон добавлять текущую стрницу в Bookmarks toolbar. Тулбар есть, работает нормально, так что не в нем загвоздка.
Заранее спасибо.
Всем спасибо за ответы ...
Закрываем тему ...
Привет всем.
Кто знает, что это за путь, тому понятно будет, о чем речь. Диалоговое приложение на движке мозиллы, практически свой браузер. Вот только выглядит он действительно как обычное диалогое окно, то есть скин (тема) к нему не применяется, несмотря на то, что без bin\chrome\classic.jar и bin\chrome\classic.manifest приложение не работает.
Вопрос: как заставить его использовать скин?
Все гениальное просто ... как всегда ... :)
Думаю, длина строки значения не имеет. Я у себя туда копировал весь текст HTML страницы, причем проверял на очень большиx (мегабайта полтора - текстовая страница, так что это уже миллионы символов).
Пробовали не использовать CString? Может быть обычный std::string поможет?
Странно ... У меня такой вот код нормально работает:
nsEmbedCString strOut; NS_UTF16ToCString( nsEmbedString(strIn), NS_CSTRING_ENCODING_UTF8, strOut);
при этом strIn это nsEmbedString.
Может, не нужно _retval объялять как ссылку?
Там такая забавная канитель может получиться с преобразованием nsEmbedString в nsEmbedCString ... :)
Благодарю за совет, я уже пошел тем же путем и написал компоненту, осталось только разобраться с работой со строками, т.к нужно вернуть строку, но пока работа с ними несколько ставит меня в тупик :\
Может, стоит поконкретнее описать проблему? Авось кто-нибудь да поможет :)
Первое, что приходит в голову, написать XPCOM компоненту (dll), которая и будет вызывать эти методы ... Насчет javascript сомневаюсь, что это возможно ...
В инете всего один источник, в ктором подробно и толково написано, как создавать XPCOM:
http://www.iosart.com/firefox/xpcom/
А все оказалось проще пареной репы.
Главное, чтобы в С++ #define MY_APP_CONTRACTID
и в javascript const cid =
;
были одинаковыми! ... ну это и ежу понятно. Сам не знаю почему так долго возился ... просто поместил dll и xpt файлы в папку components, которая в одной папке с chrome лежит и все:
my_extension
|_chrome
|_components
Всем спасибо за помощь. Жаль слова Anton'a до меня поздно долетели.
с XPCOM работает очень мало разработчиков
почему бы не посмотреть как это устроено в любом другом расширении с XPCOM?
именно этим и занимаюсь уже последние 2 дня ...
Неужели никто о таком не слышал никогда, разработчики? Или форумы совсем бесполезны? Или это просто лето?..
Все бы хорошо, да вот только как заставить мой XPCOM компонент вызываться из той папки, куда его установили?
Дело в том, что все примеры создания XPCOM компонент оперируют с папкой ~\firefox\components. Да и в самом С++ коде я пишу:
а потом из javascript'a вызываю:
Как же его правильно вызывать и моего профайла в браузере? Что писать в С++ и что в js?
Anton, и все? так просто?
Привет всем.
Собственно проблема в том, что не знаю с чего начать. Насколько я понимаю, традиционная установка с помощью install.js уже не приветствуется или даже порой не будет работать, а нужно использовать install.rdf, и тем не менее большинство расширений (те, которыми пользуюсь я, и которые пробовал ставить) испльзуют именно такой метод.
Направьте, пожалуйста, на путь истинный ... желательно со ссылками, да и к тому же чтобы для FF2 и для FF3 работало.
Заранее спасибо.
для firefox 3.0 нужен SDK на основе gecko 1.9
http://developer.mozilla.org/en/docs/Gecko_SDK
Shutnik, спасибо ... да действительно. Проблема решена.
Привет всем.
Расширение включает XPCOM компоненту, использующую Gecko SDK 1.8.0.4.
Конкретику пока не пишу, потому как надеюсь, что есть уже более ли менее полный список причин, почему не работают расширения в Firefox 3, и, хотелось бы верить, решений тоже.
Спасибо заранее.
Решение, господа.
NS_IMETHODIMP MyComponent::GetDOM(nsIDOMDocument *doc, PRInt32 *_retval)
{ nsresult rv; nsCOMPtr<nsIDOMSerializer> pSerializer = do_CreateInstance(NS_XMLSERIALIZER_CONTRACTID, &rv); nsEmbedString nsHtml; pSerializer->SerializeToString(doc, nsHtml); nsEmbedCString strOut; NS_UTF16ToCString(nsEmbedString(nsHtml), NS_CSTRING_ENCODING_UTF8, strOut); std::stringstream ss; ss << strOut.get(); MessageBox(NULL, ss.str().c_str(), "", MB_OK); return NS_OK; }
Подобная тема уже обсуждалась:
http://forum.mozilla-russia.org/viewtopic.php?id=8417
javascript это делает так:
var cont = window.getBrowser().contentDocument; var ser = new XMLSerializer(); var st = ser.serializeToString(cont);
Мне нужно получить все то же самое только из С++ кода и именно в таком же виде, то есть не просто содержимое между [html] и [/html], а все, все, все, даже если страница с ошибкой и что-то записано вне этого тега + <!DOCTYPE и прочее
Сейчас я просто передаю строку st в XPCOM компоненту, но это решение не совсем красивое, потому как совершенно точно должен быть способ получить всю DOM структуру документа посредсвом интерфейсов Mozilla
Я уже могу получить nsIDOMDocument и nsIDOMWindow, но что-то с ними не все так просто ...
Подскажите, пожалуйста, как быть.
…Проблема решена:
NS_IMETHODIMP MyComponent::GetDOM3(nsEmbedString *Domstr, PRInt32 *_retval) { std::stringstream ss; nsEmbedCString strOut; NS_UTF16ToCString( nsEmbedString(*Domstr), NS_CSTRING_ENCODING_UTF8, strOut); ss << strOut.get(); MessageBox(NULL, ss.str().c_str(), "", MB_OK); return NS_OK; }
Всем привет.
Задача звучит просто. Мне нужно из javascript передать в компоненту XPCOM строку. Делаю так:
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); const cid = "@mydomain.com/XPCOMSample/FF_component;1"; obj = Components.classes[cid].createInstance(); obj = obj.QueryInterface(Components.interfaces.FF_component); var MyString = "Test string"; obj.GetDOM(MyString);
Соответственно функция в компоненте выглядит так:
NS_IMETHODIMP FF_component::GetDOM(nsEmbedString *Domstr, PRInt32 *_retval) { return NS_OK; }
Domstr что-то да содержит, ибо там не ноль. Однако любые пляски с бубном вокруг этой штуки не увенчались успехом.
Вопросы:
1. Как сконвертить nsEmbedString во что-то, что похожее на строку, на которую можно посмотреть? В идеале было бы преобразование в stringstream.
2. Возможно есть уже работающая схема передачи параметра из JS в XPCOM?
Спасибо заранее.
Страницы: 1