Совершенно случайно набрел на сразу несколько способов узнать, выполяется ли скрипт под браузерным отладчиком (firebug, chrome developer tools итп) Поделюсь с общественностью.
Метод первый
Работает везде кроме оперы.
Проверить вызывается ли console.log() Выводим на консоль переменную типа function и задаем формат %s Дебаггер пытается превратить значение в строку, чем запускает метод toString. А мы toString перехватываем (вариант: то же самое с форматом %d и методом toValue) Что характерно, нужна именно функция, простой объект не катит.
(дополнение: В хроме у=/some regular expression/ тоже катит)
Нюанс. IE однажды подцепив дебаггер, дальше его уже не отцепляет, а просто убирает с глаз долой. Потому код будет возвращать true даже после закрытия окна отладчика.
Метод второй.
Работает везде :yahoo:
Если метод toString приделать к функции, то он почему-то запускается при любом просмотре объекта в окошке дебаггера: watch, local variables итп <_< Хуже того, вызов приходит даже если скрипт стоит на паузе :o или завершился
Но почему все браузеры глючит????? :newconfus:
Исключение: Вывод значения через консоль в опере не перехватывается.
Метод третий.
Работает в Chrome/FF
Исгользуем css при выводе на консоль
Запрос к sniffer.png шлется только если отладчик открыт.
Метод четвертый.
Работает везде но не всегда.
Вывалиться самому в отладчик, через оператор debugger или по ошибке, потом проверить таймер. В принципе, известная фишка, привожу для полноты картины.
debugger сложно спрятать. ошибку спрятать проще
Увы, результат не гарантирован. Иногда браузеры в дебаггер валиться отказываются, внутри eval() особенно
.......
Еще есть идеи?
Метод первый
Работает везде кроме оперы.
Проверить вызывается ли console.log() Выводим на консоль переменную типа function и задаем формат %s Дебаггер пытается превратить значение в строку, чем запускает метод toString. А мы toString перехватываем (вариант: то же самое с форматом %d и методом toValue) Что характерно, нужна именно функция, простой объект не катит.
(дополнение: В хроме у=/some regular expression/ тоже катит)
Код:
function is_dbg () {
var d = false, y = function() {};
y.toString = function() { d = true; }
console && console.log("%s",y);
return d;
};
alert(is_dbg());
Нюанс. IE однажды подцепив дебаггер, дальше его уже не отцепляет, а просто убирает с глаз долой. Потому код будет возвращать true даже после закрытия окна отладчика.
Метод второй.
Работает везде :yahoo:
Если метод toString приделать к функции, то он почему-то запускается при любом просмотре объекта в окошке дебаггера: watch, local variables итп <_< Хуже того, вызов приходит даже если скрипт стоит на паузе :o или завершился
Но почему все браузеры глючит????? :newconfus:
Код:
function no_watch(m) {
var y = function() {
return m;
}
var s = ''+ s;
y.toString = function(x) {
m = x;
return s;
}
return y;
}
var a = no_watch(123);
// здесь посмотри в дебаггере на переменную a
// :)))
alert(a())
// присваеваем новое значение
a.toString(567);
// или здесь посмотри
alert(a());
Исключение: Вывод значения через консоль в опере не перехватывается.
Метод третий.
Работает в Chrome/FF
Исгользуем css при выводе на консоль
Код:
console.log(
'%c%s',
'background-image:url(http://mysite.com/sniffer.png)',
'some string');
Метод четвертый.
Работает везде но не всегда.
Вывалиться самому в отладчик, через оператор debugger или по ошибке, потом проверить таймер. В принципе, известная фишка, привожу для полноты картины.
Код:
function now() {
return +(new Date());
}
function is_dbg() {
var t = now();
debugger;
return now() < t+10;
}
alert(is_dbg());
debugger сложно спрятать. ошибку спрятать проще
Код:
function is_dbg() {
var t = now();
try { polny bred syntax error } catch(e) {}
return now() < t+10;
}
Увы, результат не гарантирован. Иногда браузеры в дебаггер валиться отказываются, внутри eval() особенно
.......
Еще есть идеи?