Расширения Chrome: захватить консольные журналы, невозможно? - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь кодировать крошечное расширение, чтобы в нижней части страницы отображалось всплывающее окно, указывающее, есть ли какие-либо предупреждения или ошибки в консоли (без открытых инструментов dev, которые могут раздражать на небольших мониторах).

После некоторых исследований я обнаружил, что нет прямого способа чтения с консоли. Но было предложено заменить console.log, console.warn и т. Д. Новыми методами, которые будут перехватывать вызовы и только затем вызывать оригинальные методы.

Вот где я сейчас нахожусь в моем content.js:

window.onload = () => {
  const logs = []
  let listener = null

  const methods = ['log', 'info', 'warn', 'error']

  methods.forEach(method => {
    // Saving the old method
    const save = console[method].bind(console)
    // Replacing the old method
    console[method] = (...args) => {
      save(...args)
      logs.push({ method, args })
      listener && listener()
    }
  })

  const popup = document.createElement('div')
  popup.classList.add('pinned-console-popup')
  document.body.appendChild(popup)

  const apply = () => {
    popup.classList.remove('warn')
    popup.classList.remove('error')
    const warnCount = logs.filter(({ method }) => method === 'warn').length
    const errorCount = logs.filter(({ method }) => method === 'error').length
    if(warnCount)
      popup.classList.add('warn')
    if(errorCount)
      popup.classList.add('error')
    popup.textContent = `${errorCount || warnCount || 0}`
  }

  apply()
  listener = apply
}

Я не знаю почему, но происходит нечто странное: методы заменяются, если я проверяю их сразу после forEach, я вижу, что они заменяются. Но затем, если я запускаю журнал или предупреждение из другого места, console все еще имеет старые методы, поэтому здесь ничего не сработает. Почему?

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