Поддержка Dom L3 Xpath В Project Spartan

Примечание переводчика: Я серверный Java-программист, но исторически работаю исключительно под Windows. Все в команде в основном работают на Mac или Linux, но кто-то должен тестировать веб-интерфейсы проектов, работающих под реальным IE, кто еще, как не я? Так что использую его уже довольно много лет, как по работе, так и по лени, как основной браузер.

На мой взгляд, с каждой новой версией, начиная с девятой, она становится все более достойной, и Project Spartan обещает быть превосходной.

По крайней мере в технологическом плане - на равных с другими.

Предлагаю вашему вниманию перевод статьи из блога разработчиков, дающий некоторые основания на это надеяться.



Поддержка DOM L3 XPath в Project Spartan



Обеспечение совместимости с DOM L3 XPath

Чтобы обеспечить по-настоящему совместимую и современную работу в Интернете в Windows 10, мы постоянно работаем над улучшением поддержки стандартов, особенно для DOM L3 XPath .

Сегодня мы хотели бы рассказать вам, как мы этого добились в Project Spartan.

Немного истории

Прежде чем реализовать поддержку стандарта L3 Core DOM и собственных XML-документов в IE9, мы предоставили веб-разработчикам библиотеку MSXML через механизм ActiveX. Помимо объекта XMLHttpRequest, MSXML также обеспечивает частичную поддержку языка запросов XPath посредством набора собственных API-интерфейсов selectSingleNode и selectNodes. С точки зрения приложений, использующих MSXML, этот метод просто работал.

Однако он совершенно не соответствовал стандартам W3C ни для взаимодействия XML, ни для XPath. Авторам библиотек и разработчикам веб-сайтов приходилось заключать вызовы XPath для переключения между реализациями на лету.

Если вы ищете в Интернете учебные пособия или примеры XPath, вы сразу заметите оболочки для IE и MSXML, например.

   

// code for IE if (window.ActiveXObject || xhttp.responseType == "msxml-document") { xml.setProperty("SelectionLanguage", "XPath"); nodes = xml.selectNodes(path); for (i = 0; i < nodes.length; i++) { document.write(nodes[i].

childNodes[0].

nodeValue); document.write("<br>"); } } // code for Chrome, Firefox, Opera, etc. else if (document.implementation && document.implementation.createDocument) { var nodes = xml.evaluate(path, xml, null, XPathResult.ANY_TYPE, null); var result = nodes.iterateNext(); while (result) { document.write(result.childNodes[0].

nodeValue); document.write("<br>"); result = nodes.iterateNext(); } }

Для нашего нового движка, ориентированного на Интернет без плагинов, нам нужно было обеспечить встроенную поддержку XPath.

Оценка возможных вариантов

Мы сразу начали оценивать возможные варианты реализации такой поддержки.

Можно было бы написать его с нуля, или полностью интегрировать в MSXML браузер, или портировать Система.

XML из .

NET, но все это заняло бы слишком много времени.

Поэтому мы решили начать с реализации поддержки некоторого базового подмножества XPath, подумывая при этом о полном.

Чтобы определить, за какое начальное подмножество стандарта стоит взяться, мы использовали внутренний инструмент, собирающий статистику по запросам на сотнях тысяч наиболее популярных сайтов.

Оказалось, что наиболее распространенными типами запросов являются:

  • //элемент1/элемент2/элемент3
  • //элемент[@attribute="значение"]
  • .

    //*[contains(concat(" ", @class, " "), "имя класса")]

Каждый из них прекрасно сопоставляется с селектором CSS, который можно перенаправить на уже имеющуюся у нас очень быструю реализацию API селектора CSS. Сравните сами:
  • элемент1 > элемент2 > элемент3
  • элемент[атрибут="значение"]
  • *.

    имякласса

Поэтому первым шагом в реализации поддержки XPath было написание преобразователя запросов XPath в селекторы CSS и перенаправление вызова в нужное место.

