1

dart2jsChrome 拡張機能のコンパイル済みバージョンを実行すると、次の問題が発生します。

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} によって引き起こされているようです。

4

1 に答える 1

1

Dartium と dart2js にはそれぞれ独自の dart:js の実装がありますが、同じように動作するはずです。この場合、dart2js 実装のバグのように見えます。これは、 がを実装JsObject.jsifyすることになっているためですが、代わりにプレーンを返しているというエラーが表示されます。JsArrayListJsObject

dartbug.com でバグを報告できますか?

于 2014-02-24T04:18:06.670 に答える