Здравствуйте. Подскажите пожалуйста, как можно обращаться к DOM модели html страницы в NPAPI плагине. Например, мне надо в плагине найти какой то определенный элемент страницы, как это сделать?

Хм, типа так?

Правильно ли я понимаю, что это будет совместимо только с ff ? Например, для Chrome работать не будет?
Нашел на одном форуме :

The API to use is called NPRuntime, it's part of NPAPI. Reference is at https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins

Getting a hold of DOM is described under 'accessing browser objects from a plugin', and boils down to calling NPN_GetValue with NPNVWindowNPObject as the variable. You get back the window object and then you can get anything you want from there - e.g. call NPN_GetProperty to get the document, then call NPN_Invoke on the document to invoke getElementById.

Только я очень плохо знаком еще с NPAPI и  что то у меня не получается это реализовтаь. Не мог бы кто нибудь написать эти 3 строчки кода, чтобы они правильно работали?

int0 пишет

Правильно ли я понимаю, что это будет совместимо только с ff ? Например, для Chrome работать не будет?

Нет. Все браузеры за исключением IE поддерживают технологию NPRuntime.

Приблизительный код на Delphi:

Выделить код

Код:

function GetElementByID(id: string): PNPObject;
var
  window: PNPObject;
  vr1, vr2: TNPVariant;
begin
  NPP_GetValue(Instance, NPNV_WINDOW_NPOBJECT, @window);
  NPN_GetProperty(Instance, window, NPN_GetStringIdentifier('document'), @vr1);
  STRINGZ_TO_NPVARIANT(id, vr2);
  NPN_Invoke(GetInstance, vr1.objectValue, NPN_GetStringIdentifier('getElementById'), @vr2, 1, vr1);
  Result := vr1.objectValue;
end;

Только нужно не забыть освободить объект после использования.

Спасибо, тут действительно "приблизительный код" =) но он все равно мне очень помог. Делаю так

Выделить код

Код:

NPVariant vr,vr2;
STRINGZ_TO_NPVARIANT("style",vr);
npnfuncs->invoke(inst,document,npnfuncs->getstringidentifier("getElementsByTagName"),&vr,1,&vr2);

В vr2 теперь поидее содержится массив объектов,но как с ним работаь, например, чтобы узнать размер массива?В js сделал бы так

Выделить код

Код:

var arr = document.getElementsByTagName('style');
var size = arr.length;

В vr2 теперь поидее содержится массив объектов,но как с ним работаь, например, чтобы узнать размер массива?

Тут все аналогично.
length - свойство объекта-массива (получить можно через NPN_GetProperty)
items(i) - метод с одним параметром (через вызов NPN_Invoke)