minifyされたJavaScriptにconsole出力等の処理を挟む、特定経路を通った場合に処理を挟む

minifyされたJavaScriptへのブレークポイントでの処理の挟み込み

Firebugブレークポイントは行に貼るのでminifyされたJavaScriptと相性が悪い。
例えばjQuery.ajaxが定義されている行にFirebugで元のJavaScriptのコードに手を入れずにdebug用のconsole出力を入れる方法 - 文殊堂の要領でconsole出力を挟んだとして、

無関係な関数の呼び出しまで対象になってしまう。

それを回避するためにブレークポイントに設定する条件を変えてみる。

!(!(arguments.callee === jQuery.ajax) || (/* やりたい事(式)をカンマ区切りで start */console.info(arguments.callee.toSource())/* end */,true))

コピペ用

!(!(arguments.callee === jQuery.ajax) || (console.info(arguments.callee.toSource()),true))

これを使うと||前の条件が満たされた場合のみ、||後の挟み込まれた処理が実行され、
なおかつ全体としては必ずfalseになるのでブレークはしない。
この場合だと呼び出された関数がjQuery.ajaxの場合に限定して処理を挟み込むことができた。

特定経路で呼び出された場合に限定したブレークポイントでの処理の挟み込み

例えばこの関数での$.ajaxの呼び出しに処理を挟み込む

function post_call_api(url,data){
	$.ajax({
		type: 'POST',
		url: baseuri+url,
		timeout: 10000,
		data: data,
		beforeSend: function(){
			if(elm = $(".post_box input[type=submit]")[0])
				elm.disabled = true;
		},
		error:function (){
			alert("失敗しました。時間を置いてから再度お試しください。");
			if(elm = $(".post_box input[type=submit]")[0])
				elm.disabled = false;
		},
		success:function (text){
			if(text != parseInt(text)){
				this.error();
			}else{
				location.href = baseuri+'/li/'+text;
			}
		}
	});
}

jQuery.ajaxの呼び出し直前に呼び出し元にブレークポイント条件で処理を挟む

__cond = true,false


jQuery.ajaxが定義されている行には以下のようなブレークポイント条件を設定する。

!(!(typeof __cond !== 'undefined' && __cond) || (__cond = false,/* やりたい事(式)をカンマ区切りで start */console.info(arguments)/* end */,true))

コピペ用

!(!(typeof __cond !== 'undefined' && __cond) || (__cond = false,console.info(arguments),true))

呼び出し元を通った場合に条件として使用するグローバル変数__condがtrueになるようにし、
後は一つ目の場合の変形版で、呼び出し先では__condがtrueでないと挟み込まれた処理は実行されないようにする。
で、なおかつ、挟み込まれた処理の中で__condをfalseにしておく。

引数べた書きの関数呼び出しの引数の改ざん

例えば上の例でsuccess callbackを改ざんする。
argumentsは普通に触れるんだから、やりたい事の中に↓みたいのを入れればおk。

arguments[0].success=function(text){console.info(text);}

なのでブレークポイント条件はこうすれば良い。

!(!(typeof __cond !== 'undefined' && __cond) || (__cond = false,arguments[0].success=function(text){console.info(text);},true))

こんな事が出来て何が嬉しいのか

optionsを変数として切り出したり、処理を関数として切り出したりしないで、
$(document).readyでAjaxやってるようなコードをdebugするときとかはわりと嬉しい。