Доступ к элементу массива плагина NPAPI из Javascript

Я создал плагин NPAPI и хочу получить доступ к элементу массива в плагине из Javascript. Я использовал следующий javascript:

var foo_plug = document.getElementById('foo');
var elem = foo_plug.array_p[index];
  1. Какие все методы в NPClass вызываются для доступа к элементу массива для кода, показанного выше?
  2. Как мне вернуть значение по индексу массива для плагина NPAPI?
  3. Как индекс массива передается из Javascript в плагин NPAPI?

PS: я получил методы hasProperty и getProperty NPClass, вызываемые при доступе к переменной в плагине, и все работает нормально.


person krishnanunni    schedule 23.10.2012    source источник


Ответы (1)


Первое, что вам нужно понять, это цепочка вызовов. Давайте посмотрим на рассматриваемую строку:

var elem = foo_plug.array_p[index];

Что это собирается сделать, так это сначала вызвать NPN_GetProperty в NPObject для foo_plug с NPIdentifier, который преобразуется в строку «array_p».

Что произойдет дальше, зависит от того, что будет возвращено; если вы возвращаете строку, index будет индексом этой строки. если это int, это даст вам ошибку. Если, с другой стороны, это NPObject, следующим вызовом будет NPN_GetProperty для этого NPObject с NPIdentifier, который будет либо IntIdentifier (используйте NPN_GetIntIdentifier), либо строковым идентификатором с номером в виде строки (используйте NPN_IdentifierIsString, чтобы определить, какой именно) .

Теперь, если возвращаемый NPObject является фактическим массивом javascript, вам не нужно об этом беспокоиться; вы можете получить NPObject для окна и вызвать для него Invoke с идентификатором "Array" и без аргументов, и он вернет NPObject с пустым массивом; вы можете работать с ним, чтобы положить в него вещи и вернуть его, и это будет работать нормально.

В качестве альтернативы вы можете вернуть NPObject, который поддерживает свойство «длина», NPN_Enumerate, и может разумно обрабатывать либо числовой идентификатор строки, либо intidentifier (на самом деле вам нужно обрабатывать оба, потому что некоторые браузеры используют каждый тип), и если он действует достаточно как javascript, вы, вероятно, не заметите разницы.

FireBreath отлично поддерживает все эти параметры.

person taxilian    schedule 24.10.2012