いまいち分かってないんだけど、Perlのperlsh,Pythonの対話型シェル,Rubyのirbのような使い方ができるみたいですね。Firefoxも出力にできるJavascriptシェルといった感じでしょうか。Firefoxの内部で行われているJavascriptの処理を覗き見れるシェル型のインターフェース かな。Replというオブジェクトがシェルみたいな役割を果たしていて、repl.method()という感じでメソッドを呼び出して対話型の操作ができる。任意のJavascrptコードを打ち込むことができます。Replオブジェクト自身もJavascriptのようなので、Replを書き換えることも可能みたい。
- 初めの一歩
#()をつけると関数の実行 repl>repl.home() [object ChromeWindow] #()をつけないとオブジェクトの中身が見れる repl> repl.home function home() { return this.enter(this._creationContext); } #組み込みの場合。native code と表示される repl> window.alert function alert() { [native code] }
- XUL(XML-based User-interface Language)にも対応していて、URLバーといったブラウザのコンポーネントにもDOMでアクセスできるみたいです。(XULは今回初めて知った・・・)
repl> document.getElementById('toolbar-menubar').hidden = true true #ツールバーが消える
MozReplをいじるにあたって、とりあえずはrepl.inspect() repl.look() repl.doc()あたりを覚えると見通しがよくなるきがします。
- repl.inspect インスペクタ
オブジェクトの中身を見れるインスペクタです。
repl> repl.inspect(content) #contentの中身を見てみる <object>.addEventListener=[function] <object>.location=[object] <object>.navigator=[object] <object>.window=[probably array, length 0] <object>.qs=[function] <object>.onload=[function] <object>.rwt=[function] <object>.sf=[function] ...以下続く
contentオブジェクトを見てみると、何となくみたことのあるプロパティが出てきました。この場合、
replもオブジェクトなので、repl自身をinspectの引数に出来ますよ。
repl.inspectを組み込みのJavascript関数/プロパティに対して使うと
repl> repl.doc(window) TYPE: object repl> repl.doc(content.location.href) TYPE: string repl> repl.doc(alert) TYPE: function NAME: alert ARGS: [none declared]
型や名前、引数の参照ができるみたい。説明はついてないようです。
自分で定義したオブジェクトを引数にしてみると↓
#emacsのサブバッファで入力したものをreplに読み込ませる myObject = {}; function hello () { var message = this.message; alert(message); } myObject.hello = hello; myObject.message = 'Hello I am Hiroya'; #このオブジェクト対する出力は以下のようになります repl> repl.inspect(myObject) <object>.hello=[function] <object>.message=Hello I am Hiroya
- repl.look()
現在のコンテキストのオブジェクトをリストアップします。出力はinspectと似てる( ls ./ みたいなものかな)
*コンテキストの説明は後ほど
- repl.doc ドキュメントの参照
replオブジェクトの使い方などを載せたdocを見れる。replのメソッドで分からないものがあればこれで参照するとよさげ
repl> repl.doc(repl.inspect) #inspectを見てみます TYPE: function NAME: inspect ARGS: obj, maxDepth, name, curDepth Lists members of a given object. #説明が出てくる
repl.inspectはいろんな引数をとれるということがわかりますた。repl.inspect(content , 3)とかやると膨大な出力がでる。
*ちなみにrepl.docで参照するドキュメントは、オブジェクトのdocプロパティを参照しているつまりrepl.doc(repl.inspect) と、repl.inspect.doc は同じドキュメントを参照することになる
repl> repl.doc(repl.inspect) TYPE: function NAME: inspect ARGS: obj, maxDepth, name, curDepth Lists members of a given object # コレ repl> repl.inspect.doc Lists members of a given object. # 同じ
ということは、自分で定義したオブジェクトのdocを自分で決めるのも簡単。
repl> myObj = {} #オブジェクトを作ります [object Object] repl> myObj.doc = 'This is My Object ' #docを設定します This is My Object repl> repl.doc(myObj) TYPE: object This is My Object #docが出力されます
- コンテキストに関わる操作について
- repl.whereAmI()
現在のコンテキストを返す。コンテキストは、現在作業中の場所(オブジェクト)を示す。Repl起動時のコンテキストはブラウザのChromeWindowにセットされている。で、入力は全てそのコンテキスト中で評価される と書いてあります。
#起動時 repl> repl.whereAmI() [object ChromeWindow] - Document title: "Google" repl> title = 'hogehoge' hogehoge #Firefoxのタイトルがhogehogeになってる
windowコンテキストの中にいる時は、window.titleと書かなければ行けないのが、titleと省略して書けるみたい。
- repl.enter()
コンテキストを変える。replをコンテキストにしてみます
repl> repl.enter(repl) [object Object] repl> doc(enter) TYPE: function NAME: enter ARGS: context Makes a new context the current one. After this, new definitions (variables, functions etc.) will be members of the new context. Remembers the previous context, so that you can get back to it with leave().
replをコンテキストにしたので、repl.enter() repl.doc()とせずとも、enter() doc()と省略形でメソッドの呼び出しができます。
- repl.back()
コンテキストをさかのぼる。コンテキストをチェンジした後、もとのコンテキストに戻りたい時はこれを呼び出すといいみたい
- repl.home()
REPLの始まった場所に戻ると書いてありました。普通に起動した場合だと [object ChromeWindow] かな
- repl.search()
現在のコンテキスト中のメンバ(関数 or プロパティ)をサーチするメソッド。
追記:関数名、プロパティ名は検索できるけど、その中の値は探せないみたい。
repl> repl.whereAmI() [object ChromeWindow] - Document title: "Google" #コンテキストの確認 repl> repl.search(/window/i) #大文字小文字の違いを無視してサーチ XULBrowserWindow zoomWindow ShowWindowFromResource toOpenWindow checkFocusedWindow nsIWindowDataSource ...続く
MozReplのサイトのサンプルでは、GoogleMapsを読み込んでGoogleMaps中で使われているJavascriptの関数やプロパティをrepl.search()で探し出してごそごそと操作してます。外部サイトのJavascriptでも、Firefoxで読み込んでしまえば同じように操作できるんですね。[これはスゴい]な。
- 自分でコンテキストを作ってほげほげ
サンプルのコードを元に解説していきます
repl> var scratch = {} repl> repl.enter(scratch) #scratchオブジェクト作成、コンテキストにする [object Object] repl> repl.look() #現在のコンテキスト(scratch)のオブジェクトを一覧にする this is empty #なにもないので空 repl> var x = 2 repl> var y = 'hello' # x,yを作成 repl> x 2 repl> y hello repl> repl.look() this.x=2 #scratchコンテキスト中にx,yがある this.y=hello repl> repl.back() #コンテキストを元に戻る(scratchコンテキストを出る) [object ChromeWindow] repl> x @data:application/x-javascript,x:1 !!! ReferenceError: x is not defined repl> y @data:application/x-javascript,y:1 !!! ReferenceError: y is not defined #scratchコンテキストではないので, x だけでは値にアクセスできない repl> scratch.x #コンテキストを補ってあげると値にアクセスできた 2 repl> scratch.y #同上 hello repl>