The parsing of messages from JS -> Platform is done here: https://github.com/apache/cordova-android/blob/8c8fbc9a50ea23acc25501973a9ad551d68051f8/framework/src/org/apache/cordova/CordovaBridge.java#L133-L137
The construction of response messages from Platform -> JS is done here: https://github.com/apache/cordova-android/blob/8c8fbc9a50ea23acc25501973a9ad551d68051f8/framework/src/org/apache/cordova/NativeToJsMessageQueue.java#L443-L501 The prompt bridge is very very old, and exists because at the time, Android WebView didn't have any APIs for adding JS interfaces either, so intercepting specially-formatted prompt commands was the best option available. On Sat, Jan 17, 2026 at 11:07 AM julio cesar sanchez <[email protected]> wrote: > > Try searching on the mail list, there should be information there. And > probably in JIRA too. > > I’m a little familiar with the addJavascriptInterface bridge, but not with > the prompt bridge, there are several bridges and the prompt bridge was used > in old android versions only and I never looked into it. > > El El sáb, 17 ene 2026 a las 18:28, Niklas Merz <[email protected]> > escribió: > > > Great thank you. This confirms a lot I found during my digging. > > > > You're right I've opted to hack into the prompt method to use it with > > Websockets because this is currently the only thing that's possible with > > Servo. Servo lacks addJavascriptInterface and evaluateJavascript today. > > > > Did you ever find how out how these messages are built? What things like > > "51 S11 Battery..." mean? I suppose "S" is for success but I'll still > > have to figure out how to correctly split and parse these prompt > > messages. > > > > On January 17, 2026, "[email protected]" <[email protected]> > > wrote: > > > I don't think there is any documentation but I've done quite a bit of > > > reverse engineering myself in the past and might be able to loosely > > > explain the architecture. There are 3 classes that are probably of > > > interest to look at in the cordova-android framework: > > > > > > 1. SystemWebChromeClient > > > 2. SystemExposedJsApi > > > 3. CordovaBridge > > > > > > Based on my understanding, SystemWebViewEngine contains the entry > > > point > > > into native side, by using the onJsPrompt hook. This method is > > > normally > > > to handle window.prompt calls but Cordova uses it to deliver a payload > > > to native. The payload is passed to CordovaBridge and it decides if it > > > is a bridge call or if it is a regular window.prompt call. > > > > > > If it is a bridge call, it does some sanity access checks and pushes > > > the messages through a queue system which gets routed to plugins > > > (somehow). > > > > > > SystemExposedJsApi has some JavascriptInterface methods, which are > > > methods exposed directly to the webiew, and JS can call these methods > > > directly which controls bridge state. It also includes a `exec` > > > JavascriptInterface method, which seems to deliver a payload to the > > > bridge, similar to the prompt method. Both of these might be used, and > > > to me it looks like the bridge call implementation strategy might be > > > swapped based on certain conditions. > > > > > > Although based on your log snippets, it seems like it is using the > > > prompt method. > > > > > > Hopefully this at least puts your focus in the right direction. > > > > > > On Sat, 2026-01-17 at 17:45 +0100, Niklas Merz wrote: > > > > Hey everyone, > > > > > > > > As some of you know I'm currently trying out if Servo can be used in > > > > Cordova Android. I've made some good progress on my plugin [1] and > > > > now I > > > > could use some help with getting plugins going. > > > > > > > > If got the bride working with some hacky glue code and now some > > > > messages > > > > like this are exchanged: > > > > > > > > [ServoWS] Call to prompt [] > > > > gap:[1670500204,"Battery","start","Battery1880458036"] servo- > > > > bridge.js > > > > < > > > > <http://localhost:5000/plugins/cordova-plugin-servo- > > > webview/www/servo>- > > > > bridge.js> [ServoWS] Intercepted gap: call [1670500204, "Battery", > > > > "start", "Battery1880458036"] servo-bridge.js > > > > < > > > > <http://localhost:5000/plugins/cordova-plugin-servo- > > > webview/www/servo>- > > > > bridge.js> [ServoWS] Call to prompt [false] > > > > > > > gap:[1670500204,"Geolocation","getPermission","Geolocation1880458037" > > > > ] > > > > servo-bridge.js <<http://localhost:5000/plugins/cordova-plugin- > > > servo>- > > > > webview/www/servo-bridge.js> [ServoWS] Intercepted gap: call > > > > [1670500204, "Geolocation", "getPermission", > > > "Geolocation1880458037"] > > > > servo-bridge.js <<http://localhost:5000/plugins/cordova-plugin- > > > servo>- > > > > webview/www/servo-bridge.js> [ServoWS] Received message: 51 S11 > > > > Battery1880458036 {"level":59,"isPlugged":true}29 S01 > > > > Geolocation1880458037 n36 servo-bridge.js > > > > < > > > > <http://localhost:5000/plugins/cordova-plugin-servo- > > > webview/www/servo>- > > > > bridge.js> > > > > Can someone can point me to any kind documentation on how the plugin > > > > bridge works? I've never looked into the part and if someone has any > > > > info I could save some time digging through the code and reverse > > > > engineering stuff. > > > > > > > > The chances are slim, I know, but maybe there is something out > > > there. > > > > > > > > Cheers, > > > > Niklas > > > > > > > > > > > > [1] <<https://github.com/NiklasMerz/cordova-plugin-servo-webview>> > > > > > > --------------------------------------------------------------------- > > > To unsubscribe, e-mail: [email protected] > > > For additional commands, e-mail: [email protected] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
