> Yes, certainly. I assume it means LGTM from you. :) Thanks!
> > Since I'm neither architect nor owner, you need to get LGTMs from them :-) Ping @Halton for extension, @Lin for Android and @Alexis for overall. Please take a look. Thanks, -ningxin > > On 7/17/15 17:44 , "Hu, Ningxin" <ningxin...@intel.com> wrote: > > >Hi Zhenyu, > > > >> > >> My suggestion is to introduce a new version of current messaging > >>interface instead of a whole new interface. > >> > >> struct XW_MessagingInterface_2 { > >> > >> void (*Register)(XW_Extension extension, XW_HandleMessageCallback > >> handle_message); > >> void (*PostMessage)(XW_Instance instance, const char* message); > >> > >> void (*RegisterBinaryMessageCallback)(XW_Extension extension, > >> XW_HandleBinaryMessageCallback handle_message); > >> void (*PostBinaryMessage)(XW_Instance instance, const char* > >> message, const size_t size); }; > >> > > > >Thanks for your suggestion. > > > >XW_MessagingInterface_2 looks better than > >XW_BinaryMessagingInterface_1, as the binary messaging API is an > >enhancement to the async messaging interface. And it looks consistent to > Java API proposal. > > > >I will integrate this change into my design. > > > >With this change, does it look good you? > > > >Thanks, > >-ningxin > > > >> Thanks, > >> > >> Zhenyu > >> > >> On 7/16/15 15:25 , "Hu, Ningxin" <ningxin...@intel.com> wrote: > >> > >> >Intent to Implement: Binary Messaging Interface for Crosswalk > >> >External Extension > >> > > >> >Description: > >> >Today's Crosswalk external extension API only provides text based > >> >messaging interface. However, coming use cases require the external > >> >extension native code to exchange binary data with JavaScript code. > >> >For example, an external extension wants to transfer the images > >> >stream from native to JavaScript in real-time (30FPS at least). With > >> >today's external extension messaging API, the extension has to > >> >encode the binary image data into text in native first, posts to > >> >JavaScript and then decodes from the text to binary data in > >> >JavaScript. The encoding, decoding (in > >> >JavaScript!) and increased message size leads to low performance. > >> >Experiment shows by using base64 to transfer VGA (640x480) images, > >> >this approach can only deliver less 10 FPS on mainstream PC. > >> >The binary messaging interface is proposed to added into Crosswalk > >> >external extension API. It allows native code to exchange binary > >> >data (a byte array) to JavaScript without unnecessary > encoding/decoding. > >> >JavaScript receives an ArrayBuffer object and can access the binary > >> >data via different Typed Array View. Vice versa, JavaScript can send > >> >the binary data in an ArrayBuffer object to native, native code > >> >receives a byte array. > >> >Prototype shows 3X-8X (binary messaging vs. text messaging) > >> >performance speedup when transferring different size of data on both > >> >PC and mobile device. Initial data shows with binary messaging > >> >interface, an external extension is able to transfer VGA images at > 60FPS on PC. > >> > > >> >Affected component: Crosswalk External Extension > >> > > >> >Related feature: > >> >https://crosswalk-project.org/jira/browse/XWALK-4615 > >> > > >> >Target release: Crosswalk-17 > >> > > >> >Implementation details: > >> >1. Interface change: > >> >For Crosswalk External Extension C API, a new interface > >> >XW_BinaryMessagingInterface_1 will be added. To keep API and ABI > >> >compatibility with existing external extension, a new file > >> >(extensions/public/XW_Extension_BinaryMessage.h) will be added to > >> >contain the XW_BinaryMessagingInterface_1 interface. The > >> >XW_BinaryMessagingInterface_1 looks like: > >> > > >> >//////////////////////////////////////////////////////////////////// > >> >/// > >> >/// > >> >///////////////// > >> >#ifdef __cplusplus > >> >extern "C" { > >> >#endif > >> > > >> >#define XW_BINARY_MESSAGING_INTERFACE_1 > "XW_BinaryMessagingInterface_1" > >> >#define XW_BINARY_MESSAGING_INTERFACE > >> >XW_BINARY_MESSAGING_INTERFACE_1 > >> > > >> >typedef void (*XW_HandleBinaryMessageCallback)(XW_Instance instance, > >> > > >> > const char* message, > >> > > >> > const size_t size); > >> > > >> >struct XW_BinaryMessagingInterface_1 { > >> > void (*Register)(XW_Extension extension, > >> > XW_HandleBinaryMessageCallback > >> >handle_message); > >> > > >> > void (*PostMessage)(XW_Instance instance, const char* message, > >> >const size_t size); }; > >> > > >> >typedef struct XW_BinaryMessagingInterface_1 > >> >XW_BinaryMessagingInterface; > >> > > >> >#ifdef __cplusplus > >> >} // extern "C" > >> >#endif > >> >//////////////////////////////////////////////////////////////////// > >> >/// > >> >/// > >> >//////////////// > >> > > >> >If the C extension wants to use binary messaging, it needs to query > >> >the "XW_BinaryMessagingInterface_1" interface and use the > >> >PostMessage method to post binary data to JavaScript. On other hand, > >> >it needs to register a XW_HandleBinaryMessageCallback to receive > >> >binary data from > >> JavaScript. > >> > > >> >For Crosswalk external extension Android Java API, two methods will > >> >be added into XWalkExtensionClient interface: > >> > > >> >//////////////////////////////////////////////////////////////////// > >> >/// > >> >/// > >> >/////////////// > >> > > >> >public void onBinaryMessage(int extensionInstanceID, byte[] > >> >message); > >> > > >> >public final void postBinaryMessage(int instanceID, byte[] message); > >> > > >> >//////////////////////////////////////////////////////////////////// > >> >/// > >> >/// > >> >////////////// > >> > > >> >Java extension which inherits XWalkExtensionClient can use > >> >postBinaryMesssage to post binary data to JavaScript and implements > >> >onBinaryMessage to receive binary data from JavaScript. > >> > > >> >No new APIs will be added into Crosswalk extension JavaScript API. > >> >When native external extension posts binary message, the JavaScript > >> >message listener receives an ArrayBuffer object. > >> >When JavaScript invokes extension.postMessage with an ArrayBuffer > >> >object as argument, the native binary message listener is invoked. > >> > > >> >This proposal doesn't cover binary messaging support in SyncMessage, > >> >as there is no obvious use case. > >> > > >> >Sample code: > >> >An external extension wants to transfer image data to JavaScript. To > >> >transfer structured data, the extension can use simple custom binary > >> >message format as this sample shows. Or it can leverage more > >> >sophisticated binary format, e.g. Google's Protocol Buffer > >> >(https://developers.google.com/protocol-buffers/). > >> >C++: > >> >//////////////////////////////////////////////////////////////////// > >> >/// > >> >/// > >> >///////////// > >> >// image binary format > >> >// uint32_t width; > >> >// uint32_t height; > >> >// char data[width * height * 4]; > >> > > >> >static const XW_BinaryMessagingInterface* g_binary_messaging = > >> > get_interface(XW_BINARY_MESSAGING_INTERFACE); > >> >..... > >> >size_t buffer_size = sizeof(uint32_t) + sizeof(uint32_t) + > >> >width*height*4*sizeof(char); > >> >char* buffer = new char[buffer_size ]; > >> >uint32_t* uint32_array = reinterpret_cast<uint32_t*>(buffer); > >> >uint32_array[0] = image.width(); > >> >uint32_array[1] = image.height(); > >> >char* data = buffer + 2 * sizeof(uint32_t); > >> >image.CopyImageData(data); g_binary_messaging->postMessage(instance, > >> >buffer, buffer_size); delete[] buffer; > >> >//////////////////////////////////////////////////////////////////// > >> >/// > >> >/// > >> >///////////// > >> > > >> >JavaScript: > >> >//////////////////////////////////////////////////////////////////// > >> >/// > >> >/// > >> >///////////// > >> >extension.setMessageListener(function(msg) { > >> > if (msg instaceof ArrayBuffer) { > >> > var uint32_view = new Uint32Array(msg); > >> > var width = uint32_view[0]; > >> > var height = uint32_view[1]; > >> > var data = new Uint8Array(msg, 8, width*height*4); > >> > .... > >> > } > >> >} > >> >//////////////////////////////////////////////////////////////////// > >> >/// > >> >/// > >> >//////////// > >> > > >> >Details: > >> >It doesn't require to modify Crosswalk Core Extension code > >> >(XWalkExtensionModule), as V8ValueConverter already supports to > >> >convert a base::BinaryValue object to V8 ArrayBuffer object and vice > versa. > >> > > >> >It mainly requires to modify the external extension components, to > >> >expose the binary interface and convert the binary data to > >> >base::BinaryValue and vice versa. > >> > > >> >For C external extension, files to be modified: > >> >extensions/common/xwalk_external_adapter.cc > >> >extensions/common/xwalk_external_adapter.h > >> >extensions/common/xwalk_external_extension.cc > >> >extensions/common/xwalk_external_extension.h > >> >extensions/common/xwalk_external_instance.cc > >> >extensions/common/xwalk_external_instance.h > >> >extensions/extensions.gyp > >> > > >> >new file: > >> >extensions/public/XW_Extension_BinaryMessage.h > >> > > >> >For Java external extension, files to be modified: > >> >app/android/runtime_client/src/org/xwalk/app/runtime/extension/XWalk > >> >Cor > >> >eEx > >> >tensionBridge.java > >> >app/android/runtime_client/src/org/xwalk/app/runtime/extension/XWalk > >> >Ext > >> >ens > >> >ionClient.java > >> >app/android/runtime_client/src/org/xwalk/app/runtime/extension/XWalk > >> >Ext > >> >ens > >> >ionContextClient.java > >> >app/android/runtime_client/src/org/xwalk/app/runtime/extension/XWalk > >> >Run > >> >tim > >> >eExtensionBridge.java > >> >app/android/runtime_client/src/org/xwalk/app/runtime/extension/XWalk > >> >Run > >> >tim > >> >eExtensionManager.java > >> >extensions/android/java/src/org/xwalk/core/internal/extensions/XWalk > >> >Ext > >> >ens > >> >ionAndroid.java > >> >extensions/common/android/xwalk_extension_android.cc > >> >extensions/common/android/xwalk_extension_android.h > >> >runtime/android/core_internal/src/org/xwalk/core/internal/XWalkExten > >> >sio > >> >nIn > >> >ternal.java > >> > > >> > > >> >Thanks, > >> >-ningxin > >> > > >> >_______________________________________________ > >> >Crosswalk-dev mailing list > >> >Crosswalk-dev@lists.crosswalk-project.org > >> >https://lists.crosswalk-project.org/mailman/listinfo/crosswalk-dev > > _______________________________________________ Crosswalk-dev mailing list Crosswalk-dev@lists.crosswalk-project.org https://lists.crosswalk-project.org/mailman/listinfo/crosswalk-dev