构建chrome扩展时Dartium和dart2js之间的区别

时间:2014-02-23 23:35:58

标签: dart dart-js-interop

运行我的chrome扩展程序的dart2js编译版时,我遇到以下问题:

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(Da​​rtium)上运行时:

main():...
testJsList(): jsList = [aaa, bbb]
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
bbb

在Chrome上运行时(dart2js - &gt; V8):

main():...
testJsList(): jsList = aaa,bbb
testJsList(): ['aaa', 'bbb'] = [aaa, bbb]
Uncaught TypeError: Object #<JsObject> has no method 'where$1'

显然Dart VM对JS Interop的处理方式与编译的javascript略有不同。 jsList的打印方式不同,第二种情况是“错误”类型的'jsList'。

<小时/> 的更新 它看起来问题是由trio {dart:js,dart2js,chrome API}引起的,因为adhoc创建的JsObject在Dartium和dart2js场景中都正常工作。

1 个答案:

答案 0 :(得分:1)

Dartium和dart2js各自都有自己独立的dart:js实现,但它们的行为应该相同。在这种情况下,它看起来像是dart2js实现中的一个错误,因为JsObject.jsify应该返回实现JsArray的{​​{1}},但错误表明它返回了一个普通的List而不是。

你能在dartbug.com上提交一个错误吗?