Home > Latest topics

Latest topics > All-in-One GesturesとSplit Browser

宣伝1。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能! シス管系女子って何!? - 「シス管系女子」特設サイト

宣伝2。Firefox Hacks Rebooted発売中。本書の1/3を使って、再起動不要なアドオンの作り方のテクニックや非同期処理の効率のいい書き方などを解説しています。既刊のFirefox 3 Hacks拡張機能開発チュートリアルと併せてどうぞ。

Firefox Hacks Rebooted ―Mozillaテクノロジ徹底活用テクニック
浅井 智也 池田 譲治 小山田 昌史 五味渕 大賀 下田 洋志 寺田 真 松澤 太郎
オライリージャパン

All-in-One GesturesとSplit Browser - Apr 26, 2007

「諦めた」と宣言したそばからナンだけど、あの後もう少しがんばって、どうにか対応してみた。aioContentのリダイレクタになるオブジェクトを定義するだとかの珍妙なテクニックを駆使しまくって、やっとのことで。

AiO Gesturesのためだけに7KBくらいはコード書いた気がする……あまりにハック用コードが膨大になってきたから別ファイルに分離しちゃったよ(リンク先の半分あたりから先は全部AiO Gestures用のコード)。

aioContentの再実装?をするにあたって、AiO Gesturesのやるメソッドの上書きをリダイレクトしつつちゃんと動くようにする努力の過程で気づいたこと。prototype.jsの解説とか見てて「thisの束縛」という話をたまに目にしてたけど、それって要は、「Function.apply()なりFunction.call()なりを使って明示的にスコープを指定して関数を実行する関数」を生成してやるって事なんだろうか。つまりこういう感じ。


function MyClass(aArg) {
  this.prop = aArg
}
MyClass.prototype = {
  prop   : null,
  method : function() { alert(this.prop); }
};

var obj1 = new MyClass('obj1');
var obj2 = new MyClass('obj2');

obj2.method = function() { this.method.apply(obj1, arguments); };

obj2.method(); // "obj1"

例が悪くて意味が分からんかったので実例を示そう。Split Browserのコードの一部を示す。


window.aioContent = {
  set removeTab(val) {
    return SplitBrowser.activeBrowser.removeTab = val;
  },
  get removeTab() {
    return SplitBrowser.activeBrowser.removeTab;
  }
};

これは一番最初に書いたコード。別の箇所でaioContent = document.getElementById("content")として定義されたaioContentを置き換えて、Split BrowserのAPIで分割されたブラウズ領域でも機能するようにしようとした。AiO Gesturesの中でaioContent.removeTab = function() { ... }という感じでメソッドを置き換えている箇所について、関数オブジェクトのセット先をリダイレクトしている。

でもこれは実際には期待したとおりには動かない。aioContent.removeTab()が呼ばれた場合、SplitBrowser.activeBrowser.removeTabに格納されていた関数オブジェクトがaioContentをスコープとして実行されるので、まともに動かなくなってしまう。分かりやすく言えば、


aioContent.newMethod = SplitBrowser.activeBrowser.removeTab;
aioContent.newMethod();

という風になっているのと同じことになる。

これを解決したのが、以下のコード。

window.aioContent = {
  set removeTab(val) {
    return SplitBrowser.activeBrowser.removeTab = val;
  },
  get removeTab() {
    return this.wrappedRemoveTab;
  },
  wrappedRemoveTab : function() {
    SplitBrowser.activeBrowser.removeTab.apply(SplitBrowser.activeBrowser, arguments);
  }
};
/code>

wrappedRemoveTabは「SplitBrowser.activeBrowser.removeTabの関数オブジェクトをSplitBrowser.activeBrowserのスコープで実行する関数」だ。これをremoveTabプロパティで返してやることによって、


aioContent.newMethod = function() {
  SplitBrowser.activeBrowser.removeTab.apply(SplitBrowser.activeBrowser, arguments);
};
aioContent.newMethod();

と書いたのと同じことになって、やっと意図通り動いてくれるようになった。

数年遅れでAjaxの流れにやっと追いつけた感じです……

分類:Mozilla > 拡張機能, , , , , , 時刻:16:55 | Comments/Trackbacks (0) | Edit

Comments/Trackbacks

TrackBack ping me at


の末尾に2014年1月19日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2007-04-26_aiog-splitbrowser.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。

Post a comment

writeback message: Ready to post a comment.

2014年1月19日時点の日本の首相のファミリーネーム(ひらがなで回答)

Powered by blosxom 2.0 + starter kit

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のつぶやき

オススメ

Mozilla Firefox ブラウザ無料ダウンロード