Обход DOM модели.
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Обход 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<nsIDOMDocument> domDocument;
nsCOMPtr<nsIDOMElement> element;
window->GetDocument(getter_AddRefs(domDocument));
|
|
|
RE: Обход DOM модели. - 2009-12-04 18:30:31.920000
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
А сорцы нечитабельны? Это конечно очень вероятно, C++ сорцы этим отличаются, но всё же, загляни в сорцы nss (или xpcom? я не знаю какие библиотеки за что там отвечают), скачай какой-нибудь плугинчик, который обязательно должен делать то, что тебе надо, и посмотри как он это делает. ps. Я никогда не заморачивался на плугины к фф, поэтому ничего конкретного сказать не могу, лишь говорю как бы я действовал, если бы гугл оказался бессилен мне помочь.
|
|
|
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
|
|
|
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<nsIDOMDocument> domDocument;
nsCOMPtr<nsIDOMElement> element;
window->GetDocument( getter_AddRefs( domDocument ) );
nsCOMPtr<nsIDOMNodeList> childNodes;
domDocument->GetChildNodes( getter_AddRefs( childNodes ) );
PRUint32 len;
childNodes->GetLength( &len );
for ( PRUint32 i = 0; i < len; i++ )
{
nsCOMPtr<nsIDOMNode> node;
childNodes->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->HasChildNodes( &hasChild );
if ( hasChild )
{
nsCOMPtr<nsIDOMNodeList> childNodes;
pNode->GetChildNodes( getter_AddRefs( childNodes ) );
PRUint32 len;
childNodes->GetLength( &len );
for ( PRUint32 i = 0; i < len; i++ )
{
nsCOMPtr<nsIDOMNode> node;
childNodes->Item( i, getter_AddRefs( node ) );
// Make a recoursive call
ProcessDOM( node, result );
}
}
nsString text;
pNode->GetNodeName( text );
std::wstring name = reinterpret_cast<const wchar_t *>( text.get() );
pNode->GetNodeValue( text );
std::wstring value = reinterpret_cast<const wchar_t *>( text.get() );
std::wstring res;
res = L"Name: " + name + L"\nValue: " + value + L"\n";
result += res;
}
Если кому-то будет не лень побаловаться - могу скинуть весь код тулбара (там только пару кнопок) с SDK (будет около метра, только не знаю, где лучше расшарить).
|
|
|
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
|
|
|
|
|