在HTML5越来越普及的情况下,Web引擎通过各自的机制提供了不同的Web API(包括但不限于W3C标准API)给Web应用开发者,开发者可以充分利用这些WebAPI开发出跨平台(基于标准API)的或者功能强大(专有API)的Web应用;但是在某些情况下,开发者为了特殊需求需要开发自己的Web API,对于不同的Web引擎平台,均有各自的Web API扩展机制:
1、WebKitGtk
直截了当:通过JavaScriptCore API创建一个JS对象,并将其绑定到对应的JS Context上。
http://webkitgtk.org/reference/webkitgtk/stable/WebKitWebFrame.html#webkit-web-frame-get-global-context
http://webkitgtk.org/reference/webkitgtk/stable/webkitgtk-webkitwebview.html#WebKitWebView-window-object-cleared
2、QtWebKit
QtWebKit Bridge:通过扩展JS环境的方式来访问native对象(即QObject);这种方式实际上利用了GNOME的GObject Introspection/GI对象模型,可以很容易的与JS的动态环境集成,如直接将QObject的属性映射为JS对象的属性;这个应该和firefox的XPCOM机制差不多。
http://qt-project.org/doc/qt-4.8/qtwebkit-bridge.html
3、Android WebView
addJavaScriptInterface:通过调用Webview提供的addJavaScriptInterface函数将对象注入到页面主frame的JS Context中;并可以通过创建的JavaScriptInterface使Java与JavaScript进行交互。
http://developer.android.com/reference/android/webkit/WebView.html#addJavascriptInterface(java.lang.Object, java.lang.String)
4、CEF3
V8 API:通过对V8引擎API的C++封装实现在C++中操作JS对象。
https://code.google.com/p/chromiumembedded/wiki/JavaScriptIntegration
5、Chrome Extension API
多进程:通过将API操作委托给Browser进程来绕开Renderer进程的沙箱限制;Renderer进程的API调用通过一系列校验后经IPC通信将实际的API调用交由Browser进程实现;实现非常复杂。
https://github.com/crosswalk-project/crosswalk-website/wiki/Overview-of-Chrome-Extension-API-Infrastructure
6、Crosswalk Extension
NPRuntime:基于Chromium,将Renderer进程的API调用委托给Extension进程;类似chromium的extension机制,但是与chromium代码解耦并且添加API更简洁。
https://github.com/crosswalk-project/crosswalk-website/wiki/NPRuntime-Based-WebAPI-Extension-Framework
其他可插拔扩展机制(Plugin)实现比较复杂:
NPAPI、PPAPI、NACL
参考:https://github.com/crosswalk-project/crosswalk-website/wiki/Web-API-Extension-Comparison