dart2js
Chrome 拡張機能のコンパイル済みバージョンを実行すると、次の問題が発生します。
Uncaught TypeError: Object #<JsObject> has no method 'where$1'
最小限の例を作成しました:
background.dart
import 'dart:js';
void main() {
print("main()...");
context['js_list'] = new JsObject.jsify(["aaa", "bbb"]);
}
popup.dart
import 'dart:js';
var backgroundPage = context["chrome"]["extension"].callMethod("getBackgroundPage", []);
void main() {
print("main():...");
testJsList(backgroundPage['js_list']);
}
testJsList(List<String> jsList) {
print("testJsList(): jsList = $jsList");
print("testJsList(): ['aaa', 'bbb'] = ${new JsObject.jsify(['aaa', 'bbb'])}");
jsList.where((e) => e == "bbb").forEach(print);
}
Chromium (Dartium) で実行する場合:
main():...
testJsList(): jsList = [aaa, bbb]
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
bbb
Chrome で実行する場合 (dart2js -> V8):
main():...
testJsList(): jsList = aaa,bbb
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
Uncaught TypeError: Object #<JsObject> has no method 'where$1'
明らかに、Dart VM はコンパイル済みの JavaScript とは少し異なる方法で JS Interop を処理しています。はjsList
異なって出力され、2 番目のケースでは「間違った」タイプの 'jsList' です。
更新: アドホックに作成された JsObject が Dartium と dart2js の両方のシナリオで適切に動作しているため、問題はトリオ {dart:js, dart2js, chrome API} によって引き起こされているようです。