如何正确地在Chrome浏览器和PNaCl插件之间传递JavaScript功能

时间:2015-06-11 16:54:43

标签: javascript google-chrome google-nativeclient ppapi

我写了一个简单的echoer PNaCl插件,其消息处理程序只是将传入的消息更改为:

class Instance : public pp::Instance {
public:
    virtual void HandleMessage(const pp::Var& message_data) {
        PostMessage(message_data);
    }
};

而且,在JavaScript方面,我发布了一条消息,其数据是一个函数,期望得到相同的函数并执行响应函数:

var funcobj = {
    tocall: function() { alert('tocall called'); }
}
document.getElementById('echoFunc').addEventListener('click', function() {
    console.log(funcobj);
    // Post a function to plugin
    common.naclModule.postMessage(funcobj);
});
function handleMessage(message_event) {
    console.log(message_event);
    message_event.data.tocall();
}

很遗憾,在handleMessage()中,message_event.data.tocall()不再是一个函数,而是一个包含字段defineGetterdefineSetterlookupGetter,{{1}的对象等等。

如何通过PPAPI正确地在Chrome浏览器和PNaCl插件之间传递JavaScript功能?

1 个答案:

答案 0 :(得分:1)

抱歉,这是不可能的。可以通过PostMessage在JavaScript和Native Client之间传递的唯一值在此处定义:https://developer.chrome.com/native-client/pepper_stable/c/group___enums#ga9815041477d810724e44da862f9852ed

即:undefined,null,Bool,Number,String,Array,Dictionary,ArrayBuffer和Resource(或其中某些组合)。

对象列在该文档中,但不受支持。 Dictionary就像一个JSON对象;它只是一个字符串值映射。资源当前仅支持FileSystem对象。