Ответ 1
У меня нет полного списка, но этот текст из mozilla и Servo может быть полезен, я думаю.
Обработка обновлений стилей WebKit
Изменения атрибутов
Если элемент еще не имеет флаг recalc стиля, и если атрибутом является атрибут id или существуют селекторы, которые включают атрибут, элемент помечен для стиля recalc. Нет попытки дважды проверить, имеют ли эти селекторы какое-либо отношение к элементу и не пытаются обрабатывать случаи, связанные с "~
" и "+
" на этом этапе. Существует также отдельный крюк, называемый при изменении атрибутов класса, который, между прочим, безоговорочно помещает элемент как необходимый recalc стиля. Опять же, не предпринимаются попытки обрабатывать "~
" и "+
" . Ни в одном из этих случаев не существует попытки оптимизировать сопоставление выбора потомков.
Изменения состояния
Не существует единой настройки для изменений состояния в WebKit. Для каждого псевдокласса, который обрабатывается через логические состояния в Gecko, селекторное сопоставление имеет выделенную функцию, элемент, который он может вызывать для проверки соответствия этого псевдокласса. Изменения в этом состоянии внутри элемента отвечают за непосредственную маркировку этого элемента как необходимость в recalc стиля. Опять же, никакая попытка оптимизировать выбор селектора по потомкам или обрабатывать "+" или "~
" не производится.. Здесь есть некоторые оптимизации, похожие на тот, который Gecko делает для :hover
, которые охватывают :hover
, :active,
и что-то о перетаскивании.
Обработка вставок и удаление
В RenderStyle есть флаги, указывающие, зависят ли его дети от различных структурных псевдоклассов и комбинаторов "+
" или "~
" . При мутациях DOM первый затронутый элемент после изменения (в списке дочерних списков) помечен как необходимый recalc стиля или единственный первый дочерний элемент родителя, если ему может понадобиться recalc. Если для вещей больше, чем требуется изменение, потребуется recalc, тогда родитель будет отмечен как необходимый recalc стиля, который перескажет всех его детей.
Во всех этих случаях, когда на самом деле перекомпонован стиль на элемент, проверяется, не пострадали ли его дети от "+
" или "~
" . Если это так, то, если какой-либо дочерний объект отмечен как нуждающийся в стиле recalc, либо дочерний элемент после него, либо все дочерние элементы после него (в зависимости от того, был ли задействован "+
" или "~
" ) также отмечены как необходимость в recalc стиля. Я думаю, здесь есть несколько ошибок вокруг цепочек из нескольких "+
" .
Результат заключается в том, что в некоторых случаях WebKit заканчивает recomputing стиль на гораздо больше элементов, чем Gecko делает, насколько я могу судить, но в других он заканчивает recomputing стиль на многих меньших элементах. Например, учитывая селектор типа ".foo ~ span
" и div, который изменяет класс с "foo" на "bar", Gecko будет пересобирать всех последующих братьев из div, в то время как WebKit вообще не будет работать, если нет "span" kids, так как он никогда не помешал бы родителям, так как в этом случае был затронут "+". Я не уверен, насколько это влияет на поведение вставки, где кажется, что два должны быть более похожими. Как-то WebKit, кажется, лучше, чем Gecko, в HTML5 сценариях с одной страницей, и я не могу понять, почему на этом этапе. Возможно, это просто потому, что его перекодировка по стилю кажется намного дешевле, чем Gecko для фактического запуска.
Другой результат заключается в том, что работа, связанная с индивидуальными изменениями атрибутов и состояний, намного меньше, чем в Gecko, за счет большей перекомпоновки стиля. Работа, связанная с вставкой/удалением DOM, примерно такая же.