【问题标题】:Dart chrome extension: How to send a response in onMessage?Dart chrome 扩展:如何在 onMessage 中发送响应?
【发布时间】:2014-03-01 11:54:22
【问题描述】:

现在我正在使用 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上公开。

【问题讨论】:

    标签: google-chrome-extension dart


    【解决方案1】:

    您的问题可能在于您尝试发回响应的方式:

    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 中也能工作

    如cmets中所说,从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]);
    

    希望对你有帮助 ;-)

    【讨论】:

    • 正如 zoechi 在github 上已经提到的那样:“我尝试了 response.apply([new JsObject.jsify({'done': true})]); 这不会导致异常,但是提供的 JavaScript 回调也不会被调用。”
    • 我用有效的飞镖代码更新了答案。我正在使用直接 dart:js 来支持 dart:chrome 包
    • 也适合我!谢谢。顺便提一句。在 eventListener 中返回 true 时,异步响应也会起作用。
    • 现在可以了吗?调用 addListener 时出现错误。 “上下文['chrome']['runtime']['onMessage'].callMethod('addListener', [onMessageListener]);” “未捕获的 TypeError:J.p(...).a0 不是函数”我的环境,-版本 47.0.2526.73(64 位)-Dart VM 版本:1.13.0(2015 年 11 月 18 日星期三 12:15:29) “macos_x64”
    • 在没有 dart2js minify 的情况下调用 addListener 时出错。这一行:“context['chrome']['runtime']['onMessage'].callMethod('addListener', [onMessageListener]);”一个错误:“Uncaught TypeError: J.$index$asx(...).callMethod$2 is not a function”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 2014-10-13
    • 2011-09-11
    相关资源
    最近更新 更多