Firefox拡張入門第2回(MozReplでFirefoxを探検しよう)

windowオブジェクトの入れ子について

いつもwindow.alertなどで見る"Webページのwindow"のさらに上には、ブラウザ全体を支配する"XULのwindow"があります。
もちろんWebページ側からは触れませんが、Firefox拡張ならXULのwindowをいじれます。

ブラウザはこのようになっています。

  • 要素
    • サイドバーの要素
    • 要素
      • Webページを表示する要素
        • ...

そして要素のようにページ(XULやHTML)を表示できる要素がそれぞれに"ページのwindow"を持っています。
これはHTMLでiframe要素がそれぞれにwindowを持っているのと同じです。
詳細はこちらchrome コードでウィンドウを取り扱う - MDC

接続

MozReplを起動し、telnet接続(127.0.0.1:4242)します。

  • telnetの注意
    • 文字コードUTF-8。ブラウザ内部はUTF-8で動いているので。
    • 改行コードはLF。いわゆる\n。
    • TeraTermはローカルエコーを有効にしましょう。
    • MozReplはローカルの接続しか受け付けない設定なので大丈夫です。
    • Emacsユーザには、MozReplのパッケージの中にmoz.elが入っています。

最初に我々がいるのは、ブラウザ全体を支配するXULのwindowです。
(MozReplが、Current working context: chrome://browser/content/browser.xulと表示しています)
例えば、ブラウザ内部でWebページを開くのに使われているopenUILink関数を呼びます。

repl> window.openUILink("http://www.google.co.jp");

Googleが表示されましたか?

repl.enter(ブラウザー)

repl.enterで別のwindowに潜れます。
例えば"Webページのwindow"に潜ってみましょう。window.contentにあります。

repl> repl.enter(window.content);
[object Window] ? {getInterface: function() {…}, repl: {…}, ...}
repl> alert("hello world");

おなじみのwindow.alertが呼べました。
http://eva-lu-ator.net/~gemma/geocities/matchfox/Clipboard09.png

repl.home()

repl.home()でXULのwindowに帰れます。

repl> repl.home()
[object ChromeWindow] ? {gProgressMeterPanel: {…}, gFindBar: {…}, DownloadUtils: {…}, repl: {…}, ...}

repl.enter(サイドバー)

今度は"サイドバーのwindow"に潜ってみましょう。履歴サイドバーを表示してから潜ります。

repl> repl.enter(document.getElementById("sidebar").contentWindow);
[object ChromeWindow] ? {repl: {…}, NS_ASSERT: function() {…}, document: {…}, ...}
repl> location.href
"chrome://browser/content/history/history-panel.xul"

おぉ、location.hrefにhttp://じゃなくてchrome://が輝いています。Firefox拡張ならではですね。

repl.inspect()

repl.inspectで他にどんなプロパティやメソッドがあるか調べることができます。

repl> repl.inspect(location)
.href=chrome://browser/content/history/history-panel.xul
.hash=
.host=browser
.hostname=browser
.pathname=/content/history/history-panel.xul
.port=
.protocol=chrome:
.search=
.reload=[function]
.replace=[function]
.assign=[function]

XULの要素などはDOM Inspectorで調べるのも便利です。

最後に

これでブラウザを掌握できました。
タブブラウザ用コード - MDCなどにブラウザを操作する例があります。
これでブロークンなHTMLをその道ウン10年のFirefoxに読んでもらってスクレイピングとかすると面白いでしょう。