miniGestures 自力で改造(と、Chrome Extension の書き方がわからない話)
はじめに書いておきますがソースコードはありません。すみません。
経緯:
- Chromebook のマウスジェスチャを CrxMouse から miniGestures(+α)に乗り換えた - fudebako
- メモ:miniGestures についての追記 - fudebako
参考:
- Chrome ウェブストア - miniGestures
- ajribeiro/miniGestures · GitHub(ソースコード)
- chrome.tabs - Google Chrome(公式)
- Stack Overflow(エンジニアの Q&A サイト。情報量が膨大。お世話になった!)
- javascript - After calling chrome.tabs.query, the results are not available - Stack Overflow(synchronous だの asynchronous だのの意味はわからないけど
chrome.tabs.query
の中で何もかもやらないといけないらしいことは理解できた)
- javascript - After calling chrome.tabs.query, the results are not available - Stack Overflow(synchronous だの asynchronous だのの意味はわからないけど
JavaScript の Ja の字もわからないのに「すでにあるコードの改造くらいならできるんじゃないか」と思ってしまい、miniGestures を意地と根性で改造してみました。chrome.tabs.getSelected
および chrome.tabs.getAllInWindow
使用の箇所を chrome.tabs.query
に書き換えです。とりあえず動くしブラウザがクラッシュしたりはしてません。今のところ……。
「表示しているタブを閉じる」や「すべてのタブを閉じる」程度ならほぼ置き換えでよかったから問題なかったです。しかし「右のタブへ移る」「表示しているタブ以外の全てのタブを閉じる」などはそうは行かず、頭をひねりました。
それでもそのへんが実現できたあたりでやめておけばよかったのですが、「現在のタブより右/左のタブを閉じる」(miniGestures にはこの機能がない!)がど〜〜〜〜しても欲しくて、調べて調べて調べまくって実装しました。なぜ動くかはわからないけどとにかく動きます。
本当はここでソースコードを公開して、ウェブの肥やしにするとともに詳しい人に添削してもらいたかった(切実に)のですが、著作権がよくわからないので非公開です。すみません。ぶっちゃけた話、肝心の「右/左のタブを閉じる」部分の記述は他の拡張機能のソースから拝借してしまったし……。
ただ、ド素人の私がハマったのは Chrome に「右/左のタブを閉じてね」とお願いする部分ではなく、それ以前、Chrome のタブ情報を取得する段階でした。
「現在のタブより右/左のタブを閉じる」プログラムを言葉にするとこんな感じになります:(素人解釈なので不正確です)
- 現在開いている全てのタブの情報を取得する(1)
- 表示している(=アクティブな)タブの情報を取得する(2)
- それぞれのタブに番号を割り振る(3)
- すると左から順に 0, 1, 2, 3... みたいな感じで割り振られるので、例えば現在アクティブなのが「2」のタブだとして
- 右のタブを閉じるなら「2 より大きい番号のタブを閉じよ」と命令する(4)
- 左のタブを閉じるなら「2 より小さい番号のタブを閉じよ」と命令する(5)
このうち(1)(2)でつまづいたってことです。
chrome.tabs.query({currentWindow: true}...);
だと全てのタブの情報は取得できてもアクティブなタブの情報が得られないし、かといって chrome.tabs.query({active: true}...);
や chrome.tabs.query({active: true, currentWindow: true}...);
だとアクティブなタブの情報しか取得できない! 何を間違っているんだろうか?
結論から言うと chrome.tabs.query
を入れ子にすることで一応なんとかなったのですが、絶対にもっとスマートな書き方があると思います。私は何を間違えているんでしょうか。詳しい方アドバイスください! お願いします。
chrome.tabs.query({active: true}, function(tab) { chrome.tabs.query({currentWindow: true}, function(tabs) { // 「右/左のタブを閉じてね」とお願いする部分。詳しい記述は割愛 // 上の chrome.tabs.query で得た引数:tab(アクティブなタブの情報)と // tabs(全てのタブの情報)を利用して for 文と if 文であれやこれやする } });