Como os browsers funcionam
Filipi Zimermann 
@filipiz
A melhor experiência
Do que é 
composto 
um browser?
‣ WebKit 
‣ Gecko 
‣ Blink 
‣ Trident 
‣ Tasman 
‣ KHTML 
‣ Lynx 
‣W3M
O processo de 
renderização
HTML Parser
Tokenizer 
<html> 
<body> 
Hello world 
</body> 
</html>
Construção da árvore DOM 
<html> 
<body> 
Hello world 
</body> 
</html>
Construção da árvore DOM
Construção da árvore DOM
Construção da árvore DOM
HTML Parser 
Tolerância a erros
</br> vira <br> 
if (t->isCloseTag(brTag) && 
m_document->inCompatMode()) { 
reportError(MalformedBRError); 
t->beginTag = true; 
}
<form> aninhado 
if (!m_currentFormElement) { 
m_currentFormElement = new 
HTMLFormElement(formTag, m_document); 
}
Limite de tags aninhadas 
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; 
}
CSS Parser
Aplicando as 
regras de estilo
Prioridades 
1. Browser declarations 
2. User normal declarations 
3. Author normal declarations 
4. Author important declarations 
5. User important declarations
Prioridades
‣ Evite seletores longos 
‣ Remova as declarações CSS que não são 
necessárias na página 
‣ Utilize seletores específicos
Árvore de 
Renderização e 
Layout
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: 
o = new (arena) RenderBlock(node); 
break; 
case LIST_ITEM: 
o = new (arena) RenderListItem(node); 
break; 
... 
} 
! 
return o; 
}
Pintura e 
composição
Reflow e relayout
10 mandamentos
1. Não mexa no DOM 
2. Minimize áreas de reflow 
3. Guarde referências para elementos do DOM 
em variáveis locais 
4. Agrupe mudanças de estilo 
(de preferência apenas modificando classe) 
5. Evite pegar info de layout 
(posicionamento, dimensão e espaçamento) 
6. Quanto menos elementos melhor 
7. Quanto menos CSS melhor 
8. Cuidado com eventos complexos 
9. Anime elementos position absolute ou fixed 
10.Não mexa no DOM
Obrigado! 
www.nextt.com.br 
filipi@nextt.com.br 
@filipiz 
+55 48 3028.9556 
Avenida Desembargador Vítor Lima, 260, 
Trindade, Florianópolis, SC

Como os browsers funcionam - Front in Floripa 2014