Volver al Centro de conocimiento
Huella digital

Informe WebGL de BrowserLeaks: etapas y datos ausentes

Sigue los campos WebGL de BrowserLeaks desde el contexto hasta los parámetros, extensiones, precisión y píxeles, sin adivinar por qué falta un dato.

BotBrowser Team

Documentación

Quieres la documentación estructurada de Huella digital?

Este artículo forma parte de la biblioteca editorial. Para pasos de configuración, material de referencia y actualizaciones continuas, entra en la sección de docs.

Si un informe WebGL de BrowserLeaks muestra vacío el renderizador o el hash de imagen, ese vacío por sí solo no identifica la causa. La página pública combina descubrimiento del contexto, lecturas de parámetros normales, metadatos opcionales del renderizador, comprobaciones de precisión y un resumen criptográfico de píxeles renderizados. BotBrowser puede conservar un perfil declarado para una revisión WebGL autorizada, pero no puede explicar el campo ausente de un informe de terceros ni predecir la decisión de otro servicio. El análisis del código fuente WebGL de CreepJS sigue otro recolector y sus propias comparaciones entre contextos.

TL;DR

  • BrowserLeaks prueba una secuencia fija de nombres de contexto WebGL antes de recoger las filas del contexto seleccionado.
  • Las filas normales de getParameter, WEBGL_debug_renderer_info opcional, la precisión de sombreadores y un resumen posterior de readPixels son rutas distintas.
  • La ausencia del valor de renderizador sin máscara no demuestra que se bloquee una extensión, identifica una GPU o prueba el uso de una herramienta de privacidad o la automatización.
  • Anota la revisión de la página y la etapa que produjo el valor ausente; repite esa etapa con la misma versión del navegador y el mismo origen antes de comparar.
  • BotBrowser documenta controles de perfil para validar WebGL, no garantiza que BrowserLeaks u otro sitio muestre un valor concreto.

Contents

Cinco etapas con rótulos: descubrimiento del contexto, filas de parámetros, extensión opcional de renderizador, precisión de sombreadores y un hash separado de píxeles. Cada ausencia pertenece a su etapa.

Ver el vídeo

Este vídeo está narrado en inglés. Recorre las cinco etapas de recopilación y ejecuta un fixture controlado de cinco etapas en Chrome real: el resultado nativo de getContext('webgl2'), la cadena del renderizador que devuelve la extensión de depuración, un entero de precisión de shader y un búfer real de readPixels. El fixture reproduce el orden de etapas publicado; no mide el dispositivo de una persona concreta.

Empezar por las etapas de recopilación

La página WebGL pública de BrowserLeaks es una plantilla de informe con secciones separadas para detección de compatibilidad, huella WebGL, hash del informe, hash de imagen e imagen renderizada. El código de la página y su script muestran el orden de recopilación, pero descargar esos archivos no ejecuta el informe en un navegador. Por tanto, estos hallazgos son un mapa basado en el código fuente, no una afirmación sobre el resultado de un perfil en vivo.

El script prueba los nombres de contexto en este orden: webgl2, webgl, moz-webgl, webkit-3d y webgl2-compute. Para cada candidato crea un lienzo y llama a getContext; conserva el primer contexto utilizable y continúa con él. Llegar a una alternativa posterior no equivale a que haya tenido éxito el primer candidato, aunque ambas páginas terminen mostrando algunas filas.

Dos detalles del bucle importan cuando el informe parece incorrecto. Primero, el lienzo se crea con un tamaño fijo de 256 por 128 y se reutiliza en la etapa de dibujo, así que las dimensiones del búfer de dibujo describen ese lienzo y no la ventana del navegador. Segundo, cada intento pasa failIfMajorPerformanceCaveat: false y descarta un contexto cuyo isContextLost() ya devuelva verdadero. Un candidato que falla cualquiera de las dos pruebas se omite en silencio y el bucle continúa, lo que explica que un nombre alternativo produzca un informe completo mientras el primero no produce nada.

El recolector también guarda todos los contextos que logró obtener, no solo el seleccionado. El selector de contexto de la página se construye con esa lista, así que el número de nombres ofrecidos registra cuántos intentos tuvieron éxito. Si el selector solo muestra webgl, eso indica que webgl2 se intentó y se rechazó; no indica por qué ni significa que el navegador carezca de WebGL2 en general.

