Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Обход DOM модели.

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Обход DOM модели.
Имя
Сообщение << Старые топики   Новые топики >>
Обход DOM модели. - 2009-12-04 12:18:24.810000   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Появился нетривиальный для меня таск - написать плагин для FireFox.
Стоит задача обойти DOM страницы используя средства XPCOM на C++.

Гуглил, но не нашёл вразумительных примеров. Возможно кто-то лучше сможет погуглить и ткнуть ссылкой.

Дом получаю без проблем:
NS_IMETHODIMP CXPTestImpl::GetDOM( nsIDOMWindow *domWindow ) { nsIDOMWindow* window = domWindow; nsCOMPtr&lt;nsIDOMDocument&gt; domDocument; nsCOMPtr&lt;nsIDOMElement&gt; element; window-&gt;GetDocument(getter_AddRefs(domDocument));
Post #: 1
RE: Обход DOM модели. - 2009-12-04 18:30:31.920000   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
А сорцы нечитабельны? Это конечно очень вероятно, C++ сорцы этим отличаются, но всё же, загляни в сорцы nss (или xpcom? я не знаю какие библиотеки за что там отвечают), скачай какой-нибудь плугинчик, который обязательно должен делать то, что тебе надо, и посмотри как он это делает.
ps. Я никогда не заморачивался на плугины к фф, поэтому ничего конкретного сказать не могу, лишь говорю как бы я действовал, если бы гугл оказался бессилен мне помочь.
Post #: 2
RE: Обход DOM модели. - 2009-12-04 18:52:39.453333   
Denaturat

Сообщений: 1741
Оценки: 453
Присоединился: 2008-10-27 20:50:06.380000
http://old.nabble.com/cross-platform-coding-td12457819.html
Post #: 3
RE: Обход DOM модели. - 2009-12-07 10:56:51.866666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Я просто догадываюсь, что вопрос из ламерской категории, но почему-то не ищется у меня нужных сорцев ни на сайте мозиллы, ни в гугле =\.

Текущая задача - сделать тулбар наподобие скайповского с возможностью подсветки телефонных номеров на странице.

Необходимо получить DOM именно текущей страницы (обработка смены вкладок - это уже потом). В обработчике клика на кнопку на тулбаре вызываю код (js):
function doXPCOM() { try { const cid = "@findfile/xptest;1"; var obj = Components.classes[cid].createInstance(); obj = obj.QueryInterface(Components.interfaces.IXPTest); // --------------- Вызов ---------------- obj.GetDOM( window ); //...
В данном случае в COM метод передаётся DOM тулбара (как я понял). При обходе получается приблизительно следующий лог (частично):
Name: xml-stуlеshееt Value: href="chrome://browser/content/browser.css" type="text/css" Name: xml-stуlеshееt Value: href="chrome://browser/content/places/places.css" type="text/css" ... Name: keyset Value: Name: key Value: Name: keyset Value: Name: menupopup Value: Name: tooltip Value: Name: panel Value:
Думаю, что надо попробовать взять родителя тулбара и копать уже оттуда, сейчас буду пробовать, но если кто-то вдруг напишет решение до того, как я его найду - буду благодарен.

P.S. ещё почему-то ругается компилятор (msvs 7) при попытке использовать некоторые заголовочные файлы из STL (просто при подключении заголовочных файлов), но это мелочи.

Код обхода DOM-а (C++, за кривоту использования STL не пинайте, это писалось на скорую руку, чисто для быстрого просмотра результата):
NS_IMETHODIMP CXPTestImpl::GetDOM( nsIDOMWindow *domWindow ) { std::wstring result; nsIDOMWindow* window = domWindow; nsCOMPtr&lt;nsIDOMDocument&gt; domDocument; nsCOMPtr&lt;nsIDOMElement&gt; element; window-&gt;GetDocument( getter_AddRefs( domDocument ) ); nsCOMPtr&lt;nsIDOMNodeList&gt; childNodes; domDocument-&gt;GetChildNodes( getter_AddRefs( childNodes ) ); PRUint32 len; childNodes-&gt;GetLength( &len ); for ( PRUint32 i = 0; i &lt; len; i++ ) { nsCOMPtr&lt;nsIDOMNode&gt; node; childNodes-&gt;Item( i, getter_AddRefs( node ) ); ProcessDOM( node, result ); } // Почему-то при подключении fsream вылазят непонятные ошибки =\ FILE *f; f = fopen( "c:\\log.txt", "w" ); fwprintf( f, L"%s", result.c_str() ); fflush( f ); fclose( f ); return NS_OK; } void CXPTestImpl::ProcessDOM( nsIDOMNode *pNode, std::wstring &result ) { PRBool hasChild; pNode-&gt;HasChildNodes( &hasChild ); if ( hasChild ) { nsCOMPtr&lt;nsIDOMNodeList&gt; childNodes; pNode-&gt;GetChildNodes( getter_AddRefs( childNodes ) ); PRUint32 len; childNodes-&gt;GetLength( &len ); for ( PRUint32 i = 0; i &lt; len; i++ ) { nsCOMPtr&lt;nsIDOMNode&gt; node; childNodes-&gt;Item( i, getter_AddRefs( node ) ); // Make a recoursive call ProcessDOM( node, result ); } } nsString text; pNode-&gt;GetNodeName( text ); std::wstring name = reinterpret_cast&lt;const wchar_t *&gt;( text.get() ); pNode-&gt;GetNodeValue( text ); std::wstring value = reinterpret_cast&lt;const wchar_t *&gt;( text.get() ); std::wstring res; res = L"Name: " + name + L"\nValue: " + value + L"\n"; result += res; }
Если кому-то будет не лень побаловаться - могу скинуть весь код тулбара (там только пару кнопок) с SDK (будет около метра, только не знаю, где лучше расшарить).
Post #: 4
RE: Обход DOM модели. - 2009-12-07 18:46:44.996666   
_SaZ_

Сообщений: 4329
Оценки: 398
Присоединился: 2008-01-30 02:18:05.553333
Тема закрыта, irc рулез ;)

https://developer.mozilla.org/En/Code_snippets/Tabbed_browser
Post #: 5
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Обход DOM модели.







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.