«Переопределение» объекта консоли Google Chrome - PullRequest
13 голосов
/ 26 мая 2011

Я имею дело с системой, в которой следующий код Javascript (который находится вне моего контроля) выполняется в начале страницы

if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}

Этот код, по-видимому, используется для создания макета console объект для предотвращения ошибок JavaScript в средах без консоли JavaScript.Это здорово, за исключением того, что он также не позволяет запустить консоль Google Chrome.Условный явно проверяет firebug, но это все

    if (!("console" in window) || !("firebug" in console))

Итак, есть ли способ сказать отладчику Chrome повторно инициализировать его консольный объект?То есть на простом английском языке скажем Chrome

Эй, вы знаете, когда вы загружаете страницу и определяете консольный объект для меня, который я буду использовать?Сделайте это снова, чтобы мы могли переопределить то, что сделал кто-то в пространстве пользователя.

Я понимаю, что мог бы сделать что-то вроде

console.firebug = "faketrue";

и получить условное завершение, но я ограничен в системе и не могу добавить JavaScript довышеприведенное совпадение переопределения консоли.Иными словами, нет, я не могу просто добавить немного кода JavaScript сразу после начала главы.

Ответы [ 6 ]

16 голосов
/ 26 мая 2011

Я полагаю, что вы могли бы сделать это с помощью внедрения iframe, а затем скопировать консольный объект iframe:

<script type="text/javascript">
console = {};
try {
    console.log('1');
} catch(e){
    alert('No console');
}
</script>
<iframe id="text"></iframe>
<script type="text/javascript">
console = window.frames[0].console;
try {
    console.log('test');
} catch(e){
    alert('No console');
}
</script>

http://jsfiddle.net/nmY6k/

Обратите внимание, это всего лишь демонстрация того, что концепциядолжно работать.

РЕДАКТИРОВАТЬ

С чистым кадром JS:

<script type="text/javascript">
console = {};
try {
    console.log('1');
} catch(e){
    alert('No console');
}
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console = window.frames[0].console;
try {
    console.log('test');
} catch(e){
    alert('No console');
}
</script>

http://jsfiddle.net/nmY6k/1/

РЕДАКТИРОВАТЬ

И, конечно, если вам необходимо впоследствии удалить элемент iframe:

<script type="text/javascript">
console = {};
try {
    console.log('1');
} catch(e){
    alert('No console');
}
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console = window.frames[0].console;
try {
    console.log('test');
} catch(e){
    alert('No console');
}
console.log(typeof window.frames);
document.body.removeChild(iframe);
console.log(typeof window.frames);
</script>
3 голосов
/ 26 мая 2011

В Google Chrome удаление объекта console работает:

<script>
window.console = {};
delete console;
console.log('still works');
</script>

Однако в Firefox 4 это, похоже, не работает. Это только начало.

1 голос
/ 22 января 2012

Вы можете написать довольно простой пользовательский скрипт для назначения консоли, как предложено выше. Затем перейдите в manifest.json для этого пользовательского сценария и измените настройку run_at (см. http://code.google.com/chrome/extensions/content_scripts.html) на document_start. Теперь пользовательский скрипт будет запускаться до того, как запустится любой из скриптов страницы, поэтому до того, как консоль испортится.

... редактировать ...

На самом деле, я отмечаю из http://blog.chromium.org/2011/07/chrome-extensions-now-with-more.html, что chrome также теперь поддерживает @ run-at, так что вы можете установить его, и вам даже не придется напрямую связываться с manifest.json. У них есть пример сценария с использованием @ run-at at document_start в http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/howto/userscript-runat/runat.user.js?view=markup

1 голос
/ 26 мая 2011

Это похоже на работу:

iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console = iframe.contentWindow.console;

Однако похоже, что вы не можете удалить iframe

0 голосов
/ 26 мая 2011

Исходя из того, что вы обеспокоены тем, что хотите использовать консоль в процессе разработки, вы можете создать простое расширение Chrome, которое определяет console.firebug, чтобы условие оценивалось как ложное. Таким образом, вам не нужно беспокоиться о каких-либо изворотливых действиях, которые могут возникнуть при использовании объекта консоли какого-либо другого фрейма, и вам не придется беспокоиться о повторной вставке и удалении хака при разработке / развертывании.

0 голосов
/ 26 мая 2011

Разве вы не можете поместить свой собственный скрипт прямо в заголовок HTML прямо вверху?

<script ...>
    if (console) { window.cache_console = console; }
</script>
</head>
<body>
... html ...

<script>
    window.console = window.cache_console;
</script>
</body>
</html>

Вы не можете получить намного раньше, чем прямо в ГОЛОВУ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...