我写了一个简单的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()
不再是一个函数,而是一个包含字段defineGetter
,defineSetter
,lookupGetter
,{{1}的对象等等。
如何通过PPAPI正确地在Chrome浏览器和PNaCl插件之间传递JavaScript功能?
答案 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对象。