[Temp] Как отзывы на привью платформы IE9 поменяли стандарт JavaScript
Когда мы впервые представили наши планы насчет Internet Explorer мы говорили что "разработчики и люди интересующиеся в стандартах и веб-разработчики могут испытать новую платформу и дать ранний отзыв". Сейчас мы получаем многочисленные отзывы на ежедневной основе и используем их для улучшения IE9. Однако, иногда влияние отзывов расширяется за пределы IE9. Вот история как недавний отзыв привел к корректировке нового стандарта JavaScript - ECMAScript 5th Edition (ES5).
ES5 стандарт был официально представлен в декабре 2009 года и третья часть привью IE9 впервые получило широкое распространение по внедрению некоторых тонких деталей спецификации ES5. Стандарт ES5 был разработан для высокой совместимости с существующими веб-сайтами и международный технический комитет европейской ассоциации производителей ЭВМ TC39 старался предотвратить любые не безопасные связи способные привести к изменениям, которые могут испортить существующий код JavaScript. Однако, ничего безупречного не существует в мире программ так будет интересно узнать о любых проблемах совместимости ES5 с существующими сайтами.
Скоро после опубликования этой платформы, мы получили отчет что некоторые веб-приложения которые используют jQuery корректно не работают в предварительном просмотре. Мы отследили эту проблему в особенностях jQuery API method которая в некоторых случаях пропускает вызывающую программу к значению Object.prototype.toString без первичной проверки, если значение ноль или неопределенно. Особенно, некоторые вызовы к jQuery method:
isFunction: function( obj ) {
return toString.call(obj) === "[object Function]";
},
выдает ошибку: "TypeError: Object expected". Последующий анализ показал что toString в вышеизложенном коде является встроенным методом Object.prototpe.toString и что сбой происходит когда isFunction был вызван с неизвестным значением как его аргумент. Почему ошибка случается в IE9 но не в предыдущих версиях или других браузерах? Потому что третья часть платформы IE9 в стандартном методе фактически подчиняется спецификации ES5 Object.prototype.toString.
В соответствии с предыдущими версиями спецификации ECMAScript, вызов любого встроенного метода используя значение ноль или неопределенно как текущего значения "глобальный объекта" (в браузерах это объект DOM window) метода такое и есть текущее значение. Это открывает ряд потенциальных брешей в безопасности, которые нацелены на уменьшение безопасности.
Спецификация ES5 изменяет ситуацию, так ноль или неопределенно не заменяется объектом window и определение каждого встроенного метода было обновлено в особенности если имеем дело с возвращением значения как текущего. Технический комитет ECMAScript попробовал сделать это при условии совместимости нормального использования и риска ситуации когда это невозможно. Object.prototype.toString был описан в ES5 исключения таких ситуаций. Это создает совместимость проблем описанных выше.
Эта проблема может быть легко скорректирована изменением кода jQuery с добавлением в код:
isFunction: function( obj ) {
return obj && toString.call(obj) === "[object Function]";
},
Разработчики jQuery собирались сделать данное изменение. Однако, такое изменение не исправит тысячи локальных копий jQuery которые уже существуют в интернете. Учитывая широкое распространение jQuery ясно, что ES5 включает значительное количество схожих проблем. Это очевидно, что мы можем изменить исполнение ES5 в IE9 для решения проблемы. Мы можем вернуть такое же строковое значение ("[object Object]") что и в IE8. Таких решение не принесет каких-либо проблем в безопасность ES5, которые стараются исключить. Однако, мы не хотим в одностороннем порядке внести такое изменение в реализацию нового стандарта. Это не решит проблемы совместимости или взаимодействия если в IE эта проблема будет решения один способом а в других браузерах другим или вообще не решена.
Как только мы поняли проблему и ее решение, я озвучил ее на TC39 при обсуждении обратной совместимости адресных списков. Мой первый пост по поводу данной проблемы был размещен в 17.51 25 июня в пятницу. К 22.00 был получен ответ от TC39. Мы все согласны что данная проблема относится к проблемам совместимости которая требует решения и в данном случае не решение этой проблемы будет нежелательным. Мы также первоначально согласились с тем что идея о возврате такого же строкового значения что и в ES3 в данном случае является хорошей идеей. Однако, в дальнейших сообщения после выходных мы поняли что не все браузеры могут вернуть "[object Object]" в данной ситуации, некоторые другие значения включая "[object Window]" и "[object Global]".Предлагалась возвращать "[object null]" и "[object undefined]". Показалось что это лучшее решение поскольку оно не только решает проблему с jQuery но также четко различает null и undefined от фактических объектах. Также это лучшим образом скажется на взаимодействии браузеров так как требуется чтобы браузеры выдавали идентичные результаты а не в ситуации с ES3 когда различные браузеры выдают различные результаты.
Ко Вторнику консенсус по поводу адресного списка последовал из окончательное предложения. Как только согласие было достигнуто я отдал на проверку Object.prototype.toString нашей группе разработчиков IE9 JavaScript так что они могли создать исправление во время к выходы следующего превью IE9. Разработчики Mozilla также проинформировали что они внедрят это исправление в следующую версию Firefox. Я также внес имения в ошибку в ES5 так как описано в данной статье (параграф 15.2.4.2).
Веб-стандарты являются комплексным программным обеспечением и как все программы, они содержат ошибки. Иногда лучший способ найти и исправить ошибку это применить определенный стандарт для широкого круга пользователей. Обычно такое бывает в случае раннего обнаружения как в случае с превью IE9. Так, когда вы как разработчик веб-страниц составляете отзывы та такие релизы вы не только предоставляете отзыв на определенный браузер вы также предоставляете отзыв на новый и внедряющийся стандарт. Конечно, такой отзыв необходим, разработчикам браузеров и стандартов необходимо иметь возможность быстро реагировать на отзывы в которых найдены существенные проблемы. Быстрая ответная реакция на проблемы с ES5 jQuery toString и другие проблемы с es5 - показывает как разработчики браузеров и другие члены TC39 могут работать совместно для обеспечения большей совместимости и взаимодействия в интернете. Но все это становится возможным благодаря вышим отзывам. Так что пожалуйста держите нас в курсе.
Источник:
Перевод: mik2000
По теме
- Еще пару слов о защите пользователей IE9 от отслеживания
- [Temp] Бенчмарк HTML5 Blizzard: проверьте аппаратное ускорение вашего браузера
- [Temp] Работаем с закрепление сайтов
- Блог IE в 2010: на связи с вами
- С новым аппаратно-ускоренным годом!
- HTML5: экспериментальный и готовый к использованию
- Доступно декабрьское накопительное обновлениие безопасности для IE
- IE9 и конфиденциальность: введение в защиту от слежения
- Более быстрый и умный список Compatibility View List в IE9
- Субпиксельные шрифты в Internet Explorer 9