En plus de redéfinir console._commandLineAPI
,
il ya d'autres façons de percer dans InjectedScriptHost sur les navigateurs webkit, afin de prévenir ou de modifier l'évaluation d'expressions saisies dans les développeurs de la console.
L'une d'elle est d'accrochage dans Function.prototype.call
Chrome évalue l'expression en call
ing sa fonction eval avec InjectedScriptHost
comme thisArg
var result = evalFunction.call(object, expression);
Compte tenu de cela, vous pouvez écouter l' thisArg
de call
être evaluate
et d'obtenir une référence vers le premier argument (InjectedScriptHost
)
if (window.webkitURL) {
var ish, _call = Function.prototype.call;
Function.prototype.call = function () { //Could be wrapped in a setter for _commandLineAPI, to redefine only when the user started typing.
if (arguments.length > 0 && this.name === "evaluate" && arguments [0].constructor.name === "InjectedScriptHost") { //If thisArg is the evaluate function and the arg0 is the ISH
ish = arguments[0];
ish.evaluate = function (e) { //Redefine the evaluation behaviour
throw new Error ('Rejected evaluation of: \n\'' + e.split ('\n').slice(1,-1).join ("\n") + '\'');
};
Function.prototype.call = _call; //Reset the Function.prototype.call
return _call.apply(this, arguments);
}
};
}
Vous pourriez par exemple jeter une erreur, que l'évaluation a été rejetée.
Voici un exemple où l'expression est passée à un CoffeScript compilateur avant de passer à l' evaluate
fonction.