如何在 Chrome 浏览器和 PNaCl 插件之间正确传递 JavaScript 函数

How to pass JavaScript function between Chrome browser and PNaCl plugin correctly

我写了一个简单的回显器 PNaCl 插件,它的消息处理程序只是 post 传入的消息没有改变:

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

并且,在JavaScript这边,我post一条消息,它的数据是一个函数,希望得到相同的函数并执行响应的函数:

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、[=的对象19=],等等

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

抱歉,这不可能。可以通过 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(或这些的某种组合)。

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