Невозможно передать целое число из javascript в плагин npapi

Я пишу простой плагин для напапи, в котором мне нужно напечатать значение, переданное из функции javascript, на html-странице. Но я сталкиваюсь с проблемой, делая это. На фаерфоксе работает нормально. Но я хочу сделать это на примере qt fancybrowser. Выводимое значение всегда равно 0, независимо от того, какое значение я передаю в коде javascript.

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

<html>
.....
<script>
function process_data()
{
    PluginObject = document.getElementById("Object");
    var i =100;
    if(PluginObject){
        ret = PluginObject.process_Data(i); 
    }
}
</script>
....
</html>

Код плагина следующий:

.....
bool ScriptableObject::process_Data(const NPVariant* args, uint32_t argCount, NPVariant* result)
{
    printf(" process_Data\n");
    printf("\t argCount : %d\n",argCount);

    int tempi =args[0].value.intValue; 
    int tempf =args[0].value.doubleValue; 

        printf("type: %d type: %u\n",args[0].type,args[0].type);
    printf("tempi : %d tempf : %f\n",tempi,tempf);
}
......

Результат выглядит следующим образом:

process_Data
     argCount : 1
type: 4 type: 4
tempi : 0 tempf : 0.000000

На самом деле он должен напечатать 100, что является значением, переданным в var i из javascript.

Любые предложения/комментарии приветствуются

заранее спасибо


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


Ответы (2)


При предоставлении числового аргумента методу NPAPI не определено, получите ли вы вариант Int32 или Double, поэтому вам придется обрабатывать оба случая в своем коде.
Кроме того, макросы NPVARIANT_TO_* извлекают только соответствующее значение, а не не делать никаких преобразований.

Чтобы извлечь целое число из любого числового аргумента, вы должны написать свой собственный код, например. что-то типа:

bool convertToInt(const NPVariant& v, int32_t& out) {
  if (NPVARIANT_IS_INT32(v)) {
    out = NPVARIANT_TO_INT32(v);
    return true;
  }

  if (NPVARIANT_IS_DOUBLE(v)) {
    out = NPVARIANT_TO_DOUBLE(v);
    return true;
  }

  // not a numeric variant
  return false;
}
person Georg Fritzsche    schedule 02.02.2013

Отсюда http://code.google.com/p/chromium/issues/detail?id=68175 и здесь https://bugs.webkit.org/show_bug.cgi?id=49036 Я понимаю, что это ошибка в WEB-ките, поэтому добавляю в "npruntime.h":

#define FIX_WEB_KIT_INT32_BUG

#ifdef FIX_WEB_KIT_INT32_BUG
    #define NPVARIANT_IS_INT32(_v)   ((_v).type == NPVariantType_Int32 || (_v).type == NPVariantType_Double)
    #define NPVARIANT_TO_INT32(_v)   ((_v).type == NPVariantType_Double ? (_v).value.doubleValue : (_v).value.intValue)
#else
    #define NPVARIANT_IS_INT32(_v)   ((_v).type == NPVariantType_Int32)
    #define NPVARIANT_TO_INT32(_v)  (_v).value.intValue)
#endif

в Интернете (из javascript) я использую parseInt (myVal, 10) для всех значений int, которые передаются плагину. Проверьте это в Google Chrome и Safari.

person Andrew Stivenson    schedule 24.10.2012
comment
Это не ошибка, Javascript не различает int/float, и NPAPI также не определяет здесь определенное поведение. - person Georg Fritzsche; 02.02.2013