IE8 Beta 2: изменения в AJAX

С вами Сунава Дутта (Sunava Dutta), программный менеджер Internet Explorer. В мои обязанности входит работа с AJAX в обозревателе. Теперь, когда вышел Internet Explorer 8 Beta 2, я бы хотел рассказать о некоторых изменениях, которые претерпела реализация AJAX с момента релиза Beta 1.

В марте мы обсуждали опыт разработчиков создания таких сценариев AJAX, как междоменный доступ к данным со стороны клиента, локальные хранилища данных, управление состоянием. Хорошая новость состоит в том, что наша команда со времени Beta 1 усиленно работала над тем, чтобы подстроить и обновить реализацию интернет-технологий, основываясь на отзывах, полученных от разработчиков (спасибо за ваш вклад!), а также над внедрением последних черновиков стандартов W3C, на базе которых сделана большая часть данных технологий или которые используются для их реализации. Мы работали не только над поддержкой контента, мы также добавили несколько функций для разработчиков, но о них чуть позже.

Обновления в AJAX, на которых мы решили сосредоточиться в Beta 2, касаются поддержки межплатформенности и инструментах для разработчиков, которые были бы, по их мнению, наиболее полезными. Обойдемся без лишних слов, вот они.

XDomainRequest (XDR)

Этот объект встроен в обозреватель, чтобы упростить и обезопасить междоменные клиентские запросы. Для уменьшения вероятности случайного междоменного доступа, этот объект требует четкого подтверждения разрешения междоменного запроса от клиентского скрипта и сервера. Кроме того, данный объект избавляет от необходимости прибегать к опасной практике внедрения стороннего скрипта прямо в mashup-страницу. Эта практика опасна тем, что она открывает третьей стороне полный доступ к DOM. К этому стоит добавить улучшенную производительность на стороне клиента, а также меньшую стоимость поддержки серверов благодаря тому, что теперь нет необходимости использовать серверные фермы в качестве прокси-серверов.

Во время тестирования Beta 1 к нам поступало очень много жалоб, связанных с безопасностью, из-за междоменного доступа сторонних данных через использование кроссдоменного запроса XMLHttpRequest и инфраструктуры Access Control. Со времени Beta 1 у нас был шанс поработать с другими обозревателями и участниками W3C над увеличением удобства работы на стороне сервера и увеличением безопасности инфраструктуры Access Control, разработанной W3C. В результате, мы обновили XDR до полного соответствия синтаксису и директивам, описанным в параграфах Access Control, по анонимному запросу простых сторонних данных со стороны клиента. Смотрите параграф 5.1.3 в Access Control Process Model.

Обновления в XDR со времен Beta 1 позволяют запрашивать данные с сервера домена, отсылая заголовок Origin с последовательным значением от источника запроса. IE8 Beta 2 вернет ответ только в том случае, если ответ сервера будет содержать Access-Control-Allow-Origin: *, при этом заголовок XDomainRequestAllowed: 1 из Beta 1 использовать запрещено. Другие изменения также включают в себя поддержку относительных путей в методе open и ограничение доступа только для HTTP и HTTPS-получателей.

Cross-document Messaging (XDM)

Cross-document Messaging (XDM) является еще одной мощной междоменной функцией, о которой я уже писал. Вместо того чтобы делать фоновый запрос к удаленной веб-службе, данный объект позволяет сайтам, использующим сторонние гаджеты или компоненты, на основе IFrame связываться напрямую с родителем без нарушения первоначальной политики того же сайта. Этот способ имеет свои преимущества, среди которых улучшенная производительность и надежность, так как разработчикам нет необходимости выполнять обходные маневры, которые мало того, что в разных обозревателях ведут себя по-разному, но и могут иметь нежелательные побочные явления. Эта техника также избавляет от необходимости встраивать сторонний скрипт в вашу страницу, уменьшая тем самым шансы по потенциальному раскрытию ваших конфиденциальных данных (например, информации о вашем профиле в социальной сети) третьим сторонам без вашего согласия.

Обновления в Beta 2 также включают в себя переход обработчика onmessage от объекта document в объект window для обеспечения максимального соответствия с обновленным черновиком HTML 5.0.

Код:

window.attachEvent("onmessage", HandleMessage);

Мы также заменили e.URI на e.origin – последовательную форму "схема" + "хост" + "нестандартный порт". Это намного безопаснее, так как URI может обрабатывать потенциально небезопасную информацию с родительского сайта, который не нужен для принятия решения о предоставлении или непредоставлении доступа.

Код:

if (e.origin == 'https://www.contoso.com')

{

// process message text

}

В спецификации HTML 5.0 также говорится, что параметр targetOrigin для метода postMessage теперь будет обязательным параметром, а не опциональным. Это не позволит разработчиком делать ошибки, требуя четкого подтверждения целевого назначения сообщения, благодаря точному определению первоначального <URL> или группового символа <*>.

Код:

frameOther.postMessage("This is a message", "https://example.com");

DOM Storage

