2012-08-29 2 views
1

HTML 페이지의 자바 스크립트 함수에서 전달 된 값을 인쇄해야하는 간단한 napapi 플러그인을 작성했습니다. 그러나 나는 그것을하는 동안 문제에 직면하고있다. 파이어 폭스에서 제대로 작동합니다. 하지만 Qt fancybrowser 예제에서이 작업을 수행하려고합니다. 인쇄 된 값은 자바 스크립트 코드에서 전달하는 값이 무엇이든 관계없이 항상 0입니다.자바 스크립트에서 npapi 플러그인에 정수를 전달할 수 없습니다.

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

실제로는 (100)을 출력한다 : 다음

..... 
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); 
} 
...... 

출력은 다음과 같이

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

플러그인 코드는 다음과 같이

자바 스크립트 코드는 이 값은 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 

웹에서 (javascript) 나는 플러그인에 전달 된 모든 int 값에 대해 parseInt (myVal, 10)를 사용합니다. Chrome 및 Safari에서 확인하세요.

+1

이것은 버그가 아니며 Javascript는 int/float와 NPAPI가 특정 동작을 정의하지 않았 음을 구분하지 않습니다. –

1

NPAPI 메서드에 숫자 인수를 제공하는 경우 Int32 또는 Double 변형을 받을지 여부는 정의되지 않으므로 코드에서 두 경우를 모두 처리해야합니다.
또한 NPVARIANT_TO_* 매크로는 각각의 값만 추출합니다. 변환은 수행하지 않습니다.

숫자 인수에서 정수를 추출하려면 코드를 직접 작성해야합니다. something :

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; 
}