Pages

2008-03-11

Google Reader 小アップデートに伴う不具合とその対策

2008-03-06、Google Reader が地味にアップデートした。

このアップデートと前後して、キーボード・ショートカット系に不具合が報告されている。一つは、ショートカットが利かなくなるというもの。もう一つは、Greasemonkey 系のショートカットが働かなくなるというもの。

ショートカットが利かなくなる

これは、Google Groups で報告されているバグ。

firefox では、中クリックでリンク先を別タブ・バックグラウンドに開くことが出来る。今回のバグは、その中クリックを実行すると、キーボード・ショートカット全般が利かなくなってしまうというもの。

対処方法は簡単。ウィンドウのどこかをもう一度クリックする。

簡単な対処ではあるけれど、一手間増えるということで嫌がられている。

Google 側は、この問題を認識しており、2008-03-10 に「修正中」とのコメントを寄せている。

Greasemonkey のショートカットが利かなくなる

ぼくが作ってる Greasemonkey で、ショートカット・キーが利かなくなってる。特に、「y キーで記事を別タブ・バックグラウンドに開く」Greasemonkey スクリプトで修正して欲しいとのコメントを頂いた (Adhoc 修正版をアップ済)。

これは、Google Reader の HTML ソースが変更になったといふ類の問題ではない (さふなら、どれほどよかったことか!)。JavaScript 回りの変更が原因。少しソースを見てみませう。

ぼくの、キーボード・ショートカット回りのソース・コードは下記の通り。

function GRT_key(event) {
  alert("foo");
  element = event.target;
  elementName = element.nodeName.toLowerCase();
  if (elementName == "input") {
    typing = (element.type == "text" || element.type == "password");
  } else {
    typing = (elementName == "textarea");
  }
  if (typing) return true;
  if (String.fromCharCode(event.which)=="y" && !event.ctrlKey) {
    // ココにショートカットで呼び出す関数名を書く
    _gm_open_original_in_tab();
    try {
      event.preventDefault();
    } catch (e) {
    }
    return false;
  }
  return true;
}

document.addEventListener("keypress", GRT_key, false);

addEventListener() を使って、keypress がある度に関数 GRT_key() を呼び出している。GRT_key() は、まずキーがテキスト・エリアで入力されたかどうかを検出する。Google Reader の場合、検索窓で入力されたかどうかをチェックしている。で、検索窓への入力なら、無視。何もしない。そうでないなら、入力文字をチェックして対応する関数を呼び出す。かういふ仕組み。

さて、関数 GRT_key() の一行目に alert() が置いてある。これはデバッグ用のコード。キー入力があるたびに、「foo」とメッセージ・ボックスが出ることを期待している。このコードを入れたまま、このスクリプトを実行してみると何の反応もなかった。どうやら、keypress イベントそのものが、Google Reader に喰い潰されてしまっている。このせいで、キーボード・ショートカットが利かなくなった。

ちなみに、シフト・キーを押しながら文字を入力すると、keypress イベントが呼ばれる。Google Reader が何をしたいのかよく分からない。

閑話休題。

Ad hoc な対処だけど、keypress イベントじゃなくて keyup イベントを使うやうにした。つまり、サンプル・コードの一番下を

document.addEventListener("keypress", GRT_key, false);

から

document.addEventListener("keyup", GRT_key, false);

に変更する。

すると、keyup イベントが送られる。だけど、これで解決ではない。

String.fromCharCode(event.which) が何故か大文字に変換される。なので、「小文字の y」と比較しても、true にならない。これを修正するために、「小文字の y」を「大文字の Y」に変えた。

以上。

まだ残る課題

今回の対処法だと、小文字と大文字で呼び出す関数を切り替えられない。例えば、拙 Greasemonkey「Google Reader SBM」では、「b キーではてなブックマーク、B キーで livedoor clip」にブックマーク出来る仕様にしてある。

今回の Ad hoc な対策だと、このスクリプトは救済出来ない。

で、現在、どうしやうかと悩み中。誰か、よいアイデアがあればコメント・トラックバック下さい m(_ _)m。

No comments:

Post a Comment