Sep 25, 2005

Google ToolbarとPopup ALT Attributesのコンフリクト

冗談じゃないっすよ。これを以て「Piroの作る物はやっぱ穴だらけだな」とか言われるだなんて。実装見たら明らかじゃないすか。今回の問題はどー見たってGoogle Toolbarの横暴が原因ですよ。

Google Toolbarの野郎、こともあろうにイベントハンドラそのものを上書きしくさりやがってる。こちとら可能な限り元のコードに影響を与えない方法を考えてあれこれ対策してるってえのに、そんな配慮のカケラもない。そんなの知ったこっちゃないね、俺様は天下のGoogle様なんだからFirefoxのコードを引っかき回したって許されるんだぜ、そんな驕りが窺い知れるってもんですよ。

ああムカツク。

――と、よく調べずにキレてたんだけど、どうも違う原因っぽい?

――ちゃんと調べてみたら、やっぱりGoogle Toolbarが悪者だということがはっきり分かった。

元々ツールチップを表示する処理は、FillInHTMLTooltipという関数で定義されている。この処理を乗っ取るにはいくつか方法があるけれども、破るべきでない自明の原則がある。それは、「拡張機能で追加した処理が失敗したり、何もしなかったりしたときには、元のFillInHTMLTooltipの処理に必ずfallbackする」ということだ。

Popup ALT Attributesの場合、処理の流れはこんな感じになっている。

  1. Popup ALT Attributesが処理をフック
    1. 画像に代替文字列がある場合→ツールチップとして表示→処理を終了。
    2. (画像に代替文字列が無い場合)元のFillInHTMLTooltipに処理を引き渡す。
    3. 元のFillInHTMLTooltipが処理を行う。
    4. 処理を終了。

Google Toolbarの場合はこうだ。

  1. Google Toolbarが処理をフック
    1. Google Toolbar基準で「無視して良い条件」に当てはまっている場合→処理を終了。
    2. Google Toolbarの処理を行う。
    3. 別の関数に処理を引き渡す。
      1. 元のFillInHTMLTooltipに処理を引き渡す。
      2. 元のFillInHTMLTooltipが処理を行う。
    4. 処理を終了。

強調した部分がコンフリクトの原因。本来なら、ここで処理を終了せず元のFillInHTMLTooltipに処理を引き渡さなければならないところを、そのまま終了してしまっている。望ましいGoogle Toolbarの処理は、以下のようになる。

  1. Google Toolbarが処理をフック
    1. Google Toolbarの処理を行う。
    2. 処理に成功した場合→処理を終了。
    3. (処理が行われなかった場合)元のFillInHTMLTooltipに処理を引き渡す。
    4. 元のFillInHTMLTooltipが処理を行う。
    5. 処理を終了。

ええ、確かに、天下のGoogle様ですからね。いくら向こうに非があったとしても、僕にできることは、向こうに合わせてPopup ALT Attributesの仕様を変更することだけですよ。

――とキレてたんだけど、よくよく見返してみたら、自分も同じ過ちを犯していたorz

うわー恥ずかしー

――というわけで更新。悩みの種が一つ減ってスッキリした。これが今流行りのアハ体験ですね!(違)

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能