a difficult AMO #4

そういえばすっかり忘れていたが、AMO に新しい xpi をアップロードできない件。

(先週の)金曜になったら試してみてね! などと言うから期待していたのだが案の定同じサーバーエラーが帰ってくるだけだった。枕を涙で濡らしつつ、再び AMO の中の人にメールしたら、xpi を送ってみろというので送った。

個別に対応してくれるのはありがたいけど、サーバーエラー時のメッセージをもうちょっと詳しく出すように改修してくれないかなあ。次またエラー出たらまたこのやりとりしろというのだろうか。

お願いしますよ Jorge さん。

the heavenly school #4

LocationChange イベントのハンドラで、document に対して wasavi の起動と終了イベントをリスンさせているのだが、これはなかなかに乱暴だ。つまり、リスンさせっぱなしなのだ。

本来なら、タブが切り替わる直前に document からハンドラを取り除きたい。しかしそういうイベント(BeforeLocationChange みたいなの)はないようだ。LocationChange イベントは実質的に AfterLocationChanged だ。

したがってその結果、タブが切り替わるごとに同じイベントハンドラを何度も登録するというちょっと餡子の足りない動作になってしまっている。もちろん同一のイベントタイプ・ハンドラ・キャプチャフラグで何度 addEventListener を呼び出しても、登録は高々 1 度だけに収束するという DOM の仕様が前提なわけだけど。

Invoking addEventListener (or removeEventListener) repeatedly on the same EventTarget with the same values for the parameters type, listener, and useCapture has no effect. Doing so does not cause the event listener to be registered more than once and does not cause a change in the triggering order.

それと、現状では wasavi が終了すると共に [cci]passAllKeys = false;[/cci] しているのだけど、これだと wasavi に関係なく常にパススルーで動かしたいサイトで誤動作することになる。wasavi が起動する時点での passAllKeys の値を保存しておいて、wasavi 終了時はその値に復帰させるとかすればよいのだが、passAllKeys が実質グローバルなことを考えるとそれでつじつまが合うのか不安だ。いや合わないケースが確実にある。

この周辺をバグ報告されても、vimperator の仕様がそうなんだよーとおあしす運動(「おれじゃない」「あいつらじゃないの?」「しらない」「すんだこと」)を開始せざるを得ない。どうしよう。

the heavenly school #3

対象ページの window は、content オブジェクトが持っているみたいだ。なので、content.document instanceof HTMLDocument のときにそれに対してごにょごにょすればいい。

なお前の記事では MutationObserver を使うつもりでいたのだが、なにか使い方を間違っているのか、要素を追加・削除しても一切ハンドラが呼ばれない。しかたがないので MutationObserver を使うことはあきらめ、wasavi 側で開始・終了時に CustomEvent を document に対して発行するようにした。このイベントを vimperator のプラグイン側でリスンし、適宜 passAllKeys を書き換える。

ところで気になるのは、wasavi を適当なタブで起動し、そのまま他のタブに切り替え、また戻ってきた場合。この場合、LocationChange イベントのハンドラで、wasavi が起動しているかを見て passAllKeys を制御することになる。しかしここで passAllKeys を直接触らざるを得ないのは vimperator の間違った設計だと思う。LocationChange 内で passAllKeys を触るプラグインが複数あったら破綻してしまう。ハンドラ側では passAllKeys = true としたい、というリクエストを出すだけにして、ハンドラの呼び出しが全て完了した後に呼び出し側でリクエストの有無によって passAllKeys を制御する構造にならないかな。

まあそれはさておき、とりあえず編集したいときに wasavi を起動して終わったら即抜けるっていう使い方をする限りは動くようになった。やったね。

the heavenly school #2

そういうわけでいろいろ調べてみると:

  • 言うまでもなく、vimperator/pentadactyl は Firefox の UI を限りなく vim に近づけるエクステンションだ。ちなみにググった限りでは、vimperator は Firefox を「vim みたいな Firefox」にするのがゴールなのに対し、pentadactyl は「web ページを見られる vim」にするのがゴールのようだ
  • この手のエクステンションの宿命として、キーボード入力は誰のものかを常に意識する必要がある。web ページのスクリプトでハンドリングできる以上、本質的には web ページ上のキーボード入力はその web ページのものだ。vimperator のようなエクステンションは、web ページがキーボード入力を処理していない場合のみ成り立つ。wasavi はそれ自身が全てのキーボード入力を処理するので、当然両立し得ない
  • vimperator 側では、liberator.modules.modes.passAllKeys に true を与えることで、vimperator の動作をスルーさせることができる。また、vimperator にはプラグインの機構があり、例えばタブを切り替えたときに任意のスクリプトを走らせることができる。プラグインは ~/.vimperator/plugin(windows 環境では %HOME%\vimperator\plugin)の下に置く
  • wasavi がページ上に生成されたかどうかは、http://wasavi.appsweets.net/ をソースに指す iframe が存在するか、でとりあえず判断できる
  • つまりプラグインとしてのスクリプトで、DOM の変更を監視し、wasavi の iframe が生成されたら passAllKeys = true にするようにすればいいはずだ。