Сегодня страницы используют свойство document.cookie для хранения данных на локальном компьютере. Файлы Cookie ограничены тем, что сайты могут хранить только 50 пар ключей/значений для одного домена. Кроме того, программная модель cookie громоздка и требует синтаксического разбора всей строчки cookie для получения данных. В то время, как cookie полезны при отслеживании перемещений и изменений на стороне клиента для последующей передаче на сервер, IE8 предлагает подходящие альтернативы для сценариев, подразумевающих хранение данных на стороне клиента и четкое разграничение сессий в различных вкладках. Объекты DOM Storage из HTML 5, разрабатываемом W3C, обеспечивают намного более простую модель хранения строчек данных ключ/значение. Сайты могут хранить данные до тех пор, пока открыта вкладка или пока пользователь или сайт не удалят данные.

Также в Beta 2 изменено имя постоянного атрибута globalStorage на localStorage и удалена необходимость определять домен при записи в localStorage

Код:

// Store a key-value pair.

localStorage.setItem("FirstName","Sunava");

В IE8 Beta 2 мы включили усовершенствованную поддержку обновленного события HTML 5.0 onstorage, возвращаемого в случае изменений в хранилище. Теперь, когда локальное хранилище изменено, IE8 возвращает URI. Таким образом, обработчик страниц знает, кто вызвал последнюю транзакцию в пространстве хранилища. Следует отметить, что рабочая группа HTML 5.0 включила метод clear, которого не было в Beta 1, в проект стандарта. По сути данный метод позволяет скриптам удалять все доступное в их хранилищах содержимое без необходимости проведения итераций через все ключи.

Состояние подключения

Свойство navigator.onLine и состояние подключен/отключен теперь также работают в Windows XP, как и в Windows Vista. Работу по реализации этой возможности нельзя назвать тривиальной, так как осведомленность о подключении в Windows XP не настолько расширена, как в Windows Vista. Таким образом, она будет чрезвычайно полезна для разработчиков, которые, по нашему мнению, не должны беспокоиться о версии операционной системы. Значение состояния подключения особенно становится привлекательным при использовании совместно с атрибутом localstorage, при применении которого в случае потери подключения к сети все данные могут быть кэшированы.

XMLHttpRequest

Появление в IE8 объекта XDomainRequest ни в коей степени не означает, что мы отказались от постоянной настройки и улучшения объекта XMLHttpRequest, который продолжает оставаться нашим флагманом для коммуникаций с тем же доменом. После выхода Beta 1 основные усилия были направлены на исправление нескольких ошибок, связанных с надежностью, работу с группой W3C над прояснением и улучшением проектов спецификаций, подтверждением соответствия наших реализаций этим проектам и публичным тестам W3C. Метод timeout, дебютировавший в Beta 1, сейчас рассматривается для включения в спецификации XMLHttpRequest.

Код:

// Sets timeout after open to two seconds.

xhr.timeout = 2000;

ToStaticHTML: в JSON и из JSON

Что вы делаете со строкой, возвращенной от третьей стороны с использованием XDomainRequest или Cross-document Messaging? В сегодняшнем мире с его увеличивающимся количеством скриптовых инъекций и XSS-атак, возможность обойти их с помощью безопасной программы синтаксического анализа является желанным выходом. Как уже говорилось в статье Эрика Лоуренса (Eric Lawrence) Безопасность IE8: всесторонняя защита, метод toStaticHTML является мощнейшим способом для очистки кода вашего сайта от небезопасного контента.

Код:

//Calling:

window.toStaticHTML("This is some <b>HTML</b> with embedded script following... <script>alert('bang!');</script>!");

//will return:

This is some <b>HTML</b> with embedded script following... !

Кроме того, методы JSON.stringify и JSON.parse имеют лучшую производительность по сравнению с последовательными JavaScript-преобразователями. Наша реализация основана на предложении ECMAScript 3.1 для native-обработки JSON, которое использует API json2.js от Дугласа Крокфорда (Douglas Crockford). Кроме преимуществ в производительности, JSON-анализатор является гораздо более безопасной альтернативой методу eval(), который используется довольно часто при реставрации объектов JSON и может допустить исполнение случайной функции скрипта.

Другие функции

AJAX Navigations претерпел минимальные изменения со времен Beta 1. На MSDN мы разместили некоторые новые примеры кода и общую информацию по данной теме в Beta 2. Усовершенствованный параллелизм подключений также претерпел небольшие изменения и вскоре удостоится отдельной статьи.

Итоги

Мы работали в рамках стандартов, чтобы улучшить удобство работы с AJAX. В будущем мы продолжим взаимодействие с членами консорциума W3C. Принятие разработчиками этих функций является приоритетом для нас, поэтому мы намерены сконцентрироваться на том, чтобы помочь сайтам перейти к их интеграции. За примерами кода набора функций AJAX, пожалуйста, обращайтесь к нашей лаборатории IE8 AJAX Beta 2.

Сунава Дутта (Sunava Dutta),

Программный менеджер Internet Explorer