Estoy buscando anular los comandos de la consola existente a través de mi extensión de Chrome; el motivo es que deseo registrar los registros de la consola para un sitio específico.

Desafortunadamente, parece que no puedo actualizar el DOM, esto es lo que he intentado hasta ahora:

// Run functions on page change
chrome.tabs.onUpdated.addListener( function (tabId, changeInfo, tab) {
    var s = document.createElement('script');
    // TODO: add "script.js" to web_accessible_resources in manifest.json
    s.src = chrome.runtime.getURL('core/js/app/console.js');
    s.onload = function() {
        this.remove();
    };
    (document.head || document.documentElement).appendChild(s);
});

Console.js

// Replace functionality of console log
console.defaultLog = console.log.bind(console);
console.logs = [];
console.log = function(){
    console.defaultLog.apply(console, arguments);
    console.logs.push(Array.from(arguments));
};

// Replace functionality of console error
console.defaultError = console.error.bind(console);
console.errors = [];
console.error = function(){
    console.defaultError.apply(console, arguments);
    console.errors.push(Array.from(arguments));
};

// Replace functionality of console warn
console.defaultWarn = console.warn.bind(console);
console.warns = [];
console.warn = function(){
    console.defaultWarn.apply(console, arguments);
    console.warns.push(Array.from(arguments));
};

// Replace functionality of console debug
console.defaultDebug = console.debug.bind(console);
console.debugs = [];
console.debug = function(){
    console.defaultDebug.apply(console, arguments);
    console.debugs.push(Array.from(arguments));
};

El script se ejecuta correctamente con una alerta ().

El objetivo para mí es acceder a console.logs, pero no está definido, lo que significa que no he tenido acceso al DOM, a pesar de haber inyectado un script.

Si no es posible, incluso una integración de terceros sería útil, es decir, ¿Java o C?

Cualquier pensamiento será muy apreciado :)

2
Oliver Kucharzewski 23 ago. 2020 a las 04:42

2 respuestas

La mejor respuesta

Encontré esta publicación y creo que Tampermonkey inyecta un script con la función inmediata que agregas en la página de extensión de Tampermonkey Chrome. encontró algo similar en extensiones como Wappalyzer, y se ve bien y seguro, puede usar WebRequest para inyectar a su sitio web el nuevo "polyfill" antes de que la página esté completamente cargada como dice la publicación.

Aquí el ejemplo de Wappalyzer que mencioné antes, esta es la carga de JS en StackOverflow con Wappalyzer usando la inyección de código, todavía no lo probé con Tampermonkey

enter image description here

EDITAR

Verificando Wappalyzer, cómo inyectar el código es la parte fácil, puede usar (Ejemplo de github de Wappalyzer):

const script = document.createElement('script')
script.setAttribute('src', chrome.extension.getURL('js/inject.js'))

Esto probablemente no solucionará su problema, este código se ejecuta después de que todo el contenido se haya cargado en el DOM. Sin embargo, puede encontrar cómo solucionar ese problema en esta publicación

Sugeriré usar el evento onCommitted (doc1 / doc2)

Usando el ejemplo de mozilla.org, tendrá algo como

 const filter = {
  url: //website to track logs
  [
    {hostContains: "example.com"},
    {hostPrefix: "developer"}
  ]
}

function logOnCommitted(details) {
  //Inject Script on webpage
}

browser.webNavigation.onCommitted.addListener(logOnCommitted, filter);
4
Chcamiloam 8 sep. 2020 a las 07:43

Podría valer la pena intentar redefinir todo el objeto de la consola:

const saved = window.console
window.console = {...saved, log: function(...args){ saved.log("Hello", ...args) }}

Pero probablemente sea imposible, porque los guiones de contenido viven en un mundo aislado:

Los mundos aislados no permiten que los scripts de contenido, la extensión y la página web accedan a las variables o funciones creadas por los demás. Esto también brinda a los scripts de contenido la capacidad de habilitar funciones que no deberían ser accesibles desde la página web.

Aunque en Tampermonkey este script funciona.
Creo que Tampermonkey maneja esto conociendo las sutilezas y rastreando los cambios en el mecanismo de protección del host de extensiones.

Por cierto, para tareas pequeñas, existe una alternativa decente a las extensiones de Chrome en forma de fragmentos de código.

1
Spatz 27 ago. 2020 a las 12:43