2014-09-02 4 views
3

제 문제를 더 잘 설명하기 위해 Dart로 작성된 크롬 확장의 작은 예를 만들었습니다. Gist에서 코드를 보거나 확장 프로그램을 다운로드 할 수 있습니다.다트 크롬 확장 : 크롬 API 이벤트 수신

문제

TypeError가 발생 자바 스크립트로 컴파일 할 때이 예는 Dartium에서 잘 실행되지만 : 선의 Uncaught TypeError: undefined is not a function :

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

얼마나 내가 이미 오전

  • 이 예에서 알 수 있듯이 alert() 또는 console.log()을 통한 dart:js의 기능은 js 확장자에서도 작동합니다. dart2js와 eventlisteners를 추가 할 때 특별한 문제가 될 수 있습니까?
  • 또한 context['chrome']['runtime']['onMessage']을 인쇄하면 올바른 이벤트 객체가 표시됩니다. (예 : context['console'].callMethod('log', [context['chrome']['runtime']['onMessage']]);)
  • 크롬 펍 패키지가 있다는 것을 알고 있지만 onMessage에서받은 메시지에 응답 할 때 여전히 버그가 있습니다. 이 내용은 question을 참조하십시오. 다트 (dart)를 통해 직접 Chrome API를 사용하는 경우 : js는 해당 다트 버전의 문제를 해결했습니다.

나는 코드 만 같은 오류의 모든 결과를 많이했다. 이제 나는 아이디어가 없습니다. 커뮤니티가 저를 다시 도울 수 있기를 바랍니다.

편집 : Robert가 제안한대로이 버그를 dartbug.com에보고했습니다. 어쨌든, 누군가가 알고있는 경우 여전히 임시 해결책이나 무언가를 열어두고 있습니다. 나를 위해

+2

앤디, http://stackoverflow.com/questions/25193392/issue-with-chrome-runtime-onconnect-when-building-를 살펴 크롬 - 확장 - 다트. 그것은 나를 위해 일했습니다. – keerti

+0

예! 정말 고마워. 나는 그 실을 이미 알고 있었지만 그것이 거의 같은 문제라고 인식하지 못했습니다. 한 달 동안이 버그에 갇혀있어 ... 고마워 :) – Andi

답변

0

이미 언급 한 : 해결 방법과 유사한 문제가 here을 찾을 수 있습니다.

내 솔루션은 다음과 같습니다

//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]); 
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

감사에서

// 로버트

을 이것에 대해 버그를 제출. 그것은 잘 여기에 작동합니다 keerti으로

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']); 
} 

감사합니다, 로버트

+0

예를 Js로 컴파일 했습니까? 다트 판은 나를 위해 잘 작동하지만 컴파일 된 Js 버전은 아닙니다. – Andi

+0

아니, 그건 내 실수 였어. 지금 디버깅 중입니다. 잠시만 기다려주십시오 :) – Robert

+0

오류는 addListener 액세스에서 발생합니다. 그러나 나는 왜 지금 그 순간에 당신을 말할 수 없습니다. – Robert