Dart chrome扩展:如何在onMessage中发送响应?

时间:2014-03-01 11:54:23

标签: google-chrome-extension dart

现在我正在使用Google的Dart开发Chrome扩展程序。 一切正常,除了onMessage处理。

使用的Chrome包:API Ref.OnMessageEvent Ref.

在后台脚本中我打电话:

import 'package:chrome/chrome_ext.dart' as chrome;


void main() {
  //...
  //Binde event-listeners
  chrome.runtime.onMessage.listen(onMessage);
  //...
}

/**
 * Message event handling
 */
bool onMessage(chrome.OnMessageEvent messageEvent){

  JsObject message = messageEvent.message;
  JsFunction response = messageEvent.sendResponse;

  switch(message['action']){

    //...

    //Used by popup
    case 'refresh':
      print('Refresh called!');
      chrome.storage.sync.get().then((_){
        new JsObject(response, [new JsObject.jsify({'done': true})]);
      });

      //Idicate to send a response asynchronously (So it's said in the OnMessageEvent Ref.)
      return true;

    //...
  }

  return false;
}

我的弹出脚本如下所示:

//...
chrome.runtime.sendMessage({
  'action': "refresh"
}).then((_){
  print('receiving response!');
});
//...

正在运作: 消息'刷新'从弹出脚本发送到后台脚本工作! 后台脚本打印Refresh called!

无效: 弹出脚本永远不会收到后台脚本调用的响应:new JsObject(response, [new JsObject.jsify({'done': true})]);

我不知道如何发送sendResponse来真正发送回复。也许我对JsObject的调用是错误的?希望别人可以提供帮助。 (顺便说一下,非异步响应也不起作用)


此问题也在github.com/dart-gde/chrome.dart上打开。

1 个答案:

答案 0 :(得分:3)

您的问题可能与您尝试发送回复的方式有关:

new JsObject(response, [new JsObject.jsify({'done': true})]);

根据dart.js文档,在您的情况下应该调用函数,如:

response.apply([new JsObject.jsify({'done': true})]);

更新:这里是工作代码:

background.dart

import 'dart:js';

void main() {
  print("main()...");
  context['chrome']['runtime']['onMessage'].callMethod('addListener', [onMessageListener]);
}

void onMessageListener(request, sender, sendResponse) {
  print("received action = ${request['action']}");
  sendResponse.apply([new JsObject.jsify({'done': true})]);
}

popup.dart

import 'dart:js';

void main() {
  print("main():...");
  context['chrome']['runtime'].callMethod('sendMessage', [new JsObject.jsify({'action': 'refresh'}), (response) => print("received ${response['done']}")]);
}

更新:需要修补程序才能使其在JavaScript中运行

正如评论中所述,来自context['chrome']['runtime']['onMessage']的返回对象存在问题...如果不是JsObject,则应使用new JsObject.fromBrowserObject()

var jsObject = context['chrome']['runtime']['onMessage'];
(jsObject is JsObject ? jsObject : new JsObject.fromBrowserObject(jsObject))
.callMethod('addListener', [onMessageListener]);

希望它有所帮助; - )