Обработка массива плагинов npapi webkit

Я хочу обработать массив из java-скрипта. (т. е. из html-страницы в код плагина. Я хочу получить значения из html-кода в переменные в плагине, чтобы я мог изменять их в коде и обрабатывать для какой-либо другой цели.).

Но я столкнулся с проблемой в этом. Я знаю, что внутри массив будет обрабатываться как NPObject. Я пытаюсь получить длину массива и элементы массива из этого NPObject, но возвращаемая длина массива равна нулю, даже если массив имеет ненулевую длину.

Любые предложения приветствуются....

У меня есть html-страница с массивом. HTML-страница выглядит следующим образом:

<html>
<script type="text/javascript">
var arrayData = [9,1,2,3,4,5,6,7,8,9];
function handleEvent(e) {
    if (e.keyCode == 55) {
        document.getElementById('arrayint_ele_disp').innerHTML = arrayData;
        process_intarray(arrayData);
    }
}
function  process_intarray(arrayData){
    obj = document.getElementById("Obj");
    if(obj){
        obj.process_array_intval(arrayData); 
    }
}
</script>

<body onload="init()" onkeydown="handleEvent(event)">
<div id ="arrayint_ele_disp" style="position:absolute;left:100px;top:250px"> 
ARRAY_INT VAL </div>
</body>

</html>

Код моего плагина для обработки элементов массива выглядит следующим образом:

bool ScriptableObject::process_intarray(const NPVariant* args, uint32_t 
     argCount, NPVariant* result)
{

    //Get the Length of the array
    //NPObject *inobject = args[0].value.objectValue;
    NPObject *inobject = args->value.objectValue;

    bool bRetval = false;
    NPVariant npvlength;
    //NPIdentifier id;

    bRetval = 
   NPN_GetProperty(m_npp,inobject,NPN_GetStringIdentifier("length"),&npvlength);
    printf("\n NPN_GetProperty length type %d value : %d\n"
  ,npvlength.type,npvlength.value.intValue);

    //Get the array elements
    int i = 0;
    for(i = 0; i < npvlength.value.intValue; i++)
    {
        NPVariant CurVal;
        NPN_GetProperty(m_npp,inobject,NPN_GetIntIdentifier(i),&CurVal);
        m_prop_array_intval[i] = CurVal.value.intValue;
    }
    return true;

}

Вот в этой функции NPN_GetProperty(m_npp,inobject,NPN_GetStringIdentifier("length"),&npvlength); возвращает истину.

Но при проверке длины npvlength он дает 0 и его тип как NPVariantType_Double. Я не могу понять, почему..

Любые предложения приветствуются...


person Techtotie    schedule 30.07.2012    source источник


Ответы (1)


Вы не должны полагаться на числа, являющиеся одним из Int32 или Double. Если тип чисел двойной, используйте value.doubleValue для получения длины, иначе вы получите неожиданные значения (из-за того, что value является union и, следовательно, doubleValue и intValue ссылаются на одну и ту же память).
В идеале напишите себе вспомогательные функции для преобразований, чтобы вы не нужно беспокоиться о конкретных NPVariantType везде.

Также вы должны кэшировать NPIdentifiers: в худшем случае NPN_Get*Identifier() может привести к полному межпроцессному обмену от процесса плагина к процессу браузера и обратно, в дополнение к затратам на сравнение строк/хеширование/...

person Georg Fritzsche    schedule 30.07.2012
comment
Привет, Джордж. Спасибо за предложение... Я также пробовал npvlength.value.doubleValue, но он по-прежнему равен нулю. а элементы массива являются целыми числами, поэтому я использовал npvlength.value.intValue... Любые другие предложения... - person Techtotie; 30.07.2012
comment
@user1523492: user1523492: На всякий случай, вы также изменили свои операторы printf(), чтобы использовать %f вместо %d? - person Georg Fritzsche; 30.07.2012
comment
@ user1523492: Рад это слышать. Кстати, если ответ решил вашу проблему, вы можете его принять. - person Georg Fritzsche; 30.07.2012