EtapaAcción del script públicoQué limita un resultado ausente
Descubrimiento del contextoPrueba nombres candidatos con un lienzo nuevoSi se obtuvo un contexto candidato; no explica por qué faltan campos posteriores
Filas de parámetrosResuelve cada ID como una constante del contexto y pasa esa constante a getParameterQué consulta normal no produjo un valor mostrable
Renderizador de depuraciónSolicita WEBGL_debug_renderer_info y lee las constantes sin máscara solo si obtiene un objetoSi esta ruta opcional devolvió un valor; no identifica por sí sola la GPU
PrecisiónLlama a los ayudantes de precisión del sombreado por separadoSi el ayudante de precisión produjo un resumen utilizable
Hash de imagenDibuja otra escena, lee un búfer de píxeles, lo serializa y calcula un resumenSi terminó esta ruta de renderizado/lectura; no indica si funcionó el recolector de parámetros
Hash del informeSerializa el objeto recolectado y resume esa serializaciónSi el objeto serializado fue estable entre capturas; no indica si alguna fila era correcta

La tabla sirve para leer el informe, no enumera todas las causas posibles en un navegador. Distintas etapas pueden producir el mismo espacio en blanco y la página no siempre muestra cuál falló. La guía general de huella WebGL cubre la superficie de señales más amplia y los controles de perfil documentados; aquí se interpreta específicamente el flujo del informe de BrowserLeaks.

Parámetros normales y datos opcionales del renderizador

Para las filas normales, BrowserLeaks recorre elementos .pname, lee el ID de cada uno, busca ese nombre en el contexto WebGL seleccionado y pasa a getParameter la constante resultante. Así, la tabla sirve como inventario de consultas, pero cada fila solo aporta evidencia sobre una consulta en un contexto. No describe por completo la GPU, y una fila vacía no revela si se omitió la consulta, si devolvió un valor que la interfaz no mostró o si ocurrió un fallo anterior.

Usar los ID de los elementos como nombres de propiedad tiene una consecuencia: los nombres de fila proceden de la página, mientras que las constantes consultadas proceden del contexto WebGL seleccionado. En el script publicado, n es ese contexto y cada ID listado se consulta como getParameter(n[id]). Una constante de la especificación ausente del marcado no aparecerá como fila, y añadir un ID que corresponda a una propiedad del contexto cambiaría el objeto recolectado sin que cambie el navegador.

Después del bucle, el colector fusiona tres fuentes que no son parámetros en el mismo objeto: los atributos devueltos por getContextAttributes(), las propiedades drawingBufferColorSpace y unpackColorSpace, y la lista de extensiones admitidas. Los atributos de contexto son los valores con los que se creó el contexto, no valores que el navegador informe sobre su hardware, y las dos propiedades de espacio de color son cadenas que siguen la configuración del canvas. Leerlos en una tabla plana es cómodo, pero responden a preguntas distintas de las de una fila de getParameter.

Los campos de fabricante y renderizador sin máscara usan otra ruta. El script llama primero a getExtension('WEBGL_debug_renderer_info'); solo si recibe un objeto de extensión lee las constantes UNMASKED_RENDERER_WEBGL y UNMASKED_VENDOR_WEBGL. MDN explica que getExtension() devuelve un objeto cuando la extensión está disponible y null cuando no lo está. Ese contrato explica la condición de la ruta, pero no identifica por qué falta una cadena sin máscara en un informe concreto. El análisis separado de los límites de privacidad de WEBGL_debug_renderer_info distingue ese estado de API de las afirmaciones sobre identidad.

Otros dos parámetros se leen mediante su propia extensión y no por la lista ordinaria: MAX_DRAW_BUFFERS_WEBGL desde WEBGL_draw_buffers, y MAX_TEXTURE_MAX_ANISOTROPY_EXT desde la primera de EXT_texture_filter_anisotropic, WEBKIT_EXT_texture_filter_anisotropic o MOZ_EXT_texture_filter_anisotropic que resuelva. Ambos están condicionados por una búsqueda de extensión, así que ambos pueden quedar vacíos por la misma razón que el renderizador sin máscara. En el marcado de la página estas filas aparecen junto a los parámetros ordinarios, lo que hace fácil pasar por alto la diferencia.

Mantén separados estos casos en la nota del informe:

