[Android] JavascriptInterface の引数に渡された undefined はどう扱われる?
はじめに
Android 側:
class MyInterface {
@JavascriptInterface
fun greet(name: String?) { ... }
}
JavaScript 側:
myInterface.greet(undefined);
このような場合、Android 側の name: String?
にはどのような値が渡るでしょうか?
結論
引数が、
- Java の byte, char, short, int, long, float, double に相当する型の場合:
0
- Java の boolean に相当する型の場合:
false
- それ以外の場合:
null
が渡ります。
上の例の場合、null
が渡ります。
詳細
Android WebView の document に、WebView#addJavascriptInterface()
や @JavascriptInterface
に関する仕様の記載があります: https://chromium.googlesource.com/chromium/src/+/master/android_webview/docs/java-bridge.md
ここを読むと、
Argument and return values conversions are handled after Sun Live Connect 2 spec.
という記載があります。
Sun Live Connect 2 spec を読んでみると、2.3.7 Null and Undefined Values
というセクションに、JavaScript から引数として渡された null
と undefined
がどのように変換されるのかについての仕様が定義されています: https://www.oracle.com/java/technologies/javase/liveconnect-docs.html#:~:text=String-,2.3.7 Null and Undefined Values,-When the JavaScript
結論に記載した通りの仕様が記載されていることが分かります。
また、内容から Android 側では null
と undefined
を同一視することが分かります。
Discussion