Этот документ является переводом исходной версии
Тайминг навигации. Может содержать ошибки.
© Дмитрий Щербина, 2013
Пожалуйста, обращайтесь к списку ошибок для этого документа, который может включать некоторые нормативные исправления.
См. также переводы.
Copyright © 2012 W3C® (MIT, ERCIM, Keio), Все права защищены. Применяются правила ответственности, защиты товарного знака и использования документов W3C .
Эта спецификация определяет интерфейс для веб-приложений для доступа к информации о тайминге навигации.
Этот раздел описывает статус этого документа на момент его публикации. Другие документы могут заменить этот документ. Список текущих публикаций W3C и последнюю ревизию этого технического отчета можно найти в Перечне технических отчетов W3C.
Это рекомендация W3C по "Спецификации тайминга навигации". Доступен отчет о выполнении, созданный за время фазы кандидата в рекомендации в 2012, который основан на наборе тестов по таймингу навигации.
Комментарии присылайте по адресу [email protected] (архив), начиная тему письма с пометки [NavigationTiming].
Документ разработан Рабочей группой Web Performance. Доступны различия с предыдущим черновиком.
Данный документ был рассмотрен членами W3C, разработчиками программного обеспечения, и другими группами и заинтересованными участниками W3C, и одобрен Директором в качестве рекомендации W3C. Это стабильный документ и может быть использован в качестве справочного материала или для цитирования в другом документе. Роль W3C в придании статуса Рекомендации заключается в том, чтобы привлечь внимание к данной спецификации и способствовать ее широкому распространению. Это повышает функциональность и совместимость Всемирной Паутины.
Этот документ был подготовлен группой, работающей согласно патентной политики W3C от 5 февраля 2004 г.. W3C поддерживает открытый список любых раскрытий патентов, сделанных в результате взаимодействия с представителями группы; данный доумент также содержит инструкции по раскрытию патента. Лица, имеющие сведения о патентах, которые по их мнению содержат существенные утвреждения, должны раскрыть эту информацию в согласии с разделом 6 патентной политики W3C.
Этот раздел не является нормативным.
Задержка пользования - важный показатель качества для веб-приложений. При том, что основанные на скриптах механизмы, подобные тому, что описаны в [JSMEASURE], могут обеспечить всесторонний инструментарий для измерения задержки пользования в рамках приложения, во многих случаях они не в состоянии дать полную картину от начала до конца.
Например, следующий скрипт показывает наивную попытку измерить время, которое требуется для полной загрузки страницы:
<html> <head> <script type="text/javascript"> var start = new Date().getTime(); function onLoad() { var now = new Date().getTime(); var latency = now - start; alert("page loading time: " + latency); } </script> </head> <body onload="onLoad()"> <!- Здесь идет основной код страницы. --> </body> </html>
Этот скрипт вычисляет время, необходимое для загрузки страницы, после того, как исполнится первый бит JavaScript кода в заголовке, но при этом не дает никакой информации о времени, которое требуется для получения страницы с сервера.
Чтобы удовлетворить потребность в полной информации об опыте пользователей, этот документ вводит
интерфейс PerformanceTiming
. Этот интерфейс
позволяет механизмам на JavaScript полностью обеспечить потребность разработчиков в измерении задержек на стороне клиента в рамках приложения.
С помощью предлагаемого интерфейса предыдущий пример может быть модифицирован так, чтобы измерить время загрузки страницы,
как его воспринимает пользователь.
Следующий скрипт подсчитывает, сколько времени уходит на то, чтобы загрузить страницу, с момента последней навигации.
<html> <head> <script type="text/javascript"> function onLoad() { var now = new Date().getTime(); var page_load_time = now - performance.timing.navigationStart; alert("Воспринимаемое пользователем время загрузки: " + page_load_time); } </script> </head> <body onload="onLoad()"> <!- Содержимое главной страницы. --> </body> </html>
Предоставляемый в этой работе интерфейс не предполагает использования в качестве любого рода тестов производительности для браузеров.
Все диаграммы, примеры и заметки в этой спецификации не являются нормативными, как и все разделы явно отмеченные как ненормативные. Все остальное в этой спецификации является нормативным.
Ключевые слова "ДОЛЖНЫ", "НЕ ДОЛЖНЫ", "ТРЕБУЕТСЯ", "СЛЕДУЕТ", "НЕ СЛЕДУЕТ", "РЕКОМЕНДУЕТСЯ", "МОЖЕТ" и "НЕОБЯЗАТЕЛЬНО" в нормативных частях этого документа должны толковаться так, как это описано в RFC 2119. Для удобства чтения эти слова не пишутся заглавными буквами в этой спецификации.
Требования, сформулированные в повелительном наклонении как часть алгоритмов (например, "убрать любые предшествующие пробелы" или "возвратить false и прервать эти действия") должны толковаться в значении ключевых слов ("должен", "следует", "может ", и т.д.), используемые в начале описания алгоритмов.
Некоторые требования соответствия сформулированы как требования к атрибутам, методам и объектам. Такие требования должны быть интерпретированы как требования для браузеров.
Требования соответствия, сформулированные как алгоритм или специфические действия, могут выполняться любым способом при условии, что получается эквивалентный конечный результат. (В частности, алгоритмы, определенные в этой спецификации, предназначены для легкости следования, а не для эффективности исполнения.)
IDL фрагменты в этой спецификации должны интерпретироваться как соответствующие IDL фрагментам, описанным в спецификации Web IDL. [Web IDL]
Конструкция "объект Foo
", где Foo
является интерфейсом, иногда используется вместо более точного "объект, реализующий интерфейс Foo
".
Термин "навигация" относится к акту навигации.
Термин "JavaScript" используется в отношении ECMA-262 вместо официального термина ECMAScript, поскольку термин JavaScript более широко известен.
В этой работе время измеряется в миллисекундах от полночи 1 января 1970 года (UTC). Заметьте, что спецификация Навигационный тайминг 2 [Навигационный тайминг 2] разрешает доступ к информации о тайминге навигации с разрешением до долей миллисекунд.
Этот раздел не является нормативным
Эта спецификация представляет интерфейс, который предоставляет веб-приложениям информацию о тайминге. Эта спецификация не охватывает вопросы о том, как веб-приложения используют эти интерфейсы для сбора, хранения и предоставления этой информации.
PerformanceTiming
interface PerformanceTiming { readonly attribute unsigned long long navigationStart; readonly attribute unsigned long long unloadEventStart; readonly attribute unsigned long long unloadEventEnd; readonly attribute unsigned long long redirectStart; readonly attribute unsigned long long redirectEnd; readonly attribute unsigned long long fetchStart; readonly attribute unsigned long long domainLookupStart; readonly attribute unsigned long long domainLookupEnd; readonly attribute unsigned long long connectStart; readonly attribute unsigned long long connectEnd; readonly attribute unsigned long long secureConnectionStart; readonly attribute unsigned long long requestStart; readonly attribute unsigned long long responseStart; readonly attribute unsigned long long responseEnd; readonly attribute unsigned long long domLoading; readonly attribute unsigned long long domInteractive; readonly attribute unsigned long long domContentLoadedEventStart; readonly attribute unsigned long long domContentLoadedEventEnd; readonly attribute unsigned long long domComplete; readonly attribute unsigned long long loadEventStart; readonly attribute unsigned long long loadEventEnd; };
navigationStart
attributeЭтот атрибут должен возвращать момент времени, который был сразу после того, как браузер заканчивает приглашение выгрузить предыдущий документ. Если нет предыдущего документа, этот атрибут должен возвращать то же значение, что и fetchStart.
unloadEventStart
attributeЕсли предыдущий документ и текущий документ имеют одинаковый источник [IETF RFC 6454], этот атрибут должен возвратить момент времени сразу перед тем, как браузер начал событие выгрузки предыдущего документа. Если предыдущего документа нет или предыдущий документ имеет другой источник чем текущий документ, то этот атрибут должен возвратить ноль.
unloadEventEnd
attributeЕсли предыдущий документ и текущий документ имеют одинаковый источник, этот атрибут должен возвратить момент времени сразу после того, как браузер закончил событие выгрузки предыдущего документа. Если предыдущего документа нет или предыдущий документ имеет с текущим документом разные источники или выгрузка еще не завершена, то этот атрибут должен возвратить ноль.
Если во время навигации произошли HTTP перенаправления или эквивалентные события и не все перенаправления из одного источника, то оба атрибута, unloadEventStart и unloadEventEnd, должны возвратить ноль.
redirectStart
attribute Если во время навигации произошли HTTP перенаправления или эквивалентные события и если все перенаправления из одного источника, то этот атрибут возвращает время начала загрузки, которая инициирует перенаправление. В других случаях этот атрибут должен возвратить ноль.
redirectEnd
attribute Если во время навигации произошли HTTP перенаправления или эквивалентные события и если все перенаправления из одного источника, то этот атрибут должен возвратить момент времени сразу после получения последнего байта ответа последнего перенаправления. В других случаях этот атрибут должен возвратить ноль.
fetchStart
attributeЕсли с использованием HTTP GET или эквивалента загружается новый ресурс, fetchStart должен возвратить момент времени непосредственно перед тем, как браузер начнет проверку любого типа кеша уровня приложения. В противном случае атрибут должен возвратить момент времени, когда браузер начал загрузку данного ресурса.
domainLookupStart
attributeЭтот атрибут должен возвратить момент времени непосредственно перед тем, как браузер начнет запрос имени домена для текущего документа. Если используется постоянное соединение [RFC 2616] или текущий документ получен из релевантного кеша приложения или локальных ресурсов, этот атрибут должен возвратить то же значение, что и fetchStart.
domainLookupEnd
attributeЭтот атрибут должен возвратить момент времени сразу после того, как браузер закончит запрос имени домена для текущего документа. Если используется постоянное соединение [RFC 2616] или текущий документ получен из релевантного кеша приложения или локальных ресурсов, этот атрибут должен возвратить то же значение, что и fetchStart.
Этот раздел не является нормативным.
Проверка и извлечения содержимого из HTTP кеша [RFC 2616] является частью процесса получения документа. Этот процесс характеризуется атрибутами requestStart, responseStart и responseEnd.
В случае, когда браузер уже имеет в своем кэше информацию о домене , domainLookupStart и domainLookupEnd представляют те времена, когда браузер начинает и заканчивает извлечение данных о домене из кэша.
connectStart
attributeЭтот атрибут должен возвратить момент времени непосредственно перед тем, как браузер начнет установку соединения с сервером для получения документа. Если используется постоянное соединение [RFC 2616] или текущий документ получен из релевантного кеша приложения или локальных ресурсов, этот атрибут должен возвратить значение domainLookupEnd.
connectEnd
attribute Этот атрибут должен возвратить момент времени сразу после того, как браузер закончит соединение с сервером для получения документа. Если используется постоянное соединение [RFC 2616] или текущий документ получен из релевантного кеша приложения или локальных ресурсов, этот атрибут должен возвратить значение domainLookupEnd
Если транспортное соединение обрывается, и браузер возобновляет связь, в атрибутах connectStart и connectEnd следует возращать соответствующие значения для новых соединений.
connectEnd должен включать интервал времени для установления транспортного соединения, а также время, ушедшее на другие действия, такие как SSL рукопожатия и SOCKS аутентификации.
secureConnectionStart
attributeЭтот атрибут необязательный. Браузер, который не предоставляет этот атрибут, должен задать его как undefined. Когда этот атрибут доступен, если схема текущей страницы HTTPS, то этот атрибут должен возвратить момент времени непосредственно перед тем, как браузер начнет процесс рукопожатия для установления безопасного соединения. Если атрибут доступен, но HTTPS не используется, то этот атрибут должен возвратить ноль.
requestStart
attributeЭтот атрибут должен возвратить момент времени непосредственно перед тем, как браузер начнет запрос на получение документа с сервера или из релевантного кеша приложения или из локальных ресурсов.
Если транспортное соединение обрывается после того, как послан запрос, и браузер возобновляет соединение и перепосылает такой же запрос, то в качестве атрибута requestStart следует возвращать соответствующее значение нового запроса.
Этот интерфейс не включает атрибута, представляющего завершение отправки запроса, например, requestEnd.
responseStart
attribute Этот атрибут должен возвратить момент времени сразу после того, как браузер получит первый байт ответа от сервера или из релевантного кеша приложения или из локальных ресурсов.
responseEnd
attributeЭтот атрибут должен возвратить момент времени сразу после того, как браузер получит последний байт текущего документа, или непосредственно перед тем, как транспортное соединение закроется. Возвращается время того события, которое случилось первым. При этом текущий документ может быть получен с сервера, релевантного кеша приложения или из локальных ресурсов.
domLoading
attributeЭтот атрибут должен возвратить момент времени непосредственно перед тем, как браузер задаст текущую готовность документа в значение "loading".
domInteractive
attributeЭтот атрибут должен возвратить момент времени непосредственно перед тем, как браузер задаст текущую готовность документа в значение "interactive".
domContentLoadedEventStart
attributeЭтот атрибут должен возвратить момент времени непосредственно перед тем, как браузер запустит событие DOMContentLoaded
для объекта Document
.
domContentLoadedEventEnd
attributeЭтот атрибут должен возвратить момент времени сразу после того, как завершится событие документа DOMContentLoaded.
domComplete
attributeЭтот атрибут должен возвратить момент времени непосредственно перед тем, как браузер задаст текущую готовность документа в значение "complete".
Если текущая готовность документа изменяется на одно и тоже значение несколько раз, атрибуты domLoading, domInteractive, domContentLoadedEventStart, domContentLoadedEventEnd и domComplete должны возвращать время первого соответствующего изменения готовности документа.
loadEventStart
attribute Этот атрибут должен возвратить момент времени непосредственно перед событием загрузки документа. Он должен возвратить ноль, если событие загрузки еще не случилось.
loadEventEnd
attributeЭтот атрибут должен возвратить момент времени, когда событие загрузки текущего документа завершено. Он должен возвратить ноль, если событие загрузки еще не случилось или не завершилось.
PerformanceNavigation
interfaceinterface PerformanceNavigation { const unsigned short TYPE_NAVIGATE = 0; const unsigned short TYPE_RELOAD = 1; const unsigned short TYPE_BACK_FORWARD = 2; const unsigned short TYPE_RESERVED = 255; readonly attribute unsigned short type; readonly attribute unsigned short redirectCount; };
type
attributeЭтот атрибут возвращает тип последней навигации без перенаправлений в текущем контексте. Он должен иметь одно из следующих значений типов навигации.
Навигация началась с клика по ссылке или ввода URL в адресной строке браузера, или отправки формы, или инициализации через операцию в скрипте, отличную от тех, что используются при TYPE_RELOAD и TYPE_BACK_FORWARD, описанных ниже.
Навигация путем операции перезагрузки или методом location.reload().
Навигация путем перемещения по истории.
Любая навигация, не определяющаяся вышеуказанными значениями.
Перенаправления на стороне клиента, например, с использованием директивы Refresh, не рассматриваются данной спецификацией как HTTP перенаправления или эквивалентные события. В таких случаях, в качестве атрибута type следует возвращать приемлемое значение, такое как TYPE_RELOAD, если перезагружаеется текущая страница, или TYPE_NAVIGATE, если происходит переход на новый URL.
redirectCount
attribute Этот атрибут должен возвратить количество перенаправлений со времени последней навигации без перенаправлений в текущем контексте браузера. Если нет перенаправлений или есть перенаправления не из того же источника, что конечный документ, то этот атрибут должен возвратить ноль.
window.performance
attributeHTML5 спецификация определяет интерфейс Window [HTML5], который расширяется в данной спецификации.
interface Performance { readonly attribute PerformanceTiming timing; readonly attribute PerformanceNavigation navigation; }; partial interface Window { [Replaceable] readonly attribute Performance performance; };
Атрибут window.performance представляет собой корневую область для атрибутов, связанных со скоростью выполнения.
timing
attribute
Атрибут timing
предоставляет информацию о тайминге в контексте последней навигации без перенаправлений.
Этот атрибут определяется интерфейсом PerformanceTiming.
navigation
attribute
Атрибут navigation
определяется интерфейсом PerformanceNavigation
.
Все атрибуты в window.performance.timing и window.performance.navigation не следует записывать до тех пор, пока не создан объект Window для текущего документа, даже если их атрибуты упоминаются в следующих примерах для облегчения описания.
Браузеры могут предоставлять пользователям возможность отключения интерфейсов window.performance.timing и window.performance.navigation. Когда эти интерфейсы отключены, то и window.performance.timing, и window.performance.navigation должны возвращать значение null.
Браузер может содержать экземпляры интерфейсов PerformanceTiming и PerformanceNavigation до тех пор, пока не будет создан объект Window object, связанный с текущим документом, и тогда window.performance.timing и window.performance.navigation будут заменены на эти экземпляры.
Этот рисунок не является нормативным.
Следующий график иллюстрирует атрибуты тайминга, определенные в
интерфейсе PerformanceTiming
и интерфейсе
PerformanceNavigation
с или без перенаправления, соответственно.
Подчеркнутые атрибуты могут быть недоступны при навигации между документами из разных
источников.
Браузеры могут производить внутреннюю обработку между отметками времени, что делает интервалы между этими моментами времени ненормативными.
Вернитесь к шагу 11 если браузер не смог послать запрос или получить весь ответ полностью, и нуждается в переоткрытии соединения.
Если работает постоянное соединение [RFC 2616] , то браузер может сперва попытаться повторно использовать открытое соединение, в то время как соединение может асинхронно закрыться. В этом случае следует сделать так, чтобы connectStart, connectEnd и requestStart представляли информацию о тайминге, собранную для переоткрытого соединения.
От объекта window к объектам window.performance.timing и window.performance.navigation идут подразумеваемые сильные ссылки.
Значения атрибутов тайминга должны расти монотонно, дабы атрибуты тайминга не искажались изменениями настройки системных часов во время навигации. Различия между двумя значениями атрибутов, записанных в хронологическом порядке, никогда не должны быть негативными. Для всех навигаций, включая навигацию внутри документа, браузер должен записывать значение системных часов в начале навигации по корневому документу и определять последующие атрибуты тайминга посредством монотонных часов, измеряющих время, прошедшее от начала навигации.
Проприеритарные вендор-специфические браузерные расширения не учитываются. Если нужны такие расширения, например, для экспериментальных целей, вендоры должны использовать следующий механизм расширения:
Этот раздел не является нормативным.
Потенциально существует возможность раскрытия истории посещения сайтов и активности конечного пользователя при применении тщательно подготовленной атаки на атрибуты тайминга. Например, время выгрузки показывает, как долго потребовалось предыдущей странице для выполнения своего обработчика события выгрузки, что могло бы использоваться для выяснения был ли пользователь авторизован на сайте. Опасность таких атак снижается введением политики одного источника, когда предоставляется доступ к информации о тайминге предшествующей навигации.
Смягченная политика одного источника не обеспечивает достаточную защиту против несанкционированных перемещений между документами. При виртуальном хостинге недоверенная третья сторона может предоставлять доступ к HTTP серверу на том же IP адресе, но через другой порт.
Разные страницы, расположенные на одном хосте, например, контент от разных авторов, размещенный на сайтах с контентом, создаваемым пользователями, считаются имеющими один источник, поэтому нет способа ограничить доступ по полному адресу этих страниц. Навигация между такими страницами позволяет более поздней из них получить доступ к такой информации о тайминге предыдущей, как тайминг перенаправления и события выгрузки.
Этот раздел не является нормативным.
В случае, если между браузером и веб-сервером развернут прокси-сервер, интервал времени между атрибутами connectStart и connectEnd определяется задержкой между браузером и прокси сервером вместо веб сервера. По этой задержке веб-сервер может потенциально вычислить наличие прокси. Для SOCKS прокси-серверов этот временной интервал включает в себя время аутентификации на прокси сервере и время на соединение прокси сервера к веб серверу, что затрудняет обнаружение прокси. В случае HTTP прокси, браузер вообще может не иметь возможности узнать о наличии прокси-сервера, так что такой метод не всегда пригоден для ослабления этого типа атак.
Объект window.performance является перезаписываемым, чтобы избежать конфликтов с существующими страницами, использующими тот же самый объект. За счет этого становится возможным замена этого объекта с третьей стороны так, что работа скриптов, описанных в этой работе и опирающихся на данный интерфейс, может быть нарушена.
Хочу выразить искреннюю благодарность всем людям, с которыми пришлось взаимодействовать при написани этого документа, включая Anderson Quach, Alex Russell, Alois Reitbauer, Annie Sullivan, Christian Biesinger, Darin Fisher, Eric Lawrence, James Simonsen, Jatinder Mann, Jason Sobel, Jason Weber, Jonas Sicking, Kyle Scholz, Lenny Rachitsky, Nic Jansma, Richard Rabbat, Sergey Novikov, SigbjГёrn Vik, Steve Souders, Tony Gentilcore за их рецензии и комментарии.