ObservaciónAfirmación seguraSalto no respaldado
Existe la fila normal del renderizador, pero la fila sin máscara está vacíaSe mostró la fila normal; el valor opcional sin máscara no«El navegador oculta una GPU concreta»
La búsqueda de la extensión no devuelve objetoLa ruta opcional no tuvo un objeto que consultar«Una herramienta de privacidad la bloqueó»
No se seleccionó ningún contextoEste recolector no siguió con un contexto seleccionado«El navegador no tiene GPU»
Falta el campo en un informe guardadoEl artefacto guardado no contiene ese campo«Falló la llamada API original»

Cada salto inventa una causa no observada. Una segunda captura permite comprobar si se repite la misma etapa, pero no establece una causa sin registrar las condiciones que cambiaron.

La precisión y los píxeles son distintos

La precisión del sombreador procede de llamadas a getShaderPrecisionFormat, no se deduce de la cadena del renderizador de depuración. Un resumen de precisión y una etiqueta de renderizador pueden diferir sin que uno sea una copia dañada del otro. Si el consumidor del informe los expone, conserva por separado la etapa de sombreado, la clase de precisión, el rango y la precisión devueltos, y cualquier excepción o resultado ausente.

El informe presenta dos resúmenes de precisión distintos. Uno compara el resultado de alta precisión en coma flotante con el de precisión media para la misma etapa de sombreado y recurre al resultado medio cuando el alto informa precisión cero. El otro reduce dos consultas separadas, HIGH_FLOAT y HIGH_INT, a una etiqueta corta highp/mediump y highp/lowp. Una sola etiqueta de la tabla representa hasta tres llamadas auxiliares, y un valor que parece grueso puede venir del resultado de reserva y no del soporte real de precisión del navegador.

El hash de imagen sigue otra ruta. BrowserLeaks dibuja una escena WebGL pequeña, lee sus píxeles en un Uint8Array mediante readPixels, serializa la matriz y calcula un resumen de esa serialización. El resumen describe esa escena bajo el contexto y las condiciones de ejecución seleccionados. No es un parámetro API ni demuestra que se haya identificado una persona o un dispositivo.

El dibujo es un abanico fijo de segmentos generado por un bucle de 128 pasos entre 45 y 315 grados, trazado con LINE_STRIP y una matriz de proyección codificada en el script. Como la geometría proviene de constantes, un cambio en el hash de imagen apunta a la ruta de renderizado, al tamaño del lienzo, al espacio de color o a la lectura, no a un modelo de GPU distinto. El hash del informe cubre otra entrada: es un resumen del objeto serializado, así que cambia cuando cambia cualquier fila recolectada, incluidas las que no tienen relación con el renderizado.

Para comparar de forma controlada, conserva la revisión del informe, la versión del navegador, el sistema operativo, el origen, el nombre del contexto seleccionado, la ventana gráfica y la hora de recopilación. Compara filas de parámetros con filas de parámetros, datos de extensión con los mismos datos, precisión con la misma consulta y hashes solo si no cambió el dibujo ni la lectura. Si cambia únicamente el hash, revisa las entradas del dibujo y la lectura antes de atribuir la diferencia al renderizador o al perfil.

No reduzcas la evidencia a un único campo llamado «huella WebGL». Esa etiqueta oculta qué llamada produjo el valor y qué se puede repetir. Para diagnosticar la exportación de un informe o un problema de compatibilidad de página, es más útil un registro compacto con resultados separados por etapa.

Clasificar un campo ausente antes de interpretarlo

Empieza por la primera fila aplicable. La comprobación posterior distingue un problema de etapa de recopilación de un problema de presentación; no presupone un defecto concreto del navegador.

Conviene separar dos estados antes de consultar la tabla. Un valor que la página muestra como empty es un null o una cadena vacía devuelta por getParameter, es decir, una respuesta vacía y no una llamada ausente. Un valor que la página muestra como undefined significa que el objeto recolectado no tenía clave para esa fila, lo que apunta al paso de recopilación y no a la consulta. Las dos etiquetas se parecen en una captura y llevan a seguimientos distintos.

