【问题标题】:Unable to pass integer from javascript to npapi plugin无法将整数从 javascript 传递给 npapi 插件
【发布时间】:2012-08-29 06:55:51
【问题描述】:

我正在编写一个简单的 napapi 插件,我必须在其中打印从 html 页面中的 javascript 函数传递的值。但是我在这样做时遇到了问题。它在Firefox上正常工作。但我想在 qt fancybrowser 示例中执行此操作。无论我在 javascript 代码中传递什么值,打印的值始终为 0。

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 的值。

欢迎任何建议/cmets

提前致谢

【问题讨论】:

    标签: javascript npapi qtwebkit browser-plugin


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      从这里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
      

      在 web 上(来自 javascript)我对传递给插件的所有 int 值使用 parseInt(myVal,10)。在 Google Chrome 和 Safari 上查看。

      【讨论】:

      • 这不是错误,Javascript 不区分 int/float 和 NPAPI 也没有在这里定义某种行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2013-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多