Сделав это, мы снова воспользовались нашей телеметрией, чтобы измерить процент успешных запросов, а также выяснить, какие из неуспешных встречались чаще всего.

Оказалось, что такая реализация покрывает целых 94% запросов и позволяет многим сайтам сразу зарабатывать.

Из неудачных большинство оказались видами

  • //элемент[содержит(@класс, «имякласса»)]
  • //element[contains(concat(" ",normalize-space(@class), " "), " className ")]
и оба идеально соответствуют селектору «element.className».

Добавив это правило, мы улучшили поддержку 97% сайтов, а это значит, что новый движок практически готов к работе в современном Интернете.



Поддержка DOM L3 XPath в Project Spartan

Результат запуска телеметрии с помощью запросов XPath

Обеспечение поддержки оставшихся 3% сайтов

Поддержка подавляющего большинства запросов XPath путем простого преобразования их в селекторы CSS — это здорово, но этого все равно недостаточно, потому что остальные реализовать аналогичным образом не получится.

Грамматика XPath включает в себя такие сложные вещи, как функции, запросы к элементам, не относящимся к DOM, узлам документов и сложным предикатам.

Некоторые авторитетные сайты (в том числе МДН ) предлагают в таких случаях использовать библиотеки полифилов на платформах, которые не имеют адекватной встроенной поддержки XPath. Например, злой-добрый-xpath (WGX), написанный на чистом JS. Мы протестировали его в нашем внутреннем наборе тестов для спецификации XPath, и по сравнению с собственными реализациями он показал совместимость на 91%, а также очень приличную производительность.

Так что идея использования WGX для оставшихся 3% сайтов показалась нам очень привлекательной.

Более того, это проект с открытым исходным кодом под лицензией MIT, что идеально соответствует нашему стремлению внести больший вклад в развитие открытого исходного кода.

Но мы никогда не использовали полифил JavaScript внутри IE для поддержки какого-либо веб-стандарта.

Чтобы WGX мог работать, не разрушая контекст документа, мы запускаем его в отдельном, изолированном экземпляре JS-движка, передавая ему на вход запрос и необходимые данные со страницы, а на выходе принимая готовый результат. Изменив код WGX для работы в этом режиме разделения документов, мы сразу же улучшили отображение контента на многих сайтах в нашем новом браузере.



Поддержка DOM L3 XPath в Project Spartan



Поддержка DOM L3 XPath в Project Spartan

Сайты до использования WGX

Поддержка DOM L3 XPath в Project Spartan



Поддержка DOM L3 XPath в Project Spartan

И это после.

Обратите внимание на цены и количество выигрышных билетов, которые появляются.

Однако в WGX тоже были ошибки, из-за которых он ведёт себя не так, как в спецификации W3C, так и в других браузерах.

Мы планируем сначала исправить их все, а затем поделиться патчами с сообществом.

Таким образом, в результате некоторого интеллектуального анализа данных в Интернете и с помощью библиотеки с открытым исходным кодом наш новый движок за короткое время приобрел продуктивную поддержку XPath, а пользователи вскоре получат лучшую поддержку веб-стандартов.

Вы можете скачать следующий Техническая предварительная версия Windows 10 , и убедитесь сами.

Вы также можете написать через Пользовательский голос , насколько хорошо мы это сделали, или твитнуть нам, или выскажись в комментариях к оригинальной статье .

PS от переводчика: Тенденция превращения JavaScript в язык, на котором пишутся платформы, что называется, очевидна.

Возьмите Firefox Shumway или PDF.js. Сейчас Microsoft переводит свой браузер, по крайней мере частично, на JS. Теги: #xpath #Project Spartan #microsoft #веб-стандарты #веб-стандарты #Wicked Good XPath #IE #техническая предварительная версия Windows 10 #windows 10 #DOM L3 #разработка веб-сайтов #открытый исходный код #JavaScript #Internet Explorer #xml

Вместе с данным постом часто просматривают: