MozReplをいじってみたよ // 簡単なチュートリアル

いまいち分かってないんだけど、Perlのperlsh,Pythonの対話型シェル,Rubyirbのような使い方ができるみたいですね。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]
}
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オブジェクトを見てみると、何となくみたことのあるプロパティが出てきました。この場合、は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>