2012-08-29 55 views
1

我正在寫一個簡單的napapi插件,我必須在html頁面中打印從javascript函數傳遞的值。但是我在做這件事的時候遇到了問題。它在Firefox上正常工作。但我想用qt fancybrowser的例子來做。無論我通過javascript代碼傳遞的值是多少,打印的值始終爲0。無法將整數從javascript傳遞到npapi插件

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這是來自javascript的var i中傳遞的值。

任何建議/評論都是提前歡迎

感謝

回答

-1

從這裏http://code.google.com/p/chromium/issues/detail?id=68175這裏https://bugs.webkit.org/show_bug.cgi?id=49036我明白,這是錯誤的網頁工具包,所以我在「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 

on web(from javascript)我使用parseInt(myVal,10)來傳遞給插件的所有int值。在谷歌瀏覽器和Safari上檢查它。

+1

這不是一個錯誤,Javascript不區分int/float和NPAPI沒有在這裏定義一個特定的行爲。 –

1

向NPAPI方法提供數字參數時,不確定您是否會收到Int32Double變體,因此您必須在代碼中處理這兩種情況。
而且,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; 
}