そもそもchrome.extension.onMessageリスナーのsendResponseはchrome.extension.sendMessage呼び出し時に指定されるコールバックに結果を返すためのものです。そのため(想像ですが)sendMessageにコールバックが指定されていない場合はonMessageリスナーの戻り値の真偽にかかわらずportを切断するような実装になっているのではないでしょうか。つまり(くれぐれも想像ですが)sendMessageにコールバックがない場合は常にonMessageリスナーの戻り値をreturn
false; としたのと同じ動作をしているんだと思います。
2012/9/19 yamaji <yamayam...@gmail.com>:
> --
> このメールは Google グループのグループ「Chrome API Developers JP」の登録者に送られています。
> このグループに投稿するには、chrome-api-d...@googlegroups.com にメールを送信してください。
> このグループから退会するには、chrome-api-develop...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/chrome-api-developers-jp?hl=ja
> からこのグループにアクセスしてください。
--
ANDO Yasushi
- and...@gmail.com
- http://d.hatena.ne.jp/technohippy/
- http://twitter.com/technohippy
こんにちは。あんどうと申します。そもそもchrome.extension.onMessageリスナーのsendResponseはchrome.extension.sendMessage呼び出し時に指定されるコールバックに結果を返すためのものです。そのため(想像ですが)sendMessageにコールバックが指定されていない場合はonMessageリスナーの戻り値の真偽にかかわらずportを切断するような実装になっているのではないでしょうか。つまり(くれぐれも想像ですが)sendMessageにコールバックがない場合は常にonMessageリスナーの戻り値をreturn
false; としたのと同じ動作をしているんだと思います。
--
なんというか想像で答えているだけなので大変心苦しいんですが、基本的にはonMessageリスナーでreturn
trueするとsendResponseの処理が終了するまでportは有効ですが、return
falseするとonMessageリスナーが終了したときにportは切断されます。
なので
[content scripts]
chrome.extension.sendMessage('request message', function(res)
{console.log(res)});
上記のようにsendMessageにコールバックを渡していても
[background pages]
chrome.extension.onMessage.addListener(function(req, sender, sendResponse){
setTimeout(function(){
sendResponse('response message');
}, 1000);
return false;
});
上記のようにreturn falseとsetTimeoutを組み合わせるとエラーになります。
[background pages]
chrome.extension.onMessage.addListener(function(req, sender, sendResponse){
sendResponse('response message');
return false;
});
もちろんreturn falseしていてもsendResponseをその場で実行すればエラーになりません。
(ここまではドキュメントに書かれているので事実です)
これはyamajiさんが当初書かれていた動作と同じように見えるので
「sendMessageにコールバックがない場合は常にonMessageリスナーの戻り値をreturn false; としたのと同じ動作をする」
と解釈するとすっきりするかなと思ったんですがダメでしょうか?
(ただし、これは想像です)
上記のような動作になるのは
「そもそもonMessageリスナーのsendResponseはsendMessage呼び出し時に指定されるコールバックに結果を返すためのものだから」
と考えるとわりと妥当だと思いますし。
2012/9/24 yamaji <yamayam...@gmail.com>:
> --
> このメールは Google グループのグループ「Chrome API Developers JP」の登録者に送られています。
> このグループに投稿するには、chrome-api-d...@googlegroups.com にメールを送信してください。
> このグループから退会するには、chrome-api-develop...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/chrome-api-developers-jp?hl=ja
> からこのグループにアクセスしてください。
--
> このグループに投稿するには、chrome-api-develo...@googlegroups.com にメールを送信してください。
> このグループから退会するには、chrome-api-developers-jp+unsubscribe@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/chrome-api-developers-jp?hl=ja
> からこのグループにアクセスしてください。
なるほど、モチベーションがよく分からなかったんですがそういうことだったんですか。
そうすると行儀は悪いですが例外を取って捨てるくらいしか私には思いつかないですねぇ・・・。
chrome.extension.onMessage.addListener(function(req, sender, sendResponse){
setTimeout(function(){
try {
sendResponse('response message');
} catch(e) { /* ignore */ }
} , 1);
return true;
});
> 時間が取れたら、実際どういうコードになっているのか読んでみようと思います。
謎が解けたらぜひ教えて下さい。私も想像で答えるだけでは申し訳ないのでざっと読んではみたんですが力尽きましたw
2012/9/24 yamaji <yamayam...@gmail.com>:
>> > このグループに投稿するには、chrome-api-d...@googlegroups.com にメールを送信してください。
>> > このグループから退会するには、chrome-api-develop...@googlegroups.com
>> > にメールを送信してください。
>> > 詳細については、http://groups.google.com/group/chrome-api-developers-jp?hl=ja
>> > からこのグループにアクセスしてください。
>>
>> --
>> ANDO Yasushi
>> - and...@gmail.com
>> - http://d.hatena.ne.jp/technohippy/
>> - http://twitter.com/technohippy
>
> --
> このメールは Google グループのグループ「Chrome API Developers JP」の登録者に送られています。
> このグループに投稿するには、chrome-api-d...@googlegroups.com にメールを送信してください。
> このグループから退会するには、chrome-api-develop...@googlegroups.com
371: for (var i = 0; i < listeners.length; i++) {372: try {373: var result = this.dispatchToListener(listeners[i].callback, args);374: if (result !== undefined)375: results.push(result);376: } catch (e) {377: console.error("Error in event handler for '" + this.eventName_ +378: "': " + e.message + ' ' + e.stack);379: }380: }381: if (results.length)382: return {results: results};
> --
> このメールは Google グループのグループ「Chrome API Developers JP」の登録者に送られています。
> このグループに投稿するには、chrome-api-develo...@googlegroups.com にメールを送信してください。
> このグループから退会するには、chrome-api-developers-jp+unsubscribe@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/chrome-api-developers-jp?hl=ja
> からこのグループにアクセスしてください。
だとすると、port切断は別スレッドに任されてて非同期なので、タイミング次第ではたまたまsendResponseのときにまだportが生きてることがあるだけで、基本的にはsendMessageでコールバックを指定してないときはonMessageのリスナーでsendResponseは呼べないというのが正しい動きっぽいですね。
chromeの実装分かってる人だれか出てきて教えてくれないですかねー。
2012/9/26 yamaji <yamayam...@gmail.com>:
>> > このグループに投稿するには、chrome-api-d...@googlegroups.com にメールを送信してください。
>> > このグループから退会するには、chrome-api-develop...@googlegroups.com
>> > にメールを送信してください。
>> > 詳細については、http://groups.google.com/group/chrome-api-developers-jp?hl=ja
>> > からこのグループにアクセスしてください。
>>
>> --
>> ANDO Yasushi
>> - and...@gmail.com
>> - http://d.hatena.ne.jp/technohippy/
>> - http://twitter.com/technohippy
>
> --
> このメールは Google グループのグループ「Chrome API Developers JP」の登録者に送られています。
> このグループに投稿するには、chrome-api-d...@googlegroups.com にメールを送信してください。
> このグループから退会するには、chrome-api-develop...@googlegroups.com
> 1. sendMessageでコールバックが指定されていない場合は、onMessageリスナーが実行される時点で既にportが切断されている
> (実際に切れているかは分からないですが、ネイティブコード側のHasPortDataでfalseが返る状態になっている)だとすると、port切断は別スレッドに任されてて非同期なので、タイミング次第ではたまたまsendResponseのときにまだportが生きてることがあるだけで、基本的にはsendMessageでコールバックを指定してないときはonMessageのリスナーでsendResponseは呼べないというのが正しい動きっぽいですね。
chromeの実装分かってる人だれか出てきて教えてくれないですかねー。
--