Documentos de Académico
Documentos de Profesional
Documentos de Cultura
ACTUALIZACIONES RECURSOS
Cmo funcionan los navegadores: lo que hay detrs de los navegadores web actuales
By Tali Garsiel & Paul Irish Publicacin ago. 5, 2011 109 Comments and 5 Reactions
Prlogo
Est e complet o manual sobre las operaciones int ernas de WebKit y Gecko es el result ado de las ext ensas invest igaciones realizadas por la desarrolladora israel Tali Garsiel. Durant e varios aos ha est ado revisando t oda la informacin publicada sobre las caract erst icas int ernas de los navegadores web (consulta la seccin Recursos) y ha pasado mucho t iempo leyendo su cdigo fuent e. Tali escribi lo siguient e:
, pero como sabamos que se mereca un pblico ms amplio, lo hemos publicado aqu tambin
Como desarrolladora web, co no cer las caract erst icas int ernas de las o peracio nes de lo s navegado res sirve para t o mar mejo res decisio nes y para co no cer lo s mo t ivo s que just ifican las prct icas de desarro llo reco mendadas . Aunque se t rat a de un document o bast ant e ext enso, t e recomendamos que dediques un poco de t u t iempo a examinarlo. Ten por seguro que no t e arrepent irs.
Paul Irish, Relaciones con desarrolladores de Chrome
PDFmyURL.com
Introduccin
Los navegadores son probablement e el soft ware ms ut ilizado de t odos. En est e manual se explica su funcionamient o int erno. Veremos qu ocurre cuando escribes google.com en la barra de direcciones hast a que la pgina de Google aparece en la pant alla.
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 flujo principal 3. Ejemplos del flujo principal 3. Anlisis y construccin del rbol de DOM 1. Anlisis (general) 1. Gramticas 2. Analizador: combinacin de analizadores lxicos 3. Traduccin 4. Ejemplo de anlisis 5. Definiciones formales de vocabulario y sintaxis 6. Tipos de analizadores 7. Cmo generar analizadores automticamente 2. Analizador de HTML 1. Definicin de gramtica HTML 2. No es una gramtica libre de contexto 3. DTD de HTML 4. DOM
PDFmyURL.com
5. El algoritmo de anlisis 6. El algoritmo de tokenizacin 7. Algoritmo de construccin de rbol 8. Acciones al finalizar el anlisis 9. Tolerancia a errores de los navegadores 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 flujo de construccin del rbol 3. Computacin de estilos 1. Datos de estilo compartidos 2. rbol de reglas de Firefox 1. Divisin en estructuras 2. Cmo computar los contextos de estilo con el rbol de reglas 3. Cmo manipular las reglas para obtener coincidencias fcilmente 4. Cmo aplicar las reglas en el orden de cascada correcto 1. Orden en cascada de la hoja de estilo 2. Especificidad 3. Cmo ordenar las reglas 4. Proceso gradual 5. Diseo 1. Sistema de bit de modifiacin (dirty bit) 2. Diseo global e incremental
PDFmyURL.com
3. Diseo asncrono y sncrono 4. Optimizaciones 5. El proceso de diseo 6. Clculo del ancho 7. Salto de lnea 6. Pintura 1. Global e incremental 2. Orden del proceso de pintura 3. Lista de visualizacin de Firefox 4. Almacenamiento de figuras rectangulares de WebKit 7. Cambios dinmicos 8. Subprocesos del motor de renderizacin 1. Bucle de eventos 9. Modelo de formato visual de CSS2 1. El elemento canvas 2. Modelo de cajas de CSS 3. Esquema de posicionamiento 4. Tipos de cajas 5. Posicionamiento 1. Relativo 2. Flotante 3. Absoluto y fijo 6. Representacin en capas 10. Recursos
represent a el 60%. Por t ant o, en est os moment os los navegadores de cdigo abiert o const it uyen una part e import ant e del mercado de los navegadores.
1. Interfaz de usuario: incluye la barra de direcciones, el botn de avance/retroceso, el men de marcadores, etc. (en general, todas las partes visibles del navegador, excepto la ventana principal donde se muestra la pgina solicitada). 2. Motor de bsqueda: coordina las acciones entre la interfaz y el motor de renderizacin. 3. Motor de renderiz acin: es responsable de mostrar el contenido solicitado. Por ejemplo, si el contenido solicitado es HTML, ser el responsable de analizar el cdigo HTML y CSS y de mostrar el contenido analizado en la pantalla. 4. Red: es responsable de las llamadas de red, como las solicitudes HTTP. Tiene una interfaz independiente de la plataforma y realiza implementaciones en segundo plano para cada plataforma. 5. Servidor de la interfaz : permite presentar widgets bsicos, como ventanas y cuadros combinados. Muestra una interfaz genrica que no es especfica de ninguna plataforma. Utiliza mtodos de la interfaz de usuario del sistema operativo en segundo plano. 6. Intrprete de JavaScript: permite analizar y ejecutar el cdigo JavaScript. 7. Almacenamiento de datos: es una capa de persistencia. El navegador necesita guardar todo tipo de datos en el disco duro (por ejemplo, las cookies). La nueva especificacin de HTML (HTML5) define el concepto de "base de datos web", que consiste en una completa (aunque ligera) base de datos del navegador.
Es import ant e decir que Chrome, a diferencia de la mayora de los navegadores, implement a varias inst ancias del mot or de renderizacin,
PDFmyURL.com
una por cada pest aa. Cada pest aa represent a un proceso independient e. Chapt er 2
El motor de renderizacin
La responsabilidad del mot or de renderizacin es "renderizar", es decir , most rar el cont enido solicit ado en la pant alla del navegador . De forma predet erminada, el mot or de renderizacin puede most rar imgenes y document os HTML y XML. Puede most rar ot ros t ipos mediant e el uso de complement os (o ext ensiones); por ejemplo, puede most rar document os PDF mediant e un complement o capaz de leer archivos PDF . Sin embargo, en est e capt ulo nos cent raremos en su uso principal: most rar imgenes y cdigo HTML con format o definido con CSS.
Motores de renderizacin
Nuest ros navegadores de referencia (Firefox, Chrome y Safari) est n basados en dos mot ores de renderizacin. Firefox ut iliza Gecko, un mot or de renderizacin propio de Mozilla. Tant o Safari como Chrome ut ilizan WebKit . WebKit es un mot or de renderizacin de cdigo abiert o que empez siendo un mot or de la plat aforma Linux y que fue modificado post eriorment e por Apple para hacerlo compat ible con Mac y Windows. Puedes obt ener ms informacin en webkit .org .
El flujo principal
El mot or de renderizacin empieza recibiendo el cont enido del document o solicit ado desde la capa de red, normalment e en fragment os de 8.000 byt es. A cont inuacin, el mot or de renderizacin realiza est e flujo bsico:
El mot or de renderizacin empieza a analizar el document o HTML y conviert e las et iquet as en nodos DOM en un rbol denominado "rbol de cont enido". Analiza los dat os de est ilo, t ant o en los archivos CSS ext ernos como en los element os de est ilo. Los dat os de est ilo, junt o con las inst rucciones visuales del cdigo HTML, se ut ilizan para crear ot ro rbol: el rbol de renderizacin.
PDFmyURL.com
El rbol de renderizacin cont iene rect ngulos con at ribut os visuales, como el color y las dimensiones. Los rect ngulos est n organizados en el orden en el que aparecern en la pant alla. Una vez const ruido el rbol de renderizacin, se inicia un proceso de "diseo". Est o significa que a cada nodo se le asignan las coordenadas exact as del lugar de la pant alla en el que debe aparecer . La siguient e fase es la de pint ura, en la que se recorre el rbol de renderizacin y se pint a cada uno de los nodos ut ilizando la capa de servidor de la int erfaz de usuario. Es import ant e comprender que se t rat a de un proceso gradual. Para mejorar la experiencia del usuario, el mot or de renderizacin int ent ar most rar el cont enido en pant alla lo ant es posible. No esperar a que se analice el cdigo HTML para empezar a crear y disear el rbol de renderizacin. Se analizarn y se most rarn algunas part es del cont enido, mient ras que se sigue procesando el rest o del cont enido que llega de la red.
PDFmyURL.com
En las figuras 3 y 4 se puede ver que, aunque WebKit y Gecko ut ilizan una t erminologa ligerament e diferent e, el flujo es bsicament e el mismo. Gecko denomina al rbol de element os format eados visualment e "rbol de marcos". Cada uno de los element os es un marco. WebKit ut iliza los t rminos "rbol de renderizacin" y "objet os de renderizacin" en lugar de los ant eriores. WebKit ut iliza el t rmino "diseo" para colocar los element os, mient ras que Gecko lo denomina "reflujo". WebKit ut iliza el t rmino "asociacin" para conect ar los nodos DOM con informacin visual para crear el rbol de renderizacin. Una pequea diferencia no semnt ica es que Gecko dispone de una capa ext ra ent re el cdigo HTML y el rbol de DOM. Est a capa se denomina "depsit o de cont enido" y est dedicada a la creacin de element os DOM. Vamos a ver cada una de las part es del flujo: Chapt er 3
Anlisis (general)
Dado que el anlisis es un proceso muy import ant e del mot or del renderizacin, vamos a verlo de una forma ms det allada. Comencemos por una breve int roduccin a est e proceso. Analizar un document o significa t raducirlo a una est ruct ura que t enga sent ido, es decir , algo que el cdigo pueda comprender y ut ilizar . El result ado del anlisis suele ser un rbol de nodos que represent a la est ruct ura del document o. Est e rbol se denomina "rbol de anlisis" o
PDFmyURL.com
"rbol de sint axis". Ejemplo: el anlisis de la expresin 2 + 3 - 1 podra dar como result ado est e rbol:
Gramt icas
El anlisis se basa en las reglas de sint axis por las que se rige el document o, es decir , el lenguaje o el format o en el que est escrit o. Todos los format os que se pueden analizar deben t ener una gramt ica det erminist a formada por un vocabulario y unas reglas de sint axis. Est o se denomina gramt ica libre de cont ext o. Los lenguajes humanos no son de est e t ipo y, por t ant o, no se pueden analizar con t cnicas de anlisis convencionales.
PDFmyURL.com
El proceso de anlisis es it erat ivo. El analizador normalment e pide al analizador lxico un nuevo t oken e int ent a buscar coincidencias ent re el t oken y una de las reglas de sint axis. Si se encuent ra una coincidencia, se aade al rbol de anlisis un nodo correspondient e al t oken y el analizador solicit a ot ro t oken. Si no coincide con ninguna regla, el analizador almacena el t oken int ernament e y sigue solicit ando t okens hast a que encuent ra una regla que coincide con t odos los t okens almacenados int ernament e. Si no encuent ra ninguna regla, lanza una excepcin. Est o significa que el document o no se considera vlido por t ener errores de sint axis.
Traduccin
Muchas veces, el rbol de anlisis no es el product o final. El anlisis se ut iliza frecuent ement e en la t raduccin, es decir , en la conversin del document o de ent rada a ot ro format o. Un ejemplo sera la compilacin. El compilador , que compila un cdigo fuent e en cdigo de mquina, en primer lugar lo conviert e en un rbol de anlisis y, a cont inuacin, t raduce el rbol a un document o de cdigo de mquina.
PDFmyURL.com
Ejemplo de anlisis
En la figura 5 se observa un rbol de anlisis creado a part ir de una expresin mat emt ica. Int ent emos definir un lenguaje mat emt ico simple y veamos el proceso de anlisis. Vocabulario: nuest ro lenguaje puede incluir nmeros ent eros, el signo ms y el signo menos. Sint axis:
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.
PDFmyURL.com
Analicemos la ent rada 2 + 3 - 1 . La primera subcadena que coincide con una regla es 2 ; segn la regla 5, es un t rmino. La segunda coincidencia es 2 + 3 , que coincide con la t ercera regla (un t rmino seguido de una operacin y de ot ro t rmino). La siguient e coincidencia solo se ut ilizar al final de la ent rada. 2 + 3 - 1 es una expresin porque ya sabemos que 2+3 es un t rmino, as que t enemos un t rmino seguido de una operacin y de ot ro t rmino. 2 + + no coincide con ninguna regla, por lo que no sera una ent rada vlida.
La sint axis normalment e se define en un format o denominado not acin de Backus-Naur forma:
expression := term operation term operation := PLUS | MINUS term := INTEGER | expression
Dijimos que un lenguaje se puede analizar mediant e analizadores normales si su gramt ica es una gramt ica libre de cont ext o. Una definicin int uit iva de una gramt ica libre de cont ext o es una gramt ica que se puede expresar complet ament e en not acin de BackusNaur (BNF). Puedes consult ar una definicin formal en est e art culo de Wikipedia sobre las gramt icas libres de cont ext o .
Tipos de analizadores
Exist en dos t ipos bsicos de analizadores: los descendent es y los ascendent es. Ut ilizando una explicacin int uit iva, podramos decir que los analizadores descendent es comprueban la est ruct ura de nivel superior de la sint axis e int ent an buscar una coincidencia, mient ras que los analizadores ascendent es comienzan con los dat os de ent rada y los van t ransformando gradualment e mediant e las reglas sint ct icas
PDFmyURL.com
empezando por el nivel ms bajo hast a que se cumplen las reglas de nivel superior . Veamos cmo analizan el cont enido de ejemplo est os dos t ipos de analizadores: Un analizador descendent e empieza desde la regla de nivel superior: ident ifica 2 + 3 como una expresin. A cont inuacin, ident ifica 2 + 3 1 como expresin (el proceso de ident ificar la expresin se desarrolla buscando coincidencias con el rest o de las reglas, pero se empieza por la regla de nivel superior). El analizador ascendent e analiza los dat os de ent rada hast a que encuent ra una coincidencia con una regla y, a cont inuacin, sust it uye la ent rada coincident e con la regla. Est e proceso cont ina hast a que se analizan t odos los dat os de ent rada. Las expresiones con coincidencias parciales se colocan en la pila del analizador .
Pila trmino operacin del trmino expresin expresin Este tipo de analizador ascendente se conoce como analizador de desplazamiento-reduccin 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. Entrada 2+ 3-1 + 3-1 3-1 -1
operacin de la expresin 1
normal (t ambin se conocen como "Lex" y "Yacc"). La ent rada de Flex consist e en un archivo con definiciones de expresiones regulares de los t okens. La ent rada de Bison consist e en las reglas sint ct icas del lenguaje en format o BNF .
Analizador de HTML
El t rabajo del analizador de HTML es analizar las marcas HTML y organizarlas en un rbol de anlisis.
PDFmyURL.com
DTD DE HTM L
La definicin de HTML est en format o DTD. Est e format o se ut iliza para definir lenguajes de la familia SGML . Cont iene definiciones de t odos los element os permit idos, de sus at ribut os y de su jerarqua. Como vimos ant es, la definicin DTD del lenguaje HTML no forma una gramt ica libre de cont ext o. Exist en algunas variaciones de la definicin DTD. El modo est rict o se ajust a nicament e a las especificaciones, pero ot ros modos admit en el marcado ut ilizado ant eriorment e por los navegadores. El objet ivo es mant ener la compat ibilidad con el cont enido ms ant iguo. La
PDFmyURL.com
definicin DTD est rict a act ual se encuent ra en la siguient e pgina: www.w3.org/TR/ht ml4/st rict .dt d
DOM
El rbol de salida ("rbol de anlisis") est formado por element os DOM y nodos de at ribut o. DOM son las siglas de "Document Object Model" (modelo de objet os del document o). Es la present acin de objet os del document o HTML y la int erfaz de los element os HTML para el mundo ext erior , como JavaScript . La raz del rbol es el objet o Document .
El modelo DOM guarda una relacin casi de uno a uno con el marcado. Veamos un ejemplo de marcado:
<html> <body> <p> Hello World </p> <div> <img src="example.png"/></div> </body> </html> El marcado anterior se traducira en el siguiente rbol de DOM:
Al igual que el HTML, la organizacin W3C ha especificado el modelo DOM. Puedes consult arlo en la pgina www.w3.org/DOM/DOMTR
. Es
PDFmyURL.com
una especificacin genrica para la manipulacin de document os. Un mdulo especfico describe element os HTML especficos. Puedes consult ar las definiciones HTML en la pgina www.w3.org/TR/2003/REC-DOM-Level-2-HTML-20030109/idl-definit ions.ht ml . Cuando digo que el rbol cont iene nodos DOM, quiero decir que est const ruido con element os que implement an una de las int erfaces DOM. Los navegadores ut ilizan implement aciones concret as que t ienen ot ros at ribut os que el navegador ut iliza int ernament e.
El algorit mo de anlisis
Como vimos en las secciones ant eriores, el lenguaje HTML no se puede analizar mediant e los analizadores ascendent es y descendent es normales. Las razones son:
1. la naturaleza permisiva del lenguaje, 2. el hecho de que los navegadores presenten una tolerancia a errores tradicional para admitir casos bien conocidos de HTML no vlido, 3. la naturaleza iterativa del proceso de anlisis. Normalmente, el cdigo no cambia durante el anlisis. Sin embargo, en el caso del cdigo HTML, las etiquetas de secuencias de comandos que contienen document.write pueden aadir tokens adicionales, por lo que el proceso de anlisis llega a modificar los datos de entrada.
Al no poder ut ilizar las t cnicas de anlisis normales, los navegadores crean analizadores personalizados para analizar el cdigo HTML. El algorit mo de anlisis se describe de forma det allada en la especificacin de HTML5 la const ruccin del rbol. . El algorit mo present a dos fases: la t okenizacin y
La t okenizacin es el anlisis lxico, es decir , el anlisis y la conversin en t okens de los dat os de ent rada. Ent re los t okens HTML se encuent ran las et iquet as iniciales, las et iquet as finales y los valores de at ribut os. El t okenizador reconoce el t oken, lo enva al const ruct or del rbol y consume el siguient e carct er para reconocer el siguient e t oken, y as sucesivament e hast a llegar al final de los dat os.
PDFmyURL.com
El algorit mo de t okenizacin
El algorit mo produce un t oken HTML. El algorit mo se expresa como una mquina de est ado. Cada est ado consume uno o varios caract eres del flujo de ent rada y act ualiza el siguient e est ado de acuerdo con esos caract eres. La decisin est influenciada por el est ado de t okenizacin act ual y por el est ado de const ruccin del rbol. Est o significa que el mismo carct er consumido producir result ados diferent es para el siguient e est ado correct o en funcin del est ado act ual. El algorit mo es demasiado complejo para describirlo en su t ot alidad, as que veremos algunos ejemplos sencillos que nos ayudarn a comprender el principio. Ejemplo bsico de t okenizacin del siguient e cdigo HTML:
<html> <body> Hello world </body>
PDFmyURL.com
</html>
El est ado inicial es el de "est ado de dat os". Cuando se encuent ra el carct er < , el est ado cambia a est ado de et iquet a abiert a . Al consumir un carct er a-z , se crea el est ado "t oken de et iquet a inicial" y el est ado cambia a est ado de no mbre de et iquet a . Est e est ado se mant iene hast a que se consume el carct er > . Todos los caract eres se aaden al nombre del nuevo t oken. En nuest ro caso, el nuevo t oken es un t oken ht ml . Al llegar a la et iquet a > , se emit e el t oken act ual y el est ado cambia a est ado de dat o s . Se siguen los mismos pasos para la et iquet a <body> . Hast a ahora, se han emit ido las et iquet as ht ml y body . Ahora volvemos al est ado de dat o s . Al consumir el carct er H de Hello world , se crea y se emit e un t oken de carct er , y as sucesivament e hast a llegar al carct er < de </body> . Se emit e un t oken de carct er por cada uno de los caract eres de Hello world . Ahora volvemos al est ado de et iquet a abiert a . Al consumir la siguient e ent rada / , se crea un t oken de et iquet a final y se pasa al est ado de no mbre de et iquet a . De nuevo, el est ado se mant iene hast a llegar a > . A cont inuacin, se emit e el t oken de la nueva et iquet a y se vuelve al est ado de dat o s . La ent rada </ht ml> se t rat ar como el caso ant erior .
PDFmyURL.com
La ent rada a la fase de const ruccin del rbol es una secuencia de t okens de la fase de t okenizacin. El primer modo es el "mo do inicial". Si se recibe el t oken ht ml, se pasar al modo "previo a ht ml" y se volver a procesar el t oken en ese modo. Est o har que el element o "HTMLHt mlElement " se cree y se aada al objet o raz "Document ". El est ado cambiar a "ant es del encabezado ". Recibimos el t oken "body". Se crear implcit ament e un element o "HTMLHeadElement ", aunque no t engamos ningn t oken "head", y ese element o se aadir al rbol. Ahora pasamos al modo "en el encabezado " y, a cont inuacin, al modo "despus del encabezado ". El t oken del cuerpo se vuelve a procesar , se crea y se insert a un element o "HTMLBodyElement " y, por lt imo, el modo pasa a "en el cuerpo ". A cont inuacin, se reciben los t okens de los caract eres de la cadena "Hello world". El primero har que se cree y se insert e el nodo "Text ", al que se aadir el rest o de caract eres. La recepcin del t oken de finalizacin del cuerpo provocar una t ransferencia al modo "despus del cuerpo ". A cont inuacin, se recibir la et iquet a HTML final, que har que se pase al modo despus del cuerpo . Cuando se reciba el final del t oken del archivo, al anlisis finalizar.
PDFmyURL.com
<html> <mytag> </mytag> <div> <p> </div> Really lousy HTML </p> </html>
He debido de infringir un milln de reglas ("myt ag" no es una et iquet a est ndar , los element os "p" y "div" est n mal anidados, et c.), pero el navegador sigue most rndolo correct ament e y no muest ra ningn error . Por lo t ant o, una gran part e del cdigo del analizador corrige los errores del aut or de cont enido HTML. La gest in de errores es bast ant e consist ent e en los navegadores, pero lo ms increble es que no forma part e de la especificacin act ual de HTML. Al igual que los marcadores y los bot ones de avance y ret roceso, es algo que se ha ido desarrollando a lo largo de los aos. Hay algunas const rucciones HTML conocidas que no son vlidas y que se repit en en muchos sit ios. Los navegadores int ent an corregirlas de acuerdo con ot ros navegadores. En cambio, en la especificacin de HTML5 s se definen algunos de est os requisit os. WebKit lo resume en el coment ario que se encuent ra al principio de la clase de analizador de HTML.
PDFmyURL.com
Veamos algunos ejemplos de t olerancia a errores de WebKit : </br> en lugar de <br> Algunos sit ios ut ilizan </br> en lugar de <br>. Para poder ser compat ible con Int ernet Explorer y Firefox, WebKit t rat a la et iquet a como si fuera <br>. Cdigo:
if (t->isCloseTag(brTag) && m_document->inCompatMode()) { reportError(MalformedBRError); t->beginTag = true; } Nota: los errores se gestionan de forma interna, es decir, no se muestran al usuario.
Tabla perdida Una t abla perdida es una t abla incluida en el cont enido de ot ra t abla, pero no en una celda. Ejemplo:
<table> <table> <tr><td>inner table</td></tr> </table> <tr><td>outer table</td></tr> </table> WebKit cambiar la jerarqua de dos tablas secundarias: <table> <tr><td>outer table</td></tr> </table> <table>
PDFmyURL.com
<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.
Element os de un formulario anidado Si el usuario incluye un formulario dent ro de ot ro, el segundo se ignorar. Cdigo:
if (!m_currentFormElement) { m_currentFormElement = new HTMLFormElement(formTag, }
m_document);
bool HTMLParser::allowNestedRedundantTag(const AtomicString& tagName) { unsigned i = 0; for (HTMLStackElem* curr = m_blockStack; i < cMaxRedundantTagDepth && curr && curr->tagName == tagName; curr = curr->next, i++) { } return i != cMaxRedundantTagDepth;
PDFmyURL.com
return i != cMaxRedundantTagDepth; }
Et iquet as finales de cuerpo o HTML colocadas incorrect ament e De nuevo, el coment ario habla por s solo.
if (t->tagName == htmlTag || t->tagName == bodyTag ) return; As que ya sabis: a menos que queris aparecer como ejemplo en un fragmento de cdigo de tolerancia a errores de WebKit, escribid el cdigo HTML correctamente.
Anlisis de CSS
Os acordis de los concept os de anlisis que vimos en la int roduccin? A diferencia del lenguaje HTML, CSS t iene una gramt ica libre de cont ext o y se puede analizar con los t ipos de analizadores descrit os en la int roduccin. De hecho, la especificacin del lenguaje CSS define su gramt ica sint ct ica y lxica .
Veamos algunos ejemplos: La gramt ica lxica (el vocabulario) se define mediant e expresiones regulares para cada t oken:
comment \/\*[^*]*\*+([^/*][^*]*\*+)*\/ num [0-9]+|[0-9]*"."[0-9]+ nonascii [\200-\377] nmstart [_a-z]|{nonascii}|{escape} nmchar [_a-z0-9-]|{nonascii}|{escape} name {nmchar}+ ident {nmstart}{nmchar}*
"ident " es la abreviat ura de ident ificador , como el nombre de una clase. "name" es el ident ificador de un element o (y se hace referencia a l mediant e "#"). La gramt ica sint ct ica se describe en BNF .
PDFmyURL.com
ruleset : selector [ ',' S* selector ]* '{' S* declaration [ ';' S* declaration ]* '}' S* ; selector : simple_selector [ combinator selector | S+ [ combinator? selector ]? ]? ; simple_selector : element_name [ HASH | class | attrib | pseudo ]* | [ HASH | class | attrib | pseudo ]+ ; class : '.' IDENT ; element_name : IDENT | '*' ; attrib : '[' S* IDENT S* [ [ '=' | INCLUDES | DASHMATCH ] S* [ IDENT | STRING ] S* ] ']' ; pseudo : ':' [ IDENT | FUNCTION S* [IDENT S*] ')' ] ; Explicacin: un conjunto de reglas es una estructura como la que se muestra a continuacin. div.error , a.error { color:red; font-weight:bold; } "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 define formalmente en esta definicin: ruleset : selector [ ',' S* selector ]* '{' S* declaration [ ';' S* declaration ]* '}' S*
PDFmyURL.com
; Esto significa que un conjunto de reglas es un selector o un nmero opcional de selectores separados por una coma y por espacios (S significa espacio en blanco). Un conjunto de reglas contiene una declaracin entre llaves u, opcionalmente, una serie de declaraciones separadas por punto y coma. "declaration" y "selector" se definirn en las siguientes definiciones de BNF.
Firefox denomina a los element os del rbol de renderizacin "marcos" (o "frames"). WebKit ut iliza el t rmino "renderizador" u "objet o de renderizacin" (o "render"). Un renderizador es capaz de represent arse a s mismo y a sus element os secundarios. La clase "RenderObject " de WebKit , la clase bsica de los renderizadores, t iene la siguient e definicin:
class RenderObject{ virtual void layout(); virtual void paint(PaintInfo); virtual void rect repaintRect(); Node* node; //the DOM node RenderStyle* style; // the computed style RenderLayer* containgLayer; //the containing z-index layer }
Cada renderizador represent a un rea rect angular que normalment e se corresponde con la caja de CSS del nodo, segn se describe en la especificacin de CSS2. Cont iene informacin geomt rica como el ancho, la alt ura y la posicin. El t ipo de caja se ve afect ado por el at ribut o de est ilo "display" relevant e para el nodo (consult a la seccin Comput acin de est ilos). Est e es el cdigo de WebKit que se ut iliza para decidir qu t ipo de renderizador se debe crear para un nodo DOM, segn el at ribut o de visualizacin:
RenderObject* RenderObject::createObject(Node* node, RenderStyle* style) { Document* doc = node->document(); RenderArena* arena = doc->renderArena(); ... RenderObject* o = 0; switch (style->display()) { case NONE: break; case INLINE: o = new (arena) RenderInline(node); break; case BLOCK: o = new (arena) RenderBlock(node); break; case INLINE_BLOCK:
PDFmyURL.com
o = new (arena) RenderBlock(node); break; case LIST_ITEM: o = new (arena) RenderListItem(node); break; ... } return o; } 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.
Algunos element os DOM corresponden a varios objet os visuales. Est os suelen ser element os con una est ruct ura compleja que no se pueden describir en un solo rect ngulo. Por ejemplo, el element o "select " t iene t res renderizadores: uno para el rea de visualizacin, ot ro para el cuadro de list a desplegable y ot ro para el bot n. Adems, cuando el t ext o se divide en varias lneas porque el ancho no es suficient e para una lnea, las nuevas lneas se aaden como renderizadores adicionales. Ot ro ejemplo con varios renderizadores sera un cdigo HTML rot o. Segn la especificacin de CSS, un element o int egrado debe cont ener nicament e element os de bloque o element os int egrados. Si el cont enido es mixt o, se crean renderizadores de bloques annimos para incluir los element os int egrados. Algunos objet os de renderizacin corresponden a un nodo DOM de un lugar del rbol diferent e. Los element os flot ant es y aquellos con posicin absolut a quedan fuera del flujo, en un lugar diferent e del rbol y asignados al marco real. Deberan haber est ado en un marco de marcador .
PDFmyURL.com
Figura 13: el rbol renderizador y el rbol de DOM correspondiente ( 3.1) La "ventana grfica" es el bloque contenedor inicial. En WebKit, ser el objeto "RenderView".
El flujo de const ruccin del rbol En Firefox, la present acin se regist ra como un det ect or de act ualizaciones de DOM. La present acin delega la creacin de marcos en FrameConst ruct or y el const ruct or resuelve el est ilo (consult a la seccin Comput acin de est ilos) y crea un marco. En WebKit , el proceso para resolver el est ilo y crear un renderizador se denomina "asociacin". Cada nodo DOM dispone de un mt odo de "asociacin". El proceso de asociacin es sncrono, es decir , que la insercin de nodos en el rbol de DOM act iva el mt odo de "asociacin" del nuevo nodo. Al procesar las et iquet as "ht ml" y "body", se const ruye la raz del rbol de renderizacin. El objet o de renderizacin raz se corresponde con lo que la especificacin de CSS denomina "bloque cont enedor", es decir , el bloque superior que cont iene el rest o de los bloques. Sus dimensiones se corresponden con la vent ana grfica, es decir , con las dimensiones del rea de visualizacin de la vent ana del navegador .
PDFmyURL.com
Firefox lo denomina ViewPort Frame y WebKit RenderView . Est e es el objet o de renderizacin al que apunt a el document o. El rest o del rbol se const ruye como una insercin de nodos DOM. Consult a la especificacin de CSS2 en el modelo de procesamient o .
complet a de reglas de cada element o para encont rar coincidencias es una t area muy pesada. Los select ores pueden t ener una est ruct ura compleja, lo que puede hacer que se empiece a buscar en una rut a que aparent ement e sea buena, pero que finalment e no sea as y se deba probar con ot ra rut a. Pongamos como ejemplo est e select or complejo:
div div div div{ ... } Significa que las reglas se aplican a un elemento <div> que es el descendiente de tres elementos "div". Supongamos que quieres comprobar si la regla se aplica a un elemento <div> determinado. Debes seleccionar una ruta superior del rbol para comprobarlo. Es posible que debas ascender por todo el rbol de nodos solo para averiguar que nicamente existen dos elementos "div" y que la regla no se aplica. A continuacin, debes probar con otras rutas del rbol.
PDFmyURL.com
3. Para aplicar las reglas, es necesario utilizar reglas en cascada bastante complejas que definen la jerarqua de las reglas. Veamos cmo se enfrentan los navegadores a estas dificultades:
Dat os de est ilo compart idos Los nodos de WebKit hacen referencia los objet os de est ilo (RenderSt yle). Los nodos pueden compart ir est os objet os en algunas circunst ancias. Los nodos son del mismo nivel, ya pert enezcan al mismo nodo principal o a ot ro nodo del mismo nivel que est e, y:
1. Los elementos deben tener el mismo estado de ratn (por ejemplo, uno no puede estar en ":hover" y el otro en otro estado). 2. Ninguno de los elementos debe tener un identificador. 3. Los nombres de las etiquetas deben coincidir. 4. Los atributos de clase deben coincidir. 5. El conjunto de atributos asignados debe ser idntico. 6. Los estados de enlace deben coincidir. 7. Los estados de enfoque deben coincidir. 8. Ningn elemento se debe ver afectado por selectores de atributos, es decir, no debe presentar ninguna coincidencia con ningn selector que utilice un selector de atributo en ninguna posicin dentro del selector. 9. No debe haber ningn atributo de estilo integrado en los elementos. 10. No debe haber ningn selector del mismo nivel en uso. WebCore simplemente aplica un cambio global si detecta un selector del mismo nivel e inhabilita la opcin de compartir estilos en todo el documento cuando est presente. Esto incluye el selector + y selectores como ":first-child" y ":last-child".
rbol de reglas de Firefox Firefox cuent a con dos rboles adicionales para una comput acin de est ilos ms sencilla: el rbol de reglas y el rbol de cont ext os de est ilo. WebKit t ambin cuent a con objet os de est ilo, pero no se almacenan en un rbol como el rbol de cont ext os de est ilo. Solo el nodo de DOM indica el est ilo pert inent e.
PDFmyURL.com
Los cont ext os de est ilo incluyen valores finales. Para comput ar los valores, se aplican t odas las reglas con las que se hayan encont rado coincidencias en el orden correct o y se realizan manipulaciones que t ransforman los valores lgicos en concret os. Por ejemplo, si el valor lgico es un porcent aje de la pant alla, se calcular y se t ransformar en unidades absolut as. La idea del rbol de reglas es muy ingeniosa, ya que permit e compart ir est os valores ent re nodos para evit ar que se vuelvan a comput ar . Adems, ahorra espacio. Todas las reglas con las que se encuent ra alguna coincidencia se almacenan en un rbol. Los nodos inferiores de una rut a t ienen mayor prioridad. El rbol incluye t odas las rut as de las coincidencias que se han encont rado para una regla. Las reglas se almacenan lent ament e. El rbol no se comput a al principio de cada nodo, pero siempre que se debe comput ar el est ilo de un nodo, las rut as se aaden al rbol. La idea es que las rut as del rbol se muest ren como las palabras de un lexicn. Imaginemos, por ejemplo, que ya hemos comput ado est e rbol de reglas:
PDFmyURL.com
Supongamos que necesit amos encont rar coincidencias para reglas de ot ros element os del rbol de cont enido y obt enemos las siguient es reglas (en el orden correct o): B - E - I. Ya t enamos est a rut a del rbol porque ya habamos comput ado la rut a A - B - E - I - L, por lo que ahora t endremos menos t rabajo que hacer . Vamos a comprobar cmo guarda el rbol nuest ro t rabajo. Divisin en est ruct uras Los cont ext os de est ilo se dividen en est ruct uras que incluyen informacin de est ilo de una ciert a cat egora, como el borde o el color . Todas las propiedades de un est ruct ura pueden ser heredadas o no heredadas. Las propiedades heredadas son propiedades que, a menos que las defina el element o, se heredan del element o principal. Las propiedades no heredadas (denominadas propiedades "reset ") ut ilizan los valores predet erminados en caso de que no se definan. El rbol guarda en cach est ruct uras complet as (que incluyen los valores finales comput ados) del rbol. De esa forma, si el nodo inferior no proporciona una definicin para una est ruct ura, se puede ut ilizar una est ruct ura guardada en cach de un nodo superior . Cmo comput ar los cont ext os de est ilo con el rbol de reglas Cuando se comput a el cont ext o de est ilo de un element o especfico, primero se comput a una rut a del rbol de reglas o se ut iliza una exist ent e. A cont inuacin, se aplican las reglas de la rut a para complet ar las est ruct uras del nuevo cont ext o de est ilo. Empezamos por el nodo inferior de la rut a, es decir , el nodo de mayor prioridad (normalment e el select or ms especfico), y recorremos el rbol en sent ido
PDFmyURL.com
ascendent e hast a complet ar la est ruct ura. Si est e nodo de reglas no incluye ninguna especificacin para la est ruct ura, podemos opt imizarlo considerablement e (la mejor forma es recorrer el rbol en sent ido ascendent e hast a encont rar un nodo que incluya una especificacin complet a y apunt ar despus a est e nodo) y compart ir la est ruct ura complet a. Gracias a est e mt odo ahorramos valores finales y memoria. Si encont ramos definiciones parciales, recorremos el rbol en sent ido ascendent e hast a complet ar la est ruct ura. Si no encont ramos definiciones para la est ruct ura, en caso de que est a sea de t ipo "heredada", apunt amos a la est ruct ura del element o principal del rbo l de co nt ext o s . En est e caso, t ambin conseguimos compart ir las est ruct uras. Si la est ruct ura es de t ipo "no heredada", se ut ilizarn los valores predet erminados. Si el nodo ms especfico no aade valores, t endremos que efect uar clculos adicionales para t ransformarlos en valores reales. Post eriorment e, almacenamos en cach en el rbol el result ado del nodo para que se pueda ut ilizar como element o secundario. En caso de que un element o t enga un element o de su mismo nivel que apunt e al mismo nodo del rbol, ambos element os pueden compart ir el co nt ext o de est ilo co mplet o . Veamos un ejemplo. Supongamos que t enemos el siguient e cdigo HTML:
<html> <body> <div class="err" id="div1"> <p> this is a <span class="big"> big error </span> this is also a <span class="big"> very big error</span> error </p> </div> <div class="err" id="div2">another error</div> </body> </html> Y las siguientes reglas:
Para simplificar la t area, digamos que t enemos que complet ar solo dos est ruct uras: la est ruct ura de color y la est ruct ura de margen. La est ruct ura de color solo cont iene un miembro, el color , mient ras que la est ruct ura de margen cont iene los cuat ro lados. El rbol de reglas que se obt iene t endr la siguient e apariencia (los nodos se marcan as: "nombre del nodo : nmero de la regla a la que apunt a"):
Figura 15: rbol de reglas El rbol de cont ext os t endr la siguient e apariencia (nombre del nodo : nodo de regla a la que apunt a):
PDFmyURL.com
Figura 16: rbol de contextos Supongamos que analizamos el cdigo HTML y obt enemos la segunda et iquet a <div>. Tendremos que crear un cont ext o de est ilo para el nodo y complet ar sus est ruct uras de est ilo. Buscamos las reglas que coincidan con <div> y descubrimos que son 1, 2 y 6. Est o significa que ya exist e una rut a del rbol que podemos ut ilizar para nuest ro element o, por lo que solo necesit amos aadir ot ro nodo para la regla 6 (nodo F del rbol de reglas). Crearemos un cont ext o de est ilo y lo incluiremos en el rbol de cont ext os. El nuevo cont ext o de est ilo apunt ar al nodo F del rbol de reglas. Ahora necesit amos complet ar las est ruct uras de est ilo. Empezaremos complet ando la est ruct ura de margen. Como el lt imo nodo de regla (F) no se aade a la est ruct ura de margen, podemos ascender por el rbol hast a encont rar una est ruct ura almacenada en cach comput ada en la insercin de un nodo ant erior y ut ilizarla. Encont raremos est a est ruct ura en el nodo B, que es el nodo de nivel ms superior que especifica reglas de margen. Ya t enemos una definicin para la est ruct ura de color , por lo que no podemos ut ilizar una est ruct ura almacenada en cach. Como el color t iene un at ribut o, no necesit amos ascender por el rbol para complet ar ot ros at ribut os. Comput amos el valor final (convert imos la cadena a RGB, et c.) y almacenamos en cach en est e nodo la est ruct ura comput ada. El t rabajo relacionado con el element o <span> es an ms sencillo. Buscamos las reglas que coinciden con est e element o y llegamos a la
PDFmyURL.com
conclusin de que la regla a la que apunt a es G, como el element o "span" ant erior . Como t enemos element os del mismo nivel que apunt an al mismo nodo, podemos compart ir el cont ext o de est ilo complet o y apunt ar solo al cont ext o del element o "span" ant erior . En el caso de las est ruct uras que incluyen reglas heredadas del element o principal, el proceso de almacenamient o en cach se lleva a cabo en el rbol de cont ext os (aunque la propiedad de color se hereda, Firefox t rat a est a propiedad como no heredada y la guarda en cach en el rbol de reglas). Por ejemplo, imaginemos que aadimos reglas para las fuent es de un pargrafo:
p {font-family:Verdana;font size:10px;font-weight:bold} 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 especificasen reglas de fuente para el prrafo.
En WebKit , no exist en los rboles de reglas, por lo que las declaraciones que coinciden se recorren cuat ro veces. En primer lugar , se aplican las propiedades de alt a prioridad de menor import ancia (est as propiedades se deben aplicar primero porque hay ot ras que dependen de ellas, como "display"); a cont inuacin, se aplican las propiedades de alt a prioridad de mayor import ancia; post eriorment e, las propiedades de prioridad normal de menor import ancia y, por lt imo, las reglas de prioridad normal de mayor import ancia. Est o significa que las propiedades que aparezcan varias veces se resolvern segn el orden de cascada correct o. La lt ima es la ms import ant e. En resumen, compart ir objet os de est ilo (ya sea en su t ot alidad o compart iendo solament e algunas de sus est ruct uras) soluciona las incidencias 1 y 3. El rbol de reglas de Firefox t ambin ayuda a aplicar las propiedades en el orden correct o. Cmo manipular las reglas para obt ener coincidencias fcilment e A cont inuacin se muest ran las dist int as fuent es de reglas de los modificadores de est ilo. Reglas de CSS, t ant o en hojas de est ilo int ernas como en element os de est ilo: p {color:blue} At ribut os de est ilo int egrados, como el siguient e: <p st yle="color:blue" />
PDFmyURL.com
At ribut os visuales HTML (que se asignan a reglas de est ilo relevant es): <p bgcolor="blue" /> Las dos lt imas fuent es coinciden fcilment e con el element o, ya que est e incluye los at ribut os de est ilo, y los at ribut os HTML se pueden asignar ut ilizando el element o como clave. Como se coment previament e en la incidencia 2, buscar una coincidencia con la regla de CSS puede result ar bast ant e complicado. Para resolver est a dificult ad, las reglas se manipulan para facilit ar el acceso. Despus de analizar la hoja de est ilo, las reglas se aaden a uno de varios mapas hash, de acuerdo con el select or . Exist en mapas organizados por ID, nombre de clase y nombre de et iquet a, y un mapa general para t odo lo que no se puede incluir en est as cat egoras. Si el select or es un ID, la regla se aadir al mapa de ID; si es una clase, se aadir al mapa de clase, et c. Est a manipulacin facilit a considerablement e la t area de asignacin de reglas. No hace falt a revisar cada declaracin, podemos ext raer las reglas relevant es para un element o de los mapas. Est a opt imizacin elimina ms del 95% de las reglas, por lo que ni siquiera es necesario t enerlas en cuent a durant e el proceso de bsqueda de coincidencias (4.1). Analicemos las reglas de est ilo que se incluyen a cont inuacin:
p.error {color:red} #messageDiv {height:50px} div {margin:5px} La primera regla se insertar en el mapa de clase, la segunda en el mapa de ID y la tercera en el mapa de etiquetas. Para el siguiente fragmento de HTML: <p class="error">an error occurred </p> <div id=" messageDiv">this is a message</div>
En primer lugar , int ent aremos buscar reglas para el element o "p". El mapa de clase incluir una clave "error" dent ro de la que se encuent ra la regla para "p.error". El element o "div" t endr reglas relevant es en el mapa de ID (la clave es el ID) y el mapa de et iquet a. Por t ant o, solo queda averiguar qu reglas ext radas de las claves realment e coinciden. Por ejemplo, si la regla del element o "div" fuera la siguient e:
PDFmyURL.com
table div {margin:5px} se extraera del mapa de etiqueta, porque la clave es el selector situado ms a la derecha, pero no coincidira con el elemento "div", que no cuenta con un antecesor de tabla.
Tant o WebKit como Firefox ut ilizan est a manipulacin. Cmo aplicar las reglas en el orden de cascada correct o El objet o de est ilo t iene propiedades que se corresponden con cada at ribut o visual (t odos los at ribut os CSS, pero ms genricos). Si ninguna de las reglas que coinciden define la propiedad, algunas propiedades se pueden heredar del element o principal del objet o de est ilo. Ot ras propiedades t ienen valores predet erminados. La incidencia se produce cuando exist e ms de una definicin, y es ent onces cuando se debe ut ilizar el orden en cascada para resolverla. Orden en cascada de la hoja de est ilo
Una declaracin de una propiedad de estilo puede aparecer en varias hojas de estilo y varias veces dentro de una misma hoja. Por ese motivo, el orden de aplicacin de las reglas tiene una gran importancia. Este orden se conoce como "cascada". De acuerdo con las especificaciones de CSS2, el orden en cascada es el siguiente (de menor a mayor): 1. declaraciones del navegador, 2. declaraciones normales del usuario, 3. declaraciones normales del autor, 4. declaraciones importantes del autor, 5. declaraciones importantes del usuario.
Las declaraciones del navegador son las que t ienen menos import ancia y las del usuario solo t ienen prioridad sobre las del aut or si est n marcadas como import ant es. Las declaraciones con el mismo orden se ordenan segn la especificidad y, post eriorment e, segn el orden en el que se han especificado. Los at ribut os visuales HTML se t raducen en las declaraciones CSS correspondient es. Se t rat an como reglas de aut or de prioridad baja. Especificidad
PDFmyURL.com
La especificacin de CSS2
"1" si la declaracin es de un at ribut o "st yle" en lugar de una regla con un select or; en caso cont rario, "0" (= a), nmero de at ribut os de ID del select or (= b), nmero de ot ros at ribut os y pseudoclases del select or (= c), nmero de nombres de element os y de pseudoelement os del select or (= d).
La especificidad 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 ut ilizar es el nmero de recuent o ms elevado de una de las cat egoras. Por ejemplo, si a=14, se puede ut ilizar una base hexadecimal. En el improbable caso de que a=17, se deber ut ilizar una base numrica de 17 dgit os. El lt imo caso sera el de un select or como ht ml body div div p... con 17 et iquet as en el select or , pero est o es muy poco probable. Algunos ejemplos:
* {} /* a=0 b=0 c=0 d=0 -> specificity = 0,0,0,0 */ li {} /* a=0 b=0 c=0 d=1 -> specificity = 0,0,0,1 */ li:first-line {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */ ul li {} /* a=0 b=0 c=0 d=2 -> specificity = 0,0,0,2 */ ul ol+li {} /* a=0 b=0 c=0 d=3 -> specificity = 0,0,0,3 */ h1 + *[rel=up]{} /* a=0 b=0 c=1 d=1 -> specificity = 0,0,1,1 */ ul ol li.red {} /* a=0 b=0 c=1 d=3 -> specificity = 0,0,1,3 */ li.red.level {} /* a=0 b=0 c=2 d=1 -> specificity = 0,0,2,1 */ #x34y {} /* a=0 b=1 c=0 d=0 -> specificity = 0,1,0,0 */ style="" /* a=1 b=0 c=0 d=0 -> specificity = 1,0,0,0 */
Cmo ordenar las reglas Despus de buscar coincidencias, las reglas se ordenan segn las reglas de cascada. WebKit ut iliza el ordenamient o de burbuja para list as pequeas y el ordenamient o por mezcla para list as grandes. WebKit ordena las reglas sobrescribiendo el operador ">" para las reglas:
static bool operator >(CSSRuleData& r1, CSSRuleData& r2) {
PDFmyURL.com
int spec1 = r1.selector()->specificity(); int spec2 = r2.selector()->specificity(); return (spec1 == spec2) : r1.position() > r2.position() : spec1 > spec2; }
Proceso gradual
WebKit ut iliza un indicador que muest ra si se han cargado t odas las hojas de est ilo de nivel superior (incluidas las de @import s). Si las hojas de est ilo no se cargan por complet o al asociarlas, se ut ilizan marcadores de posicin (indicndolo en el document o), que se vuelven a calcular una vez que se han cargado las hojas de est ilo. Chapt er 5
Diseo
Cuando el renderizador se crea y se aade al rbol, no t iene posicin ni t amao. El clculo de est os valores se conoce como diseo o reflujo. HTML ut iliza un modelo de diseo basado en flujo, lo que significa que, la mayora de las veces, los clculos geomt ricos se pueden realizar con una sola operacin. Los element os que ent ran post eriorment e "en el flujo" no suelen influir en la geomet ra de los element os que ya se encuent ran en l, por lo que el diseo se puede aplicar de izquierda a derecha y de arriba a abajo en t odo el document o. Hay excepciones, como las t ablas HTML, que pueden requerir ms de un clculo (3.5). El sist ema de coordenadas se refiere al marco raz. Se ut ilizan las coordenadas superior e izquierda. El diseo consist e en un proceso recurrent e. Se inicia en el renderizador raz, que corresponde al element o <ht ml> del document o HTML. El diseo se aplica de forma recurrent e a t ravs de t oda la jerarqua de marcos o de una part e de ella, calculando informacin geomt rica para cada renderizador que lo requiere.
La posicin del renderizador raz es 0,0 y su dimensin es la ventana grfica, es decir, la parte visible de la ventana del navegador.
Todos los renderizadores incluyen un mt odo de "diseo" o de "reflujo" y cada uno act iva el mt odo de diseo del element o secundario al que se debe aplicar el diseo.
bit ). Cuando se aade o se modifica un renderizador , t ant o el propio renderizador como su element o secundario se marcan con el indicador "dirt y", lo que significa que se deben somet er a un proceso de diseo. Exist en dos indicadores: "dirt y" y "children are dirt y". El indicador "children are dirt y" especifica que, aunque el renderizador no haya sufrido cambios, al menos uno de sus element os secundarios necesit a somet erse a un proceso de diseo.
El diseo puede ser increment al, en cuyo caso solo se somet ern a un proceso de diseo los renderizadores marcados como "dirt y" (est e hecho puede provocar daos que pueden requerir procesos de diseo adicionales). Cuando los renderizadores est n marcados como "dirt y", se act iva (de forma asncrona) el diseo increment al (por ejemplo, cuando se aaden renderizadores nuevos al rbol de renderizacin despus de incluir cont enido adicional de la red en el rbol de DOM).
PDFmyURL.com
Figura 17: diseo incremental en el que solo se someten a un proceso de diseo los renderizadores modificados y sus elementos secundarios (3.6)
Opt imizaciones
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 modifica 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 pat rn que se indica a cont inuacin:
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 modificacin (dirty bit) en "false".
Firefox ut iliza un objet o "st at e" (nsHTMLReflowSt at e) como parmet ro de diseo (conocido como "reflujo"). Ent re ot ros valores, el objet o de est ado incluye el ancho de los element os principales. El result ado del diseo de Firefox es un objet o "met rics" (nsHTMLReflowMet rics) que incluir la alt ura comput ada del renderizador .
El ancho del cont enedor es el valor mximo de la propiedad "availableWidt h" de los cont enedores y 0. En est e caso, la propiedad "availableWidt h" es la propiedad "cont ent Widt h", que se calcula as: client Widt h() - paddingLeft () - paddingRight () Las propiedades "client Widt h" y "client Height " represent an el int erior de un objet o, excluyendo el borde y la barra de desplazamient o. El ancho de los element os es el at ribut o de est ilo "widt h", que se calcula como un valor absolut o comput ando el porcent aje del ancho del cont enedor . A cont inuacin, se aaden el relleno y los bordes horizont ales.
Hasta ahora, hemos calculado el "ancho preferente". Ahora vamos a calcular los anchos mnimo y mximo. Si el ancho preferente es superior al ancho mximo, se utiliza el ancho mximo. Si, por el contrario, es inferior al ancho mnimo (la unidad indivisible ms pequea), se utiliza el ancho mnimo.
Los valores se almacenan en cach en caso de que se necesit e act ivar un proceso de diseo sin que vare el ancho.
Salt o de lnea
El salt o de lnea se produce cuando un renderizador decide que debe int errumpirse en mit ad del diseo. Se det iene y comunica el salt o al renderizador principal. El renderizador principal crea renderizadores adicionales y act iva sus procesos de diseo. Chapt er 6
Pintura
En la fase de pint ura, se recorre el rbol de renderizacin y se act iva el mt odo de "pint ura" de los renderizadores para que se muest re su cont enido en la pant alla. En la fase de pint ura, se ut iliza el component e de infraest ruct ura de la int erfaz.
PDFmyURL.com
Global e increment al
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 modifican de una forma que no afecta a la totalidad del rbol. El renderizador modificado invalida su rectngulo correspondiente en la pantalla. Esto hace que el sistema operativo considere esta regin como modificada 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 opt imizar el proceso, Firefox no aade element os que vayan a quedar ocult os, como los element os que quedan t ot alment e ocult os bajo ot ros element os opacos.
Chapt er 7
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
PDFmyURL.com
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.
Chapt er 8
Bucle de event os
El subproceso principal del navegador es un bucle de eventos, que consiste en un bucle infinito 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);
Chapt er 9
Figura 18: modelo de cajas de CSS2 Cada nodo genera ent re 0y n cajas de est e t ipo. Todos los element os t ienen una propiedad "display" que det ermina el t ipo de caja que se generar. Ejemplos:
block - generates a block box. inline - generates one or more inline boxes. none - no box is generated. Aunque el tipo de caja predeterminado es "inline", la hoja de estilo del navegador establece otros tipos predeterminados. Por ejemplo, el tipo de visualizacin predeterminado de un elemento "div" es "block". Puedes consultar un ejemplo de hoja de estilo predeterminada en la pgina www.w3.org/TR/CSS2/sample.html .
Esquema de posicionamient o
A cont inuacin se indican los t res t ipos de esquemas disponibles.
1. Flujo normal: el objeto se coloca en funcin del lugar que ocupa en el documento (esto significa que el lugar que ocupa en el rbol de
PDFmyURL.com
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 flujo 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 "posit ion" y el at ribut o "float " det erminan el esquema de posicionamient o. Si se ut ilizan "st at ic" y "relat ive", se genera un flujo normal. Si se ut ilizan "absolut e" y "fixed", se produce un posicionamient o absolut o.
Cuando el posicionamiento es esttico, no se define ninguna posicin, por lo que se utiliza el posicionamiento predeterminado. En otros esquemas, el autor especifica la posicin: arriba, abajo, izquierda, derecha.
Los siguient es valores det erminan el diseo de la caja: t ipo de caja, dimensiones de la caja, esquema de posicionamient o, informacin ext erna, como el t amao de las imgenes y el t amao de la pant alla.
Tipos de cajas
Caja de bloque: forma un bloque (t iene su propio rect ngulo en la vent ana del navegador).
Caja int egrada: no t iene bloque propio, sino que se incluye en un bloque de cont encin.
PDFmyURL.com
Las cajas de bloque se colocan en vert ical, una det rs de ot ra, mient ras que las cajas int egradas se dist ribuyen horizont alment e.
PDFmyURL.com
Las cajas int egradas se colocan dent ro de lneas o "cajas de lnea". Cuando las cajas se alinean t omando como punt o de referencia su base, es decir , la part e inferior de un element o se alinea con ot ra caja t omando como referencia una part e diferent e a la inferior , las lneas t ienen como mnimo la misma alt ura que la caja ms alt a, aunque pueden ser ms alt as. En caso de que el ancho del cont enedor no sea suficient e, las cajas int egradas se colocan en diferent es lneas. Est o es lo que suele ocurrir en un prrafo.
Posicionamiento
Relat ivo
Posicionamient o relat ivo: el element o se coloca normalment e y, a cont inuacin, se mueve segn el diferencial correspondient e.
PDFmyURL.com
Flot ant e
Una caja flot ant e se desplaza a la izquierda o a la derecha de una lnea. Lo ms int eresant e de est e posicionamient o es que las dems cajas fluyen a su alrededor . A cont inuacin, se incluye un ejemplo con cdigo HTML:
<p> <img style="float:right" src="images/image.gif" width="100" height="100"> Lorem ipsum dolor sit amet, consectetuer... </p> La apariencia sera la siguiente:
PDFmyURL.com
Absolut o y fijo
El diseo se define con exact it ud independient ement e del flujo normal. El element o no part icipa en el flujo normal. Las dimensiones son relat ivas al cont enedor . En el posicionamient o fijo, el cont enedor es la vent ana grfica.
Representacin en capas
Las capas se especifican con la propiedad "z-index" de CSS. Represent a la t ercera dimensin de la caja, es decir , su posicin a lo largo del "eje z". Las cajas se dividen en pilas (denominadas "cont ext os de pila"). En cada pila, los element os que quedan debajo se pint an en primer lugar ,y los element os que quedan encima se colocan en la part e superior , ms cerca del usuario. En caso de superposicin, se ocult a el element o que queda debajo. Las pilas se ordenan segn la propiedad "z-index". Las cajas que t ienen la propiedad "z-index" forman una pila local. La vent ana grfica forma la pila ext erior . 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> Se obtendr el siguiente resultado:
PDFmyURL.com
Aunque el element o "div" rojo preceda al verde en el marcado y se pint e en primer lugar en un flujo normal, el valor de la propiedad "zindex" es superior , por lo que se encuent ra ms adelant ado en la pila de la caja raz. Chapt er 10
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 Jelliffe. 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
PDFmyURL.com
4. L. David Baron, Mozilla Style System Documentation 5. Chris Waterson, Notes on HTML Reflow 6. Chris Waterson, Gecko Overview 7. Alexander Larsson, The life of an HTML HTTP request 4. WebKit 1. David Hyatt, Implementing CSS(part 1) 2. David Hyatt, An Overview of WebCore 3. David Hyatt, WebCore Rendering 4. David Hyatt, The FOUC Problem 5. Especificaciones de W3C 1. HTML 4.01 Specification 2. W3C HTML5 Specification 3. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification 6. Instrucciones de creacin de navegadores 1. Firefox: https://developer.mozilla.org/en/Build_Documentation 2. WebKit: http://webkit.org/building/build.html
Tali Garsiel
es una desarrolladora de Israel. Empez su andadura como desarrolladora web en el ao 2000 y se familiariz
con el "malfico" modelo de capas de Net scape. Al igual que Richard Feynmann, sent a fascinacin por descubrir cmo funcionaban las cosas, por lo que empez a invest igar los mecanismos de funcionamient o int erno de los navegadores y a document ar t odos sus descubrimient os. Tali t ambin ha publicado una pequea gua sobre rendimient o de aplicaciones client e .
Traducciones
Est a pgina se ha t raducido al japons dos veces! Cmo funcionan los navegadores: lo que hay det rs de los navegadores web act uales (ja) por @_kosei_ y WEB por @ikeike443 y @kiyot o01 . Gracias a t odos!
PDFmyURL.com
Salvo dis po s ic i n en c o ntra, el c o ntenido de es ta pgina es t s ujeto a la lic enc ia Rec o no c imiento 3.0 de Creative Co mmo ns y lo s ejemplo s de c digo a la lic enc ia Apac he 2.0.
ndice
PDFmyURL.com
ndice Traducciones
PDFmyURL.com