ということでそんな感じでプラグインを書いてみたのだが、うまく行かない。document.body 直下に iframe が追加・削除されたかどうか監視するために、MutationObserver を生成し、observe() する。
ところがこれが失敗する。MutationObserver#observe() するには対象の要素への参照が必要だ。つまりまず対象のページの window への参照が必要だ。そんなわけでこんな関数を:

function getWindow () {
var wnd;
try {
wnd = liberator.modules.Buffer.focusedWindow;
if (!wnd) {
log('target window not found.');
}
}
catch (e) {
log('exception occured while retrieving focusedWindow: ' + e.message);
wnd = null;
}
return wnd;
}

LocationChange に引っ掛けたハンドラ内で動かすと focusedWindow を参照したところで例外が起こる。vimperator 3.5 のソースを見てみると

getFocusedWindow: function (win) {
win = win || config.browser.contentWindow;
let elem = win.document.activeElement;
let doc;
while (doc = elem.contentDocument) {
elem = doc.activeElement;
}
return elem.ownerDocument.defaultView;
},

で、つまり elem が null のとき while の条件節でエラーになる。そりゃそうですね。

うわーん
動かないよー
うーんどうやって window を得たらいいのかな……。

the heavenly school

github で、vimperator や pentadactyl と共存させるとうまく行かないとの issue をもらった。そうなのか。

というわけでちょっと試してみることにしよう。しかし最初に告白をしておくと、これらのアドオンへの深い知識はまったく持ち合わせていない。というよりそもそも Firefox 自体のことをあんまりよく知らないんですけどね……。まあいろいろ調べながらやってみることにしよう。きっとどうにかなる。

タイトルには深い意味が込められているようであんまり込められてない。

a difficult AMO #2

例の AMO のご乱心だけど、特に直っている様子はない。

というか、ググってみたりツイって(謎)みたりしたり限りでは AMO にエクステンションをアップロードできないよー! 的なそれが見つからない。きわめて局所的な問題なのか?

bugzilla に登録されているバグ票では多少進展があったようだがまだなんとも言えない。休み明けもこの調子だったら追記するか。

 * * *

amo のエディタ(つまり編集者)にメールした。

あと、件の repack & compatibility-validation のメールが来ていて、そちらも「おめーのアドオンがエラーになってるから直せよな! 死ね!」という内容だったのだがエラーの内容はやはりサーバ側のタイムアウトなのである。どうしろというのか。

で、返信しようとしたらそのメールの reply-to: が nobody@mozilla.org だという。なんか……なんかなー!

a difficult AMO

AMO に行って wasavi の最新の xpi をアップロードしようとしたら、自動 validation に弾かれる。90 秒のタイムアウトで強制中断されるか、サーバの内部エラーで強制中断。何度やっても同じだ。なんだこれ。

今なにやら AMO では、AMO にアップロード済みの SDK ベースのエクステンションを最新の SDK で repack & compatibility-validation している/しようとしている状態らしいので(参考)、それが関係して一時的にアップロードできないのかもしれない。全然関係ないかもしれない。

Firefox(10日)、Opera(2日)、Chrome(即日) の順で更新版が公開されるのに手間と時間がかかるので、Firefox 版から先に片付けようとした先からこんな調子でずっこけた。

作った xpi の出来が悪いんじゃないのか? という可能性はなくはないのだが、AMO へログインした後、すでにレビュー・公開済みの 0.4.175 を再度 validate してもやはりサーバの内部エラーになるので、やはり向こう側の問題のようだ。

もう、駄目な AMO ぞうさんですね。

 * * *

bugzilla に登録されていた。現象は 10 月 1 日からだそうです。でも中の人からの何の反応もなく誰にもアサインされてもいなくすでに 3 日が経過している。

うー。まさにこの気持ちだ:

くるぞう: できるだけ急いでくれよな
くるぞう: 3日経ってますけど・・・

full reviewed

full review の結果を伝えるメールが来ていた。はいはい rejected でしょわかってますよ。

……通ってるー!?

というわけで、通ってた。Firefox 版の wasavi も amo から普通のインストールできる状態になった。
https://addons.mozilla.org/ja/firefox/addon/wasavi/

ちなみに full review も preliminary review と同様、レビューしてくれたのは Pentadactyl の作者の一人、Kris Maglione さんである。やはり vi つながりなのか?

requested full review

Firefox の Add on は preliminary review と full review があって、前者はセキュリティに関する点など最低限の部分的なレビューをした後、限定的に公開される。preliminary review に通ってから 10 日ほどの待機期間みたいなのがあって、それが過ぎると full review を申請できるようになる。

というわけで、full review を申請した。

それにしても 8 月 17 日に preliminary review 申請、29 日に通過、9 月 6 日に full review 受付……ってなかなかのんびりしたペースだなあ。そして、full review 待ちのキューには現在 132 個の Add on が溜まっている(wasavi の位置は 133 of 134)。full review ひとつに付き 10 日くらいかかる。

何人がかりで full review してるのかはわからないが、いつ順番来るのこれ?