Skip to content

Instantly share code, notes, and snippets.

@zxdcm
Created February 14, 2019 20:12
Show Gist options
  • Save zxdcm/7c979efa81708853f20f6e4cfd8bf0b5 to your computer and use it in GitHub Desktop.
Save zxdcm/7c979efa81708853f20f6e4cfd8bf0b5 to your computer and use it in GitHub Desktop.
Browser common ideas
Browser components:
1. UI |
↓ |
2. Browser Engine ========================|===========> data persistance
3. Rendering Engine ↓ (25)
4. Networking 5. JS Interpreter 6. UI Backend
Chrome uses several display modules
Display modules:
webkit
gecko
8 kb frames
scheme: parse html & create dom => render dom => layout tree on page => paint the tree
Painting might start even before dom analyzed & created
Dom tree - AST
AST produced by lexer (parse tokens) and syntax analyser (build tree)
Asc and Desc syntax analyzers
грамматика HTML - не является бесконтекстной (из-за мягких правил к закрытию тегов)
=> анализаторами не распарсить => нельзя парсить регулярками.
XML - можно парсить
Лексический анализатор - конечный автомат (КА)
Построение дерева:
Первое состояние -> before html -> before head -> in head ->
after head -> in body -> ... -> EOF
(даже если нет html, head, body - все равно строятся)
После анализа - можно подгружать скрипты
Анализатор так же правит некоторые ошибки (</br> вместо <br> и тд)
CSS
CSS использует бесконечную граматику -> можно нормально парсить
p, div{
margin-top: 3px;
.error{
..}
}
CSSStyleSheet
↓ ↓
CSSRule CssRule
selectors ↓declaration
↓ ↓
p ... margin-top, 3px
Дерево отображения:
Невизуальные элементы не включается в дерево отображения + те у которых display = hidden
Порядок приоритета таблиц стилей
По возрастанию
1. Объявления браузера
2. Обычные объявления пользователя
3. Обычные объявление автора
4. Важные обяявления автора
5. Важные объявления пользователя
Компоновка (reflow, layout)
Определение размеров, положения
Система "грязных битов"
Измененные элементы помечаются как грязные и требующие перекомпоновки
Глобальная компановка - для всего дерева
(изменение шрифта, размеров экрана)
Инкрементая - только грязные объекты отображения
( ^ выполняется асинхронно, помещается таска в очередь)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment