Documente Academic
Documente Profesional
Documente Cultură
Prlogo
Este completo manual sobre las operaciones internas de WebKit y Gecko es el
resultado de las extensas investigaciones realizadas por la desarrolladora israel Tali
Garsiel. Durante varios aos ha estado revisando toda la informacin publicada sobre
las caractersticas internas de los navegadores web (consulta la seccin Recursos) y ha
pasado mucho tiempo leyendo su cdigo fuente. Tali escribi lo siguiente:
"En los aos en los que Internet Explorer acaparaba el 90% del mercado, el
navegador se poda considerar poco ms que "caja negra", pero ahora que los
navegadores de cdigo abierto dominan ms de la mitad del mercado, es un buen
momento para echar un vistazo al interior de los navegadores y ver lo que
esconden. Bueno, lo que esconden millones de lneas de cdigo en C++..."
Tali ha publicado su investigacin en su sitio web, pero como sabamos que se mereca
un pblico ms amplio, lo hemos publicado aqu tambin tras hacer algunas
modicaciones.
Como desarrolladora web, conocer las caractersticas internas de las operaciones
de los navegadores sirve para tomar mejores decisiones y para conocer los
motivos que justican las prcticas de desarrollo recomendadas. Aunque se trata
de un documento bastante extenso, te recomendamos que dediques un poco de tu
tiempo a examinarlo. Ten por seguro que no te arrepentirs.
Paul Irish, Relaciones con desarrolladores de Chrome
Introduccin
Los navegadores son probablemente el software ms utilizado de todos. En este
manual se explica su funcionamiento interno. Veremos qu ocurre cuando escribes
pantalla.
ndice
1. Introduccin
1. Los navegadores de los que hablaremos
2. La funcin principal de un navegador
3. Componentes principales del navegador
2. El motor de renderizacin
1. Motores de renderizacin
2. El ujo principal
3. Ejemplos del ujo principal
3. Anlisis y construccin del rbol de DOM
1. Anlisis (general)
1.
2.
3.
4.
5.
6.
7.
Gramticas
Analizador: combinacin de analizadores lxicos
Traduccin
Ejemplo de anlisis
Deniciones formales de vocabulario y sintaxis
Tipos de analizadores
Cmo generar analizadores automticamente
2. Analizador de HTML
1.
2.
3.
4.
5.
6.
7.
8.
9.
3. Anlisis de CSS
1. Analizador de CSS de WebKit
4. Orden de procesamiento de secuencias de comandos y hojas de estilo
1. Secuencias de comandos
2. Anlisis especulativo
3. Hojas de estilo
4. Construccin del rbol de renderizacin
1. Relacin del rbol de renderizacin con el rbol de DOM
2. El ujo de construccin del rbol
3. Computacin de estilos
1. Datos de estilo compartidos
6. Pintura
1.
2.
3.
4.
Global e incremental
Orden del proceso de pintura
Lista de visualizacin de Firefox
Almacenamiento de guras rectangulares de WebKit
7. Cambios dinmicos
8. Subprocesos del motor de renderizacin
1. Bucle de eventos
9. Modelo de formato visual de CSS2
1.
2.
3.
4.
5.
El elemento canvas
Modelo de cajas de CSS
Esquema de posicionamiento
Tipos de cajas
Posicionamiento
1. Relativo
2. Flotante
3. Absoluto y jo
6. Representacin en capas
10. Recursos
El motor de renderizacin
La responsabilidad del motor de renderizacin es "renderizar", es decir, mostrar el
contenido solicitado en la pantalla del navegador.
De forma predeterminada, el motor de renderizacin puede mostrar imgenes y
documentos HTML y XML. Puede mostrar otros tipos mediante el uso de
complementos (o extensiones); por ejemplo, puede mostrar documentos PDF
mediante un complemento capaz de leer archivos PDF. Sin embargo, en este captulo
nos centraremos en su uso principal: mostrar imgenes y cdigo HTML con formato
denido con CSS.
Motores de renderizacin
Nuestros navegadores de referencia (Firefox, Chrome y Safari) estn basados en dos
motores de renderizacin. Firefox utiliza Gecko, un motor de renderizacin propio de
Mozilla. Tanto Safari como Chrome utilizan WebKit.
WebKit es un motor de renderizacin de cdigo abierto que empez siendo un motor
de la plataforma Linux y que fue modicado posteriormente por Apple para hacerlo
compatible con Mac y Windows. Puedes obtener ms informacin en webkit.org.
El ujo principal
El motor de renderizacin empieza recibiendo el contenido del documento solicitado
desde la capa de red, normalmente en fragmentos de 8.000 bytes.
A continuacin, el motor de renderizacin realiza este ujo bsico:
En las guras 3 y 4 se puede ver que, aunque WebKit y Gecko utilizan una terminologa
ligeramente diferente, el ujo es bsicamente el mismo.
Gecko denomina al rbol de elementos formateados visualmente "rbol de marcos".
Cada uno de los elementos es un marco. WebKit utiliza los trminos "rbol de
renderizacin" y "objetos de renderizacin" en lugar de los anteriores. WebKit utiliza el
trmino "diseo" para colocar los elementos, mientras que Gecko lo denomina
"reujo". WebKit utiliza el trmino "asociacin" para conectar los nodos DOM con
informacin visual para crear el rbol de renderizacin. Una pequea diferencia no
semntica es que Gecko dispone de una capa extra entre el cdigo HTML y el rbol de
DOM. Esta capa se denomina "depsito de contenido" y est dedicada a la creacin
de elementos DOM. Vamos a ver cada una de las partes del ujo:
Anlisis (general)
Dado que el anlisis es un proceso muy importante del motor del renderizacin, vamos
a verlo de una forma ms detallada. Comencemos por una breve introduccin a este
proceso.
Analizar un documento signica traducirlo a una estructura que tenga sentido, es decir,
algo que el cdigo pueda comprender y utilizar. El resultado del anlisis suele ser un
rbol de nodos que representa la estructura del documento. Este rbol se denomina
"rbol de anlisis" o "rbol de sintaxis".
Ejemplo: el anlisis de la expresin 2 + 3 - 1 podra dar como resultado este rbol:
Gramticas
El anlisis se basa en las reglas de sintaxis por las que se rige el documento, es decir,
el lenguaje o el formato en el que est escrito. Todos los formatos que se pueden
analizar deben tener una gramtica determinista formada por un vocabulario y unas
reglas de sintaxis. Esto se denomina gramtica libre de contexto. Los lenguajes
humanos no son de este tipo y, por tanto, no se pueden analizar con tcnicas de
anlisis convencionales.
Traduccin
Muchas veces, el rbol de anlisis no es el producto nal. El anlisis se utiliza
frecuentemente en la traduccin, es decir, en la conversin del documento de entrada
a otro formato. Un ejemplo sera la compilacin. El compilador, que compila un cdigo
fuente en cdigo de mquina, en primer lugar lo convierte en un rbol de anlisis y, a
continuacin, traduce el rbol a un documento de cdigo de mquina.
Ejemplo de anlisis
En la gura 5 se observa un rbol de anlisis creado a partir de una expresin
matemtica. Intentemos denir un lenguaje matemtico simple y veamos el proceso de
anlisis.
Vocabulario: nuestro lenguaje puede incluir nmeros enteros, el signo ms y el signo
menos.
Sintaxis:
1. Los bloques de construccin de la sintaxis del lenguaje son expresiones,
trminos y operaciones.
2. Nuestro lenguaje puede incluir cualquier cantidad de expresiones.
3. Una expresin est formada por un "trmino" seguido de una "operacin" y de
otro trmino.
4. Una operacin es un token de suma o un token de resta.
5. Un trmino es un token de nmero entero o una expresin.
Analicemos la entrada 2 + 3 - 1 .
La primera subcadena que coincide con una regla es 2 ; segn la regla 5, es un
trmino. La segunda coincidencia es 2 + 3 , que coincide con la tercera regla (un
trmino seguido de una operacin y de otro trmino). La siguiente coincidencia solo se
utilizar al nal de la entrada. 2 + 3 - 1 es una expresin porque ya sabemos que
Como se puede observar, los nmeros enteros se denen mediante una expresin
regular.
La sintaxis normalmente se dene en un formato denominado notacin de BackusNaur (BNF). Nuestro idioma se denir de la siguiente forma:
expression := term operation
operation := PLUS | MINUS
term := INTEGER | expression
term
Tipos de analizadores
Existen dos tipos bsicos de analizadores: los descendentes y los ascendentes.
Utilizando una explicacin intuitiva, podramos decir que los analizadores
descendentes comprueban la estructura de nivel superior de la sintaxis e intentan
buscar una coincidencia, mientras que los analizadores ascendentes comienzan con
los datos de entrada y los van transformando gradualmente mediante las reglas
sintcticas empezando por el nivel ms bajo hasta que se cumplen las reglas de nivel
superior.
Veamos cmo analizan el contenido de ejemplo estos dos tipos de analizadores:
Un analizador descendente empieza desde la regla de nivel superior: identica 2 + 3
como una expresin. A continuacin, identica 2 + 3 - 1 como expresin (el
proceso de identicar la expresin se desarrolla buscando coincidencias con el resto
de las reglas, pero se empieza por la regla de nivel superior).
El analizador ascendente analiza los datos de entrada hasta que encuentra una
coincidencia con una regla y, a continuacin, sustituye la entrada coincidente con la
regla. Este proceso contina hasta que se analizan todos los datos de entrada. Las
expresiones con coincidencias parciales se colocan en la pila del analizador.
Pila
Entrada
2 + 3 - 1
trmino
+ 3 - 1
3 - 1
expresin
- 1
operacin de la expresin
expresin
Este tipo de analizador ascendente se conoce como analizador de desplazamientoreduccin debido a que los datos de entrada se desplazan hacia la derecha (imagina
un puntero que apunta primero al inicio de los datos de entrada y a continuacin se
desplaza hacia la derecha) y gradualmente se reducen segn las reglas sintcticas.
Analizador de HTML
El trabajo del analizador de HTML es analizar las marcas HTML y organizarlas en un
rbol de anlisis.
DTD DE HTML
La denicin de HTML est en formato DTD. Este formato se utiliza para denir
lenguajes de la familia SGML. Contiene deniciones de todos los elementos
permitidos, de sus atributos y de su jerarqua. Como vimos antes, la denicin DTD del
lenguaje HTML no forma una gramtica libre de contexto.
Existen algunas variaciones de la denicin DTD. El modo estricto se ajusta
nicamente a las especicaciones, pero otros modos admiten el marcado utilizado
anteriormente por los navegadores. El objetivo es mantener la compatibilidad con el
contenido ms antiguo. La denicin DTD estricta actual se encuentra en la siguiente
pgina: www.w3.org/TR/html4/strict.dtd
DOM
El rbol de salida ("rbol de anlisis") est formado por elementos DOM y nodos de
atributo. DOM son las siglas de "Document Object Model" (modelo de objetos del
documento). Es la presentacin de objetos del documento HTML y la interfaz de los
El algoritmo de anlisis
Como vimos en las secciones anteriores, el lenguaje HTML no se puede analizar
mediante los analizadores ascendentes y descendentes normales.
Las razones son:
El algoritmo de tokenizacin
Se pueden ver los algoritmos completos para tokenizacin y la construccin del rbol
en la especicacin de HTML5.
Tabla perdida
Una tabla perdida es una tabla incluida en el contenido de otra tabla, pero no en una
celda.
Ejemplo:
<table>
<table>
<tr><td>inner table</td></tr>
</table>
<tr><td>outer table</td></tr>
</table>
</table>
<table>
<tr><td>inner table</td></tr>
</table>
Cdigo:
if (m_inStrayTableContent && localName == tableTag)
popBlock(tableTag);
WebKit utiliza una pila para el contenido del elemento actual y saca la tabla interna de
la pila de la tabla externa. Las tablas se encontrarn en el mismo nivel de la jerarqua.
Se tolera que HTML se rompa totalmente. Nunca cerramos la etiqueta del cuerpo
(body), ya que algunas pginas web cometen el error de cerrarla antes de que haya
acabado el documento. Por eso, nos jamos en la llamada "end()" para cerrar
elementos.
Anlisis de CSS
Os acordis de los conceptos de anlisis que vimos en la introduccin? A diferencia
del lenguaje HTML, CSS tiene una gramtica libre de contexto y se puede analizar con
los tipos de analizadores descritos en la introduccin. De hecho, la especicacin del
lenguaje CSS dene su gramtica sintctica y lxica.
Veamos algunos ejemplos:
La gramtica lxica (el vocabulario) se dene mediante expresiones regulares para
cada token:
comment
\/\*[^*]*\*+([^/*][^*]*\*+)*\/
num
[0-9]+|[0-9]*"."[0-9]+
nonascii
nmstart
nmchar
name
ident
[\200-\377]
[_a-z]|{nonascii}|{escape}
[_a-z0-9-]|{nonascii}|{escape}
{nmchar}+
{nmstart}{nmchar}*
"div.error" y "a.error" son selectores. La parte entre llaves contiene las reglas que se
aplican a este conjunto de reglas. Esta estructura se dene formalmente en esta
denicin:
ruleset
: selector [ ',' S* selector ]*
'{' S* declaration [ ';' S* declaration ]* '}' S*
;
Anlisis especulativo
Tanto WebKit y Firefox utilizan esta optimizacin. Al ejecutar las secuencias de
comandos, otro subproceso analiza el resto del documento, busca en la red otros
recursos necesarios y los carga. De esta forma, los recursos se pueden cargar
mediante conexiones paralelas, lo que mejora la velocidad general. Nota: el analizador
especulativo no modica el rbol de DOM (de eso se encarga el analizador principal),
solo analiza las referencias a recursos externos, como secuencias de comandos
externas, hojas de estilo e imgenes.
Hojas de estilo
Las hojas de estilo, por otro lado, tienen un modelo diferente. Conceptualmente,
parece que, dado que las hojas de estilo no modican el rbol de DOM, no hay razn
para esperarlas y detener el anlisis del documento. Sin embargo, se produce una
incidencia cuando las secuencias de comandos solicitan informacin de estilo durante
la fase de anlisis del documento. Si el estilo an no se ha cargado ni analizado, la
secuencia de comandos obtendr respuestas incorrectas y, aparentemente, esto
causar muchas complicaciones. Parece que se trata de un caso extremo, pero es
bastante comn. Firefox bloquea todas las secuencias de comandos si todava se est
cargando y analizando una hoja de estilo. WebKit bloquea las secuencias de
comandos solo cuando intentan acceder a determinadas propiedades de estilo que se
pueden ver afectadas por las hojas de estilo descargadas.
El tipo de elemento tambin se tiene en cuenta. Por ejemplo, las tablas y los controles
de los formularios tienen marcos especiales.
En WebKit, si un elemento quiere crear un renderizador especial, sobrescribe el
mtodo createRenderer. Los renderizadores apuntan a objetos de estilo que
contienen la informacin no geomtrica.
Computacin de estilos
Para crear el rbol de renderizacin, es necesario calcular las propiedades visuales de
cada uno de los objetos de renderizacin. Para hacerlo, hay que calcular las
propiedades de estilo de cada elemento.
El estilo incluye hojas de estilo de varios orgenes, elementos de estilo integrados y
propiedades visuales en el cdigo HTML (como la propiedad "bgcolor"). Estas ltimas
se transforman en las propiedades de estilo de CSS correspondientes.
Los orgenes de las hojas de estilo son las hojas de estilo predeterminadas del
navegador, las proporcionadas por el autor de la pgina y las proporcionadas por el
usuario del navegador (los navegadores permiten al usuario denir su estilo favorito. En
Firefox, por ejemplo, se puede hacer colocando una hoja de estilo en la carpeta de
perles del navegador).
La computacin de estilos conlleva algunas dicultades:
1. Al contener las numerosas propiedades de los estilos, los datos de estilo llegan a
alcanzar unas dimensiones considerables, lo que puede provocar un uso
excesivo de memoria.
2. La bsqueda de las reglas coincidentes de cada elemento puede afectar al
rendimiento si no se optimiza el proceso. Recorrer la lista completa de reglas de
cada elemento para encontrar coincidencias es una tarea muy pesada. Los
selectores pueden tener una estructura compleja, lo que puede hacer que se
empiece a buscar en una ruta que aparentemente sea buena, pero que
nalmente no sea as y se deba probar con otra ruta.
Pongamos como ejemplo este selector complejo:
div div div div{
...
}
Los contextos de estilo incluyen valores nales. Para computar los valores, se aplican
todas las reglas con las que se hayan encontrado coincidencias en el orden correcto y
se realizan manipulaciones que transforman los valores lgicos en concretos. Por
ejemplo, si el valor lgico es un porcentaje de la pantalla, se calcular y se
transformar en unidades absolutas. La idea del rbol de reglas es muy ingeniosa, ya
que permite compartir estos valores entre nodos para evitar que se vuelvan a
computar. Adems, ahorra espacio.
Todas las reglas con las que se encuentra alguna coincidencia se almacenan en un
rbol. Los nodos inferiores de una ruta tienen mayor prioridad. El rbol incluye todas
las rutas de las coincidencias que se han encontrado para una regla. Las reglas se
almacenan lentamente. El rbol no se computa al principio de cada nodo, pero siempre
que se debe computar el estilo de un nodo, las rutas se aaden al rbol.
La idea es que las rutas del rbol se muestren como las palabras de un lexicn.
Imaginemos, por ejemplo, que ya hemos computado este rbol de reglas:
Divisin en estructuras
Los contextos de estilo se dividen en estructuras que incluyen informacin de estilo de
una cierta categora, como el borde o el color. Todas las propiedades de un estructura
pueden ser heredadas o no heredadas. Las propiedades heredadas son propiedades
que, a menos que las dena el elemento, se heredan del elemento principal. Las
propiedades no heredadas (denominadas propiedades "reset") utilizan los valores
predeterminados en caso de que no se denan.
El rbol guarda en cach estructuras completas (que incluyen los valores nales
computados) del rbol. De esa forma, si el nodo inferior no proporciona una denicin
para una estructura, se puede utilizar una estructura guardada en cach de un nodo
superior.
1.
2.
3.
4.
5.
6.
div {margin:5px;color:black}
.err {color:red}
.big {margin-top:3px}
div span {margin-bottom:4px}
#div1 {color:blue}
#div2 {color:green}
Para simplicar la tarea, digamos que tenemos que completar solo dos estructuras: la
estructura de color y la estructura de margen. La estructura de color solo contiene un
miembro, el color, mientras que la estructura de margen contiene los cuatro lados.
El rbol de reglas que se obtiene tendr la siguiente apariencia (los nodos se marcan
as: "nombre del nodo : nmero de la regla a la que apunta"):
El rbol de contextos tendr la siguiente apariencia (nombre del nodo : nodo de regla a
la que apunta):
El elemento de prrafo, que es un elemento secundario del elemento "div" del rbol de
contextos, podra compartir la misma estructura de fuente que el elemento principal.
Este caso se podra aplicar si no se especicasen reglas de fuente para el prrafo.
En WebKit, no existen los rboles de reglas, por lo que las declaraciones que coinciden
se recorren cuatro veces. En primer lugar, se aplican las propiedades de alta prioridad
de menor importancia (estas propiedades se deben aplicar primero porque hay otras
que dependen de ellas, como "display"); a continuacin, se aplican las propiedades de
alta prioridad de mayor importancia; posteriormente, las propiedades de prioridad
normal de menor importancia y, por ltimo, las reglas de prioridad normal de mayor
importancia. Esto signica que las propiedades que aparezcan varias veces se
resolvern segn el orden de cascada correcto. La ltima es la ms importante.
En resumen, compartir objetos de estilo (ya sea en su totalidad o compartiendo
solamente algunas de sus estructuras) soluciona las incidencias 1 y 3. El rbol de
Las dos ltimas fuentes coinciden fcilmente con el elemento, ya que este incluye los
atributos de estilo, y los atributos HTML se pueden asignar utilizando el elemento
como clave.
Como se coment previamente en la incidencia 2, buscar una coincidencia con la regla
de CSS puede resultar bastante complicado. Para resolver esta dicultad, las reglas se
manipulan para facilitar el acceso.
Despus de analizar la hoja de estilo, las reglas se aaden a uno de varios mapas
hash, de acuerdo con el selector. Existen mapas organizados por ID, nombre de clase
y nombre de etiqueta, y un mapa general para todo lo que no se puede incluir en estas
categoras. Si el selector es un ID, la regla se aadir al mapa de ID; si es una clase, se
aadir al mapa de clase, etc.
Esta manipulacin facilita considerablemente la tarea de asignacin de reglas. No hace
falta revisar cada declaracin, podemos extraer las reglas relevantes para un elemento
de los mapas. Esta optimizacin elimina ms del 95% de las reglas, por lo que ni
siquiera es necesario tenerlas en cuenta durante el proceso de bsqueda de
coincidencias (4.1).
Analicemos las reglas de estilo que se incluyen a continuacin:
p.error {color:red}
#messageDiv {height:50px}
div {margin:5px}
En primer lugar, intentaremos buscar reglas para el elemento "p". El mapa de clase
incluir una clave "error" dentro de la que se encuentra la regla para "p.error". El
elemento "div" tendr reglas relevantes en el mapa de ID (la clave es el ID) y el mapa
de etiqueta. Por tanto, solo queda averiguar qu reglas extradas de las claves
realmente coinciden.
Por ejemplo, si la regla del elemento "div" fuera la siguiente:
table div {margin:5px}
Especi cidad
La especicacin de CSS2 dene la especicidad del selector como se indica a
continuacin:
"1" si la declaracin es de un atributo "style" en lugar de una regla con un
selector; en caso contrario, "0" (= a),
nmero de atributos de ID del selector (= b),
nmero de otros atributos y pseudoclases del selector (= c),
nmero de nombres de elementos y de pseudoelementos del selector (= d).
La especicidad se obtiene al concatenar los cuatro nmeros a-b-c-d (en un sistema
de nmeros de base amplia).
La base numrica que se debe utilizar es el nmero de recuento ms elevado de una
de las categoras.
Por ejemplo, si a=14, se puede utilizar una base hexadecimal. En el improbable caso
de que a=17, se deber utilizar una base numrica de 17 dgitos. El ltimo caso sera el
de un selector como html body div div p... con 17 etiquetas en el selector, pero esto es
muy poco probable.
Algunos ejemplos:
*
{}
li
{}
li:first-line {}
ul li
{}
ul ol+li
{}
h1 + *[rel=up]{}
ul ol li.red {}
li.red.level {}
#x34y
{}
style=""
/*
/*
/*
/*
/*
/*
/*
/*
/*
/*
a=0
a=0
a=0
a=0
a=0
a=0
a=0
a=0
a=0
a=1
b=0
b=0
b=0
b=0
b=0
b=0
b=0
b=0
b=1
b=0
c=0
c=0
c=0
c=0
c=0
c=1
c=1
c=2
c=0
c=0
d=0
d=1
d=2
d=2
d=3
d=1
d=3
d=1
d=0
d=0
->
->
->
->
->
->
->
->
->
->
specificity
specificity
specificity
specificity
specificity
specificity
specificity
specificity
specificity
specificity
=
=
=
=
=
=
=
=
=
=
0,0,0,0
0,0,0,1
0,0,0,2
0,0,0,2
0,0,0,3
0,0,1,1
0,0,1,3
0,0,2,1
0,1,0,0
1,0,0,0
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
Despus de buscar coincidencias, las reglas se ordenan segn las reglas de cascada.
WebKit utiliza el ordenamiento de burbuja para listas pequeas y el ordenamiento por
mezcla para listas grandes. WebKit ordena las reglas sobrescribiendo el operador ">"
para las reglas:
static bool operator >(CSSRuleData& r1, CSSRuleData& r2)
{
int spec1 = r1.selector()->specificity();
int spec2 = r2.selector()->specificity();
return (spec1 == spec2) : r1.position() > r2.position() :
spec1 > spec2;
}
Proceso gradual
WebKit utiliza un indicador que muestra si se han cargado todas las hojas de estilo de
nivel superior (incluidas las de @imports). Si las hojas de estilo no se cargan por
completo al asociarlas, se utilizan marcadores de posicin (indicndolo en el
documento), que se vuelven a calcular una vez que se han cargado las hojas de estilo.
Diseo
Cuando el renderizador se crea y se aade al rbol, no tiene posicin ni tamao. El
clculo de estos valores se conoce como diseo o reujo.
HTML utiliza un modelo de diseo basado en ujo, lo que signica que, la mayora de
las veces, los clculos geomtricos se pueden realizar con una sola operacin. Los
elementos que entran posteriormente "en el ujo" no suelen inuir en la geometra de
los elementos que ya se encuentran en l, por lo que el diseo se puede aplicar de
izquierda a derecha y de arriba a abajo en todo el documento. Hay excepciones, como
las tablas HTML, que pueden requerir ms de un clculo (3.5).
El sistema de coordenadas se reere al marco raz. Se utilizan las coordenadas
superior e izquierda.
El diseo consiste en un proceso recurrente. Se inicia en el renderizador raz, que
corresponde al elemento <html> del documento HTML. El diseo se aplica de forma
recurrente a travs de toda la jerarqua de marcos o de una parte de ella, calculando
informacin geomtrica para cada renderizador que lo requiere.
La posicin del renderizador raz es 0,0 y su dimensin es la ventana grca, es decir,
la parte visible de la ventana del navegador.
Todos los renderizadores incluyen un mtodo de "diseo" o de "reujo" y cada uno
activa el mtodo de diseo del elemento secundario al que se debe aplicar el diseo.
secundarios (3.6)
Optimizaciones
Cuando se activa un proceso de diseo por un "cambio de tamao" o por un cambio
en la posicin del renderizador (no en su tamao), el tamao de los renderizadores se
toma de una cach en lugar de recalcularse.
En algunos casos, solo se modica un subrbol, por lo que el proceso de diseo no se
inicia desde la raz. Esto puede suceder en aquellos casos en los que el cambio es
local y no afecta a los elementos que lo rodean, como el texto insertado en campos de
texto (de lo contrario, cada tecla activara un diseo desde la raz) .
El proceso de diseo
El proceso de diseo suele seguir el patrn que se indica a continuacin:
1. El renderizador principal determina su propio ancho.
2. El renderizador principal analiza los elementos secundarios y:
1. Sita el renderizador secundario (establece su valor x e y).
2. Activa la aplicacin del diseo del renderizador secundario en caso
necesario (si est marcado como "dirty", si se trata de un diseo global o
por alguna otra causa), lo que hace que se calcule la altura del renderizador
secundario.
3. El renderizador principal utiliza las alturas acumulativas de los elementos
secundarios y las alturas de los mrgenes y el relleno para establecer su propia
altura, que utilizar el elemento principal del renderizador principal.
4. Establece el bit de modicacin (dirty bit) en "false".
Salto de lnea
El salto de lnea se produce cuando un renderizador decide que debe interrumpirse en
mitad del diseo. Se detiene y comunica el salto al renderizador principal. El
renderizador principal crea renderizadores adicionales y activa sus procesos de diseo.
Pintura
En la fase de pintura, se recorre el rbol de renderizacin y se activa el mtodo de
"pintura" de los renderizadores para que se muestre su contenido en la pantalla. En la
fase de pintura, se utiliza el componente de infraestructura de la interfaz.
Global e incremental
Al igual que ocurre en la fase de diseo, la pintura tambin puede ser un proceso
global (se pinta el rbol de renderizacin completo) o incremental. En el caso de la
pintura incremental, algunos de los renderizadores se modican de una forma que no
afecta a la totalidad del rbol. El renderizador modicado invalida su rectngulo
correspondiente en la pantalla. Esto hace que el sistema operativo considere esta
regin como modicada y que genere un evento de "pintura". El sistema operativo
fusiona ingeniosamente varias regiones en una. En Chrome, esta operacin resulta ms
complicada, ya que el renderizador se encuentra en un proceso diferente al proceso
principal. Chrome simula el comportamiento del sistema operativo hasta cierto punto.
La presentacin escucha estos eventos y delega el mensaje en la raz de la
renderizacin. Se recorre el rbol hasta llegar al renderizador correspondiente. En
consecuencia, se vuelve a pintar el renderizador y, normalmente, sus elementos
secundarios.
Para optimizar el proceso, Firefox no aade elementos que vayan a quedar ocultos,
como los elementos que quedan totalmente ocultos bajo otros elementos opacos.
Cambios dinmicos
Los navegadores intentan ejecutar la menor cantidad posible de acciones cuando se
produce un cambio. Por tanto, si se producen cambios en el color de un elemento,
solo se volver a pintar ese elemento. Si se producen cambios en la posicin de un
elemento, se volver a disear y a pintar ese elemento, sus elementos secundarios y,
posiblemente, los elementos que estn a su mismo nivel. Si se aade un nodo DOM,
se activar un proceso de diseo y de nueva pintura del nodo. Si se producen cambios
de mayor importancia, como el aumento del tamao de fuente del elemento "html", se
invalidarn las cachs y se activar un nuevo proceso de diseo y de pintura del rbol
completo.
Bucle de eventos
El subproceso principal del navegador es un bucle de eventos, que consiste en un
bucle innito que mantiene activo el proceso. Espera a que se inicien eventos (como
los de diseo y pintura) y los procesa. Este es el cdigo de Firefox para el bucle de
eventos principal:
while (!mExiting)
NS_ProcessNextEvent(thread);
Esquema de posicionamiento
A continuacin se indican los tres tipos de esquemas disponibles.
1. Flujo normal: el objeto se coloca en funcin del lugar que ocupa en el documento
(esto signica que el lugar que ocupa en el rbol de renderizacin es similar al
lugar que ocupa en el rbol de DOM) y se disea de acuerdo con sus
dimensiones y con el tipo de caja.
2. Flotante: el objeto se disea primero segn el ujo normal y, posteriormente, se
mueve hacia la derecha o hacia la izquierda todo lo posible.
3. Posicionamiento absoluto: el objeto se coloca en el rbol de renderizacin de una
forma diferente a la que se utiliza para colocarlo en el rbol de DOM.
La propiedad "position" y el atributo "oat" determinan el esquema de
posicionamiento.
Si se utilizan "static" y "relative", se genera un ujo normal.
Si se utilizan "absolute" y "xed", se produce un posicionamiento absoluto.
Tipos de cajas
Caja de bloque: forma un bloque (tiene su propio rectngulo en la ventana del
navegador).
Las cajas de bloque se colocan en vertical, una detrs de otra, mientras que las cajas
integradas se distribuyen horizontalmente.
Las cajas integradas se colocan dentro de lneas o "cajas de lnea". Cuando las cajas
se alinean tomando como punto de referencia su base, es decir, la parte inferior de un
elemento se alinea con otra caja tomando como referencia una parte diferente a la
inferior, las lneas tienen como mnimo la misma altura que la caja ms alta, aunque
pueden ser ms altas. En caso de que el ancho del contenedor no sea suciente, las
cajas integradas se colocan en diferentes lneas. Esto es lo que suele ocurrir en un
prrafo.
Figura : lneas
Posicionamiento
Relativo
Posicionamiento relativo: el elemento se coloca normalmente y, a continuacin, se
mueve segn el diferencial correspondiente.
Flotante
Absoluto y jo
El diseo se dene con exactitud independientemente del ujo normal. El elemento no
participa en el ujo normal. Las dimensiones son relativas al contenedor. En el
posicionamiento jo, el contenedor es la ventana grca.
Figura : posicionamiento jo
Representacin en capas
Las capas se especican con la propiedad "z-index" de CSS. Representa la tercera
dimensin de la caja, es decir, su posicin a lo largo del "eje z".
Las cajas se dividen en pilas (denominadas "contextos de pila"). En cada pila, los
elementos que quedan debajo se pintan en primer lugar, y los elementos que quedan
encima se colocan en la parte superior, ms cerca del usuario. En caso de
superposicin, se oculta el elemento que queda debajo.
Las pilas se ordenan segn la propiedad "z-index". Las cajas que tienen la propiedad
"z-index" forman una pila local. La ventana grca forma la pila exterior.
Ejemplo:
<style type="text/css">
div {
position: absolute;
left: 2in;
top: 2in;
}
</style>
<p>
<div
style="z-index: 3;background-color:red; width: 1in;
height: 1in; ">
</div>
<div
style="z-index: 1;background-color:green;width: 2in;
height: 2in;">
</div>
</p>
Figura : posicionamiento jo
Recursos
1. Arquitectura del navegador
1. Grosskurth, Alan. A Reference Architecture for Web Browsers (pdf)
2. Gupta, Vineet. How Browsers Work - Part 1 - Architecture
2. Anlisis
1. Aho, Sethi, Ullman, Compilers: Principles, Techniques, and Tools, tambin
conocido como "The Dragon Book" (El libro del dragn), Addison-Wesley,
1986
2. Rick Jellie. The Bold and the Beautiful: two new drafts for HTML 5
3. Firefox
1. L. David Baron, Faster HTML and CSS: Layout Engine Internals for Web
Developers
2. L. David Baron, Faster HTML and CSS: Layout Engine Internals for Web
Developers (vdeo de Google Tech Talks)
3. L. David Baron, Mozilla's Layout Engine
4. L. David Baron, Mozilla Style System Documentation
5. Chris Waterson, Notes on HTML Reow
6. Chris Waterson, Gecko Overview
7. Alexander Larsson, The life of an HTML HTTP request
4. WebKit
Traducciones
Esta pgina se ha traducido al japons dos veces! Cmo funcionan los navegadores:
lo que hay detrs de los navegadores web actuales (ja) por @_kosei_ y
WEB
por @ikeike443 y
@kiyoto01. Gracias a todos!