Apr 25, 2007

拡張性や互換性を高く保つ設計とか

AiO GesturesSplit Browserの連携を試みてみよう、と思って挫折した。基本的にSplit Browserは、Firefoxの初期状態の構造であることを前提にして開発されている拡張機能とは、とても相性が悪い。ハック用のコードを書いてみようと思っても、変更箇所が膨大になりすぎて、とてもやる気が起こらない。FireBugとの連携が結局中途半端な状態で止まってしまってるのもそのせいだ。

Split Browserが連携しやすいのは、Firefox全体に渡ってではなく、tabbrowserというウィジェットに対してだけ拡張を行うように設計されている物だ。マルチプルタブハンドラ情報化タブやなんかは最初からそういう風に設計したので、わりかし簡単に連携がとれるようになった。

たとえば僕の場合は、マルチプルタブハンドラの実装が代表的な例なんだけど、tabbrowserウィジェットに対する拡張はできる限りinitTabBrowser()destroyTabBrowser()というメソッドにまとめておいて、極端な話、tabbrowser要素の動的な増減にも対応できるようにしてある。こういう風な構造になっている拡張機能なら、Split Browser側で簡単に対応できる。実際、マルチプルタブハンドラとの連携のためにSplit Browserに加えたコードは以下の内容だけで済んだ。

if ('MultipleTabService' in window &&
  SplitBrowser.tabbedBrowsingEnabled) {
  var appcontent = document.getElementById('appcontent');
  MultipleTabService.__defineGetter__('browser', function() {
    return SplitBrowser.activeBrowser;
  });
  var initMTS = function(aEvent) {
    MultipleTabService.initTabBrowser(aEvent.originalTarget.browser);
  };
  var destroyMTS = function(aEvent) {
    MultipleTabService.destroyTabBrowser(aEvent.originalTarget.browser);
  };
  appcontent.addEventListener('SubBrowserAdded', initMTS, false);
  appcontent.addEventListener('SubBrowserRemoveRequest', destroyMTS, false);
  window.addEventListener('unload', function() {
    appcontent.removeEventListener('SubBrowserAdded', initMTS, false);
    appcontent.removeEventListener('SubBrowserRemoveRequest', destroyMTS, false);
    window.removeEventListener('unload', arguments.callee, false);
  }, false);
}

まあちゃんとプログラミングの勉強をした人から見たら、これでもまだまだ無駄が多いんだろうとは思うけど……

自分自身がそうなんだけど、他の拡張機能と同時に使われるかもしれない、ってことを敢えて意識していないと、ついついFirefoxべったりの書き方で作ってしまう。その結果、スケーラビリティとかそういうものが低くなってしまって、後で色々と泣きを見ることになる。これは自分にとって一種の保身術でもあると言えるのかもしれない。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能