Расширение Dart для Chrome: прослушивание событий Chrome API

Чтобы лучше описать мою проблему, я создал небольшой пример расширения Chrome, написанного на Dart. Вы можете увидеть код или загрузить расширение на Gist.

Проблема

Этот пример отлично работает в Dartium, но при компиляции в javascript возникает ошибка типа: Uncaught TypeError: undefined is not a function для строки:

context['chrome']['runtime']['onMessage'].callMethod('addListener', [onMessageListener]);

Как далеко я уже зашел

  • Как видно из примера, функции alert() или console.log() через dart:js также работают в js-расширении. Значит, это может быть особая проблема с dart2js и добавлением прослушивателей событий?
  • Также распечатка context['chrome']['runtime']['onMessage'] показывает правильный объект-событие. (Например: context['console'].callMethod('log', [context['chrome']['runtime']['onMessage']]);)
  • Я знаю, что существует пакет chrome pub, но все еще есть ошибка при ответе на полученные сообщения в onMessage. См. также этот вопрос. Использование chrome API напрямую через dart: js было обходным путем, который был хорош в этой версии dart.

Я много играл с кодом, но все приводит к одной и той же ошибке. Теперь у меня нет идей. Надеюсь, сообщество снова поможет мне.

Изменить: я сообщил об этой ошибке на dartbug.com, как предложил Роберт. В любом случае, я все еще открыт для обходного пути или чего-то еще, если кто-то его знает.


person Andi    schedule 02.09.2014    source источник
comment
Энди, взгляните на stackoverflow.com/questions/25193392/. Это сработало для меня.   -  person keerti    schedule 04.09.2014
comment
Да! Большое спасибо. Я уже знал эту тему, но не знал, что это была та же проблема. Застрял на этой ошибке на месяц ... Спасибо, чувак :)   -  person Andi    schedule 04.09.2014


Ответы (2)


Так что ваш пример отлично работает для меня:

//Placed in web/

import 'dart:js';

void main() {
  //This doesnt work in js
  context['chrome']['runtime']['onMessage'].callMethod('addListener', [onMessageListener]);
  context['chrome']['runtime'].callMethod('sendMessage', ['someMessage']);
  context['chrome']['runtime'].callMethod('sendMessage', [null, 'someMessage']);
}


void onMessageListener(message, sender, sendResponse) {
  print("test");
  print(message);
}

Выход

test (:1)
someMessage (:1)
test (:1)
someMessage (:1)

С уважением, Роберт

// Извините, вы пропустили исключение, которое вы получили

Вы должны сообщить об этом на сайте www.dartbug.com.

С уважением, Роберт

// На данный момент вы должны иметь возможность использовать пакет chrome. Здесь отлично работает:

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

void onMessageListener(message, sender, sendResponse) {
  print("test");
  print(message);
}

void main() {
  chrome.runtime.onMessage.listen((chrome.OnMessageEvent event) {
    print(event.message);
  });

  JsObject runtime = context['chrome']['runtime'];
  runtime.callMethod('sendMessage', ['someMessage']);
  runtime.callMethod('sendMessage', [null, 'someMessage']);
}

С уважением, Роберт

person Robert    schedule 03.09.2014
comment
Вы скомпилировали пример в Js? У меня тоже работает dart-версия, но не скомпилированная Js-версия. - person Andi; 03.09.2014
comment
Нет, это была моя ошибка. Отладка прямо сейчас. Погоди :) - person Robert; 03.09.2014
comment
Таким образом, ошибка возникает из-за доступа к addListener. Но я не могу сказать вам, почему в данный момент. - person Robert; 03.09.2014
comment
Вот так. Мои результаты аналогичны. Как описано выше: chrome.runtime.onMessage доступен. context['console'].callMethod('log', [context['chrome']['runtime']['onMessage']]); печатает объект Event. Но вызов addListiner для объекта нарушает расширение :( - person Andi; 03.09.2014
comment
К вашему редактированию На данный момент вы должны иметь возможность использовать пакет chrome: как сказано в вопросе, я использовал chrome.runtime.onMessage.listen, но в пакете есть ошибка в функции ответа, которую я также хочу использовать. Это была основная причина, по которой я переключился на вариант js-interop. К сожалению, использование dart:js вместо chrome(-package) указывает мне на эту ошибку. (Что касается ошибки в пакете chrome, см. также давно опубликованную проблему. назад) - person Andi; 03.09.2014
comment
Похоже, вы просто можете сообщить об ошибке здесь. - person Robert; 03.09.2014

Как уже упоминалось keerti: аналогичную проблему с обходным путем можно найти здесь.

Мое решение выглядит так:

  //Tmp: sendResponse is buged, so we use the js-version
  //chrome.runtime.onMessage.listen(onMessageDartListener);

  //..and ofcourse the js-version is buged too. So this workaround here:
  var jsOnMessageEvent = context['chrome']['runtime']['onMessage'];
  JsObject dartOnMessageEvent = (jsOnMessageEvent is JsObject ? jsOnMessageEvent : new JsObject.fromBrowserObject(jsOnMessageEvent));
  dartOnMessageEvent.callMethod('addListener', [onMessageListener]);
person Andi    schedule 04.09.2014