Временная шкала рендеринга XHTML отличается от HTML в WebKit? - PullRequest
1 голос
/ 08 марта 2012

Я работаю над проектом, в котором мы перешли от XHTML к HTML обратно в XHTML, и существуют некоторые определенные поведенческие изменения в отношении рендеринга страницы до загрузки CSS и сценариев, которые читают стили, читающие их до загрузки CSS , Кто-нибудь может пролить свет на то, почему происходит следующее и что с этим можно сделать?

По сути, у меня есть страница со следующей структурой:

<body>
    <!-- Content from Source A -->
    <link href="http://a.example.com/style.css" />
    <header>...</header>

    <!-- Content from Source B -->
    <link href="http://b.example.com/style.css" />
    <div>...</div>

    <!-- Content from Source A -->
    <footer>...</footer>
    <script src="http://a.example.com/script.js">
        /* e.g. */
        alert($('header').offset().height);
    </script>
</body>

Когда мы были в режиме рендеринга HTML, страница блокирует рендеринг в ожидаемых точках. Когда мы нажимаем на Source A CSS, рендеринг приостанавливается (пустой экран); когда мы нажимаем на Source B CSS, рендеринг приостанавливается (виден заголовок). Когда мы нажимаем на Source A JavaScript, рендеринг приостанавливается (показана полная страница), и скрипт считывает стили элементов из их отрендеренного состояния. (В действительности, конечно, WebKit не прекращает синтаксический анализ DOM или выполнение JavaScript во время загрузки CSS, но он останавливает выполнение в первой точке, где сценарию необходимо прочитать стиль.)

Когда мы находимся в режиме XHTML, страница вообще не останавливает рендеринг и полностью отрисовывает всю страницу. После этого он, по-видимому, обрабатывает сценарии и таблицы стилей в порядке загрузки, или, скорее, выполняет сценарии по порядку, но не ожидает загрузки таблицы стилей перед выполнением загруженного сценария. Это означает, что страница будет отображаться три раза (без форматирования, с одной таблицей стилей и двумя таблицами стилей), и сценарий может выводить совершенно неточные значения для размеров элементов.

Может кто-то пролить свет на это? Это происходит во всех протестированных мной браузерах WebKit, включая Chrome 17, Mobile Safari 5 и Android Browser 2.1. Есть ли способ обеспечить порядок рендеринга HTML, не прибегая к типу mime text/html?

1 Ответ

1 голос
/ 17 мая 2012

WebKit использует libxml2 для обработки XML, что отправляет проанализированный XHTML обратно в WebCore и JavaScriptCore для выполнения рендеринга CSS и выполнения JavaScript.

Webkit Architecture

Таблицы стилей и теги скриптов ссылаются на то, что в терминологии XML называется внешней сущностью.Это означает, что они обрабатываются последними. XML-спецификация гласит:

За исключением случаев, когда standalone = "yes", они не должны обрабатывать объявления сущностей или объявления списка атрибутов, встречающиеся после ссылки на сущность параметра, которая не являетсяпрочитайте, поскольку объект может содержать переопределенные объявления;когда standalone = "yes", процессоры должны обрабатывать эти объявления.

Поскольку standalone="yes" указывает, что документ XML должен проверяться DTD, это вызывает другую модель обработки.

Теги ссылок обрабатываются иначе, чем инструкции по обработке таблиц стилей xml.Спецификация XML-таблицы стилей гласит:

Любые ссылки на таблицы стилей, которые указываются извне для документа (например, заголовки ссылок в некоторых версиях HTTP [RFC2068]), считаются созданнымиассоциации, встречающиеся до ассоциаций, указанных в инструкциях по обработке таблицы xml-stylesheet.Приложение отвечает за сбор всех ассоциаций и определение того, как, если вообще, их порядок влияет на его обработку.

Попробуйте закомментировать теги сценария и преобразовать теги ссылки в инструкции xml-stylesheet.Кроме того, попробуйте добавить standalone = "yes" в объявление XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="foo.css"?>

Кроме того, использование специальных символов, сущностей и XSLT может еще больше усложнить изображение, поскольку модель обработки отличается между HTML идиалект XML, такой как XHTML:

Диапазон допустимых символов в XML определяется спецификацией XML, а диапазон полностью проверяется libxml2.Не беспокойтесь, если вы не проанализируете это, например, с помощью синтаксического анализатора HTML и передадите предварительно обработанное дерево в libxml2 для сериализации обратно.Я надеюсь, что вы этого не делаете, поскольку XSLT является языком XML и должен быть проанализирован синтаксическим анализатором XML.

XSLT Processing Model Ссылки

...