Firefox拡張入門第2回(MozReplでFirefoxを探検しよう)
windowオブジェクトの入れ子について
いつもwindow.alertなどで見る"Webページのwindow"のさらに上には、ブラウザ全体を支配する"XULのwindow"があります。
もちろんWebページ側からは触れませんが、Firefox拡張ならXULのwindowをいじれます。
ブラウザはこのようになっています。
要素 - サイドバーの
要素 要素 - Webページを表示する
要素 - ...
- Webページを表示する
- サイドバーの
そして
これはHTMLでiframe要素がそれぞれにwindowを持っているのと同じです。
詳細はこちらchrome コードでウィンドウを取り扱う - MDC
接続
MozReplを起動し、telnet接続(127.0.0.1:4242)します。
- telnetの注意
最初に我々がいるのは、ブラウザ全体を支配する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");
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)
XULの要素などはDOM Inspectorで調べるのも便利です。
最後に
これでブラウザを掌握できました。
タブブラウザ用コード - MDCなどにブラウザを操作する例があります。
これでブロークンなHTMLをその道ウン10年のFirefoxに読んでもらってスクレイピングとかすると面白いでしょう。