1.关于 ppapi


  Chrome 浏览器对插件的支持,35 版是个分水岭,35版前,它支持 Mozilla npapippapi (Pepper Plugin API) 二种插件协议, 硕正套件一直是通过实现其中的 npapi 在 Chrome 浏览器中展现产品功能的。
  Chrome 从 35 版开始,已不再支持 npapi。
  硕正软件在 106 企业版中,终于实现了 ppapi 接口协议, 同时仍保留了对 npapi 的支持,使用老版本的 Chrome 和 360浏览器极速模式的用户,页面源码无需做改动。
  硕正软件 107 版作了进一步完善,通过 dynaload.js 再封装, 实现了对 ppapi 语法的全兼容。

  ppapi 和 npapi 有几个不同之处,首先它是需要手工下载 exe 安装的, 安装包或正版用户安装包制作工具在 www.supcan.cn 的下载区中。安装程序将在桌面和开始菜单建立新的命令行快捷:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --register-pepper-plugins="C:\Program Files\Supcan\supcan.dll;application/x-ppapi-supcan" --no-sandbox --test-type
  通过该命令行启动 Chrome, 才能让 Chrome 启用硕正 ppapi 插件。

  其次,ppapi 的原始 js 语法也和 npapi 不同,如下是简单例子:
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=gb2312">
<script>
 //document加载完毕的事件
 document.addEventListener("DOMContentLoaded", addListener, false);
 function addListener() {  //为 object 添加事件侦听
  AF.addEventListener('message', handleMessage, false);
 }
 
 //object 的事件侦听入口
 function handleMessage(message) {
  if(message.data.name == "OnReady") { //OnReady 事件: 执行 ppapi 对象的函数
   AF.postMessage(['SetSource', 'reportdata/datacenter.xml']);
   AF.postMessage(['Build', 'report/htmltable4.xml']);
  }
  else if(message.data.name == "OnEvent" && message.data.event == "DblClicked") {
   var p1 = message.data.p1;
   var p2 = message.data.p2;
   alert("鼠标双击在: " + p1 + "," + p2 + " (行,列)");
  }
 }
</script>
</head>
<body>
 <object id="AF" type="application/x-ppapi-supcan" Width="800px" height="500px" core="pure" >
   <param Name="CtlName" Value="BCV1.TreeList">
   <param ...(略) >
 </object>
</body>
</html>

  在这例子中, 这一行表示为 AF 增加一个事件侦听的回调函数,其实这是 HTML5 的语法, handleMessage是回调函数名,函数名可以任意定义。
#8#AF.addEventListener('message', handleMessage, false);

  再来看看 handleMessage( message ) 函数,里面有我们熟悉的 OnReady、OnEvent, 这些都是事件,无非是合并在同一个回调函数中罢了。

  第 14、15 行的 AF.postMessage( ) 就是插件的函数了,相当于是 npapi、IE 下的 func( ), 它表示把一个 json 对象以消息的方式抛给插件,插件收到后异步执行.
  当然, ppapi 也有一个同步函数 AF.postMessageAndAwaitResponse( ), 它可以让线程等待、同步返回函数执行结果, 比如在 IE、npapi 开发中,常见的取得报表总行数的语句:
var rows = AF.func("GetRows", "");
  在 ppapi 中,应该写成:
var rows = AF.postMessageAndAwaitResponse(["GetRows", ""]);
  Google ppapi 协议中访问插件的通道只有 postMessage( ) 和 postMessageAndAwaitResponse( ) 这二种.


360浏览器的极速模式其实就是 Chrome 内核,它所采用的 Chrome 源码版本并不低,为什么还能支持 npapi? 因为 Chrome 的源码是支持 npapi 的,但 Google 公司认为 npapi 不安全,故在其自己打包的 Google Chrome 浏览器中直接禁用 .