Dato ausentePrimera comprobaciónSeguimiento repetible
Todas las secciones WebGLSi se ejecutaron la comprobación de compatibilidad y el descubrimiento de contextoRecarga una vez con el mismo origen y versión; captura el contexto seleccionado o la etapa exacta del fallo
Un parámetroSi el ID de fila correspondiente existe en la revisión descargadaRepite esa consulta en una página de diagnóstico propia y conserva el tipo/valor devuelto o la excepción
Solo fabricante o renderizador sin máscaraSi la ruta opcional obtuvo un objeto de extensiónRegistra su disponibilidad aparte de la fila normal; no deduzcas una causa por su ausencia
Resumen de precisiónQué etapa y clase de precisión consultó el ayudanteRepite la misma llamada y conserva su resultado o excepción
Solo hash de imagenSi terminaron el dibujo, readPixels, la serialización y el cálculo del resumenConserva la revisión del dibujo y el resultado de lectura; no compares escenas distintas
Solo hash del informeSi cambió alguna fila recolectada entre capturasCompara primero los valores por fila; un hash distinto sin filas distintas indica un cambio en el orden de serialización

Si dos capturas difieren, anota qué se mantuvo constante y qué cambió. Una revisión de página, alternativa de contexto, origen, configuración de pantalla o escena diferentes pueden cambiar la ruta sin demostrar que cambió la identidad del navegador. A la inversa, dos informes coincidentes no prueban equivalencia entre aplicaciones no relacionadas.

La página conserva un interruptor de claves sin formato que reescribe la primera columna de la tabla. Al cambiarlo solo varía la etiqueta que ve el lector, no el objeto recolectado, así que dos capturas de la misma recolección pueden diferir en esa columna. Al comprobar si dos informes recolectaron las mismas filas, compara nombres de clave y no etiquetas.

Usar un registro controlado del informe

Este es un esquema de registro, no una salida de ejemplo. Completa los campos con el informe y tu captura; no copies un resultado esperado en un campo de observación.

{
  "toolUrl": "https://browserleaks.com/webgl",
  "capturedAt": "YYYY-MM-DDTHH:mm:ssZ",
  "pageRevision": "guardar la URL del script o el hash del contenido",
  "browserBuild": "anotar la versión real",
  "origin": "anotar el origen del informe",
  "selectedContext": "anotar el nombre real del contexto o null",
  "ordinaryParameterRows": "presente, ausente o error por fila",
  "debugRendererExtension": "objeto, null o no alcanzada",
  "precisionChecks": "anotar cada clase consultada y su resultado",
  "pixelRead": "completada, ausente o error",
  "imageDigest": "anotar solo si realmente aparece"
}

Este esquema mantiene junto al valor la revisión y el estado de recopilación para que una comparación posterior repita la misma ruta. No incluye un campo de veredicto: determinar si una aplicación acepta un entorno requiere evidencia de su contexto documentado y autorizado.

Un registro completado con una captura responde a una pregunta más estrecha que uno completado con varias. Una captura establece que una ruta produjo un valor bajo las condiciones anotadas. Varias capturas con una condición cambiada pueden mostrar si esa ruta es sensible al cambio, pero solo si el resto de los campos permaneció igual. El esquema registra las condiciones; no otorga una puntuación a la página.

FAQ

¿Un renderizador sin máscara vacío significa que se bloqueó la extensión?

No. Significa que el informe guardado no muestra ese valor. Registra si se alcanzó la ruta de la extensión y qué devolvió getExtension() antes de formular una afirmación más específica.

¿El hash de imagen es otro identificador de GPU?

Es un resumen de los píxeles renderizados por el script. Puede servir para comparar el mismo procedimiento de dibujo, pero no identifica por sí solo una GPU, un dispositivo ni una persona.

¿BotBrowser garantiza que estos campos coincidan con BrowserLeaks?

No. BotBrowser documenta controles de perfil para validar superficies del navegador con autorización. El informe depende de su script, la revisión de la página y las condiciones de ejecución, así que ningún ajuste garantiza un resultado o clasificación de terceros.

Sources

Conclusión práctica

Interpreta un informe WebGL de BrowserLeaks como varias rutas de recopilación, no como un único resultado de aprobado o fallido. Conserva por separado el contexto, los parámetros, la extensión opcional, la precisión y la lectura de píxeles; repite solo la etapa ausente con condiciones registradas. Una comparación construida con esas etapas registradas sigue siendo defendible, y una diferencia de renderizado sigue siendo una diferencia de renderizado.

#BrowserLeaks#Huella WebGL#Señales GPU#Privacidad#Diagnóstico Del Navegador

Este artículo forma parte de la guía: ¿Qué es la huella digital del navegador?

Lleva BotBrowser de la investigación a producción

Usa estas guías para entender el modelo y después avanzar hacia validación multiplataforma, contextos aislados y despliegue de navegador preparado para escalar.