Первое, что вам нужно понять, это цепочка вызовов. Давайте посмотрим на рассматриваемую строку:
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