【问题标题】:Difference between Dartium and dart2js when building chrome extensions构建 chrome 扩展时 Dartium 和 dart2js 之间的区别
【发布时间】:2014-02-23 23:35:57
【问题描述】:

在运行我的 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 (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 处理 JS Interop 与编译的 javascript 略有不同。 jsList 的打印方式不同,在第二种情况下是“错误”类型的“jsList”。


更新: 看起来问题是由三个 {dart:js, dart2js, chrome API} 引起的,因为临时创建的 JsObject 在 Dartium 和 dart2js 场景中都可以正常工作。

【问题讨论】:

    标签: dart dart-js-interop


    【解决方案1】:

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

    您可以在 dartbug.com 上提交错误吗?

    【讨论】:

    • dart:js的dart2js版本不是问题吗? Dartium 版本按预期工作。
    • 还没有。我不确定 JsObject.jsify 是否是问题所在。查看我的更新。
    • 哦,这是在 Chrome 应用程序中。是的,这是个问题你有一个来自另一个 JS 上下文的对象,而在 dart2js 中,那些不被识别为 Dart 对象,并且 JS instanceof 检查也不起作用。失败的是检查instanceof Array,因为页面上下文中的Array 函数与后台页面中的Array 函数不同。这是 JS 中一个非常讨厌的部分,对象能够像这样跨上下文泄漏。仍然值得我们的一个错误。至少应该是一致的。
    猜你喜欢
    • 2011-07-17
    • 2011-03-30
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    相关资源
    最近更新 更多