naoki86star

インターネットの片隅でなにかしら書いてみる

(小ネタ) chrome.tabs.queryの挙動

直近でブラウザのweb-extensionの作成を検討したりなんかしてます。ツールバーボタンひとつだしてwebsocketでデータ引っ張ってきて特定のページひらくといった単純なやつです。
自分のミッションだとfirefoxchromeのほぼ最近のバージョンで動けばいいので比較的楽なんだと思いますけども、それでもブラウザ依存に引っかかったネタをひとつ書きます。

開きたいページがすでに開いているかどうかを判定するのにchrome.tabs.queryを使えると理解していて、というか基本その通り動きました。単純なサンプルを書いて使えると思っていたらurlにポートがついていたときの挙動がアレでした(例で書きますが)

http://some.one:8686/page

というページをqueryしようとしてまず素直にそのまま

chrome.tabs.query({url:'http://some.one.page:8686/page'},function(result){});

としていたら、chrome(version60.0.だったか)だと期待通り動きますが、firefox(55.0)*1だと、まだ開いてないよう、とresultの結果が空になって戻ってきてしまい、

chrome.tabs.query({url:'http://some.one.page/page'},function(result){});

これだとhttp://some.one:8686/pageを開いていたらその通り結果を返してきました。chromeも同じ動作をしてくれたので、当面このようにポートを抜いた書き方でコードを書いておこうかと思ってます。

標準のなにかにしたがってchromefirefoxも実装されてると思うのでドキュメントを丹念に読めば、まあなにの解釈の違いでこうなってる*2のが理解できるんでしょうけども、自分のツールとして動くUIができればいいので全然深く踏み込んでません。*3

*1:chromeとともに64bitでやってました

*2:場合によってはこれは不具合なんですよと指摘もできる

*3:そもそも、chrome.のつくAPIがちゃんとfirefoxで動いている背景というか今までの経緯も理解してません。さらにいうとhttps://developer.mozilla.org/ja/Add-ons/WebExtensions/とかに記載のsampleのAPIそのままだとだめなケースが多いような気がしてます。ただし自分的には構築の全体の流れはmozillaのサイトが分かりやすいと思ってたりもします。