3

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

Uncaught TypeError: undefined is not a function

実行時

  context['chrome']['runtime']['onConnect'].callMethod('addListener', [(port) { ... }]);

おそらく原因を指摘する例を作成しました:

background.dart

import 'dart:js';

void main() {
  print("main(): context['chrome']['runtime']['onConnect'] (${context['chrome']['runtime']['onConnect'].runtimeType}): ${context['chrome']['runtime']['onConnect']}");
}

Dartium で印刷:

main(): context['chrome']['runtime']['onConnect'] (JsObject): [object Object]

しかしChromeでは:

main(): context['chrome']['runtime']['onConnect'] (Event): Instance of 'Event'

Chrome 拡張機能をビルドするときの Dartium と dart2js の違い( https://code.google.com/p/dart/issues/detail?id=17086 )に関連していますか?

chrome.runtime.onConnectDartium と Chrome の両方で機能するリスナーを登録する方法を提案できますか?

4

1 に答える 1

3

パッケージを見た後common.dartchrome.dart

void _ensureHandlerAdded() {
  if (!_handlerAdded) {
    // TODO: Workaround an issue where the event objects are not properly
    // proxied in M35 and after.
    var jsEvent = _api[_eventName];
    JsObject event = (jsEvent is JsObject ? jsEvent : new JsObject.fromBrowserObject(jsEvent));
    event.callMethod('addListener', [_listener]);
    _handlerAdded = true;
  }
}

で動作させるにはラップEventする必要があるようです。JsObjectdart:js

以下についても同じことが必要でした。

  • port.onDisconnect
  • port.onMessage

この問題を追跡する既存の問題を誰かが知っている場合は、遠慮なく追加してください。

于 2014-08-12T17:23:24.153 に答える