W3C

Tайминг навигации

W3C рекомендация 17 декабря 2012

Этот документ является переводом исходной версии Тайминг навигации. Может содержать ошибки.
© Дмитрий Щербина, 2013

Эта версия:
http://www.w3.org/TR/2012/REC-navigation-timing-20121217/
Последняя версия:
http://www.w3.org/TR/navigation-timing/
Предыдущая версия:
http://www.w3.org/TR/2012/PR-navigation-timing-20120726/
Редактор:
Жиэнг Ван (Google Inc.) <>

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

См. также переводы.


Резюме

Эта спецификация определяет интерфейс для веб-приложений для доступа к информации о тайминге навигации.

Статус этого документа

Этот раздел описывает статус этого документа на момент его публикации. Другие документы могут заменить этот документ. Список текущих публикаций W3C и последнюю ревизию этого технического отчета можно найти в Перечне технических отчетов W3C.

Это рекомендация W3C по "Спецификации тайминга навигации". Доступен отчет о выполнении, созданный за время фазы кандидата в рекомендации в 2012, который основан на наборе тестов по таймингу навигации.

Комментарии присылайте по адресу public-web-perf@w3.org (архив), начиная тему письма с пометки [NavigationTiming].

Документ разработан Рабочей группой Web Performance. Доступны различия с предыдущим черновиком.

Данный документ был рассмотрен членами W3C, разработчиками программного обеспечения, и другими группами и заинтересованными участниками W3C, и одобрен Директором в качестве рекомендации W3C. Это стабильный документ и может быть использован в качестве справочного материала или для цитирования в другом документе. Роль W3C в придании статуса Рекомендации заключается в том, чтобы привлечь внимание к данной спецификации и способствовать ее широкому распространению. Это повышает функциональность и совместимость Всемирной Паутины.

Этот документ был подготовлен группой, работающей согласно патентной политики W3C от 5 февраля 2004 г.. W3C поддерживает открытый список любых раскрытий патентов, сделанных в результате взаимодействия с представителями группы; данный доумент также содержит инструкции по раскрытию патента. Лица, имеющие сведения о патентах, которые по их мнению содержат существенные утвреждения, должны раскрыть эту информацию в согласии с разделом 6 патентной политики W3C.

Содержание

  1. 1 Введение
  2. 2 Требования соответствия
  3. 3 Терминология
  4. 4 Навигационный тайминг
    1. 4.1 Введение
    2. 4.2 The PerformanceTiming interface
    3. 4.3 The PerformanceNavigation interface
    4. 4.4 The window.performance attribute
  5. 5 Process
    1. 5.1 Processing Model
    2. 5.2 Garbage Collection
    3. 5.3 Monotonic Clock
    4. 5.4 Vendor Prefixes
  6. 6 Privacy
    1. 6.1 Information disclosure
    2. 6.2 Cross-directory access
  7. 7 Security
    1. 7.1 Detecting proxy servers
    2. 7.2 Tampering by replacing timing objects
  8. 8 References
    1. 8.1 Normative References
    2. 8.2 Informative References
  9. Acknowledgements

1 Введение

Этот раздел не является нормативным.

Задержка пользования - важный показатель качества для веб-приложений. При том, что основанные на скриптах механизмы, подобные тому, что описаны в [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>

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

2 Требования соответствия

Все диаграммы, примеры и заметки в этой спецификации не являются нормативными, как и все разделы явно отмеченные как ненормативные. Все остальное в этой спецификации является нормативным.

Ключевые слова "ДОЛЖНЫ", "НЕ ДОЛЖНЫ", "ТРЕБУЕТСЯ", "СЛЕДУЕТ", "НЕ СЛЕДУЕТ", "РЕКОМЕНДУЕТСЯ", "МОЖЕТ" и "НЕОБЯЗАТЕЛЬНО" в нормативных частях этого документа должны толковаться так, как это описано в RFC 2119. Для удобства чтения эти слова не пишутся заглавными буквами в этой спецификации.

Требования, сформулированные в повелительном наклонении как часть алгоритмов (например, "убрать любые предшествующие пробелы" или "возвратить false и прервать эти действия") должны толковаться в значении ключевых слов ("должен", "следует", "может ", и т.д.), используемые в начале описания алгоритмов.

Некоторые требования соответствия сформулированы как требования к атрибутам, методам и объектам. Такие требования должны быть интерпретированы как требования для браузеров.

Требования соответствия, сформулированные как алгоритм или специфические действия, могут выполняться любым способом при условии, что получается эквивалентный конечный результат. (В частности, алгоритмы, определенные в этой спецификации, предназначены для легкости следования, а не для эффективности исполнения.)

IDL фрагменты в этой спецификации должны интерпретироваться как соответствующие IDL фрагментам, описанным в спецификации Web IDL. [Web IDL]

3 Терминология

Конструкция "объект Foo", где Foo является интерфейсом, иногда используется вместо более точного "объект, реализующий интерфейс Foo".

Термин "навигация" относится к акту навигации.

Термин "JavaScript" используется в отношении ECMA-262 вместо официального термина ECMAScript, поскольку термин JavaScript более широко известен.

В этой работе время измеряется в миллисекундах от полночи 1 января 1970 года (UTC). Заметьте, что спецификация Навигационный тайминг 2 [Навигационный тайминг 2] разрешает доступ к информации о тайминге навигации с разрешением до долей миллисекунд.

4 Тайминг навигации

4.1 Введение

Этот раздел не является нормативным

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

4.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

Этот атрибут должен возвратить момент времени, когда событие загрузки текущего документа завершено. Он должен возвратить ноль, если событие загрузки еще не случилось или не завершилось.

4.3 The PerformanceNavigation interface

interface 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

Этот атрибут возвращает тип последней навигации без перенаправлений в текущем контексте. Он должен иметь одно из следующих значений типов навигации.

TYPE_NAVIGATE

Навигация началась с клика по ссылке или ввода URL в адресной строке браузера, или отправки формы, или инициализации через операцию в скрипте, отличную от тех, что используются при TYPE_RELOAD и TYPE_BACK_FORWARD, описанных ниже.

TYPE_RELOAD

Навигация путем операции перезагрузки или методом location.reload().

TYPE_BACK_FORWARD

Навигация путем перемещения по истории.

TYPE_RESERVED

Любая навигация, не определяющаяся вышеуказанными значениями.

Перенаправления на стороне клиента, например, с использованием директивы Refresh, не рассматриваются данной спецификацией как HTTP перенаправления или эквивалентные события. В таких случаях, в качестве атрибута type следует возвращать приемлемое значение, такое как TYPE_RELOAD, если перезагружаеется текущая страница, или TYPE_NAVIGATE, если происходит переход на новый URL.

redirectCount attribute

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

4.4 window.performance attribute

HTML5 спецификация определяет интерфейс 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.

5 Процесс

5.1 Модель обработки

Все атрибуты в 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 с или без перенаправления, соответственно. Подчеркнутые атрибуты могут быть недоступны при навигации между документами из разных источников. Браузеры могут производить внутреннюю обработку между отметками времени, что делает интервалы между этими моментами времени ненормативными.

Timing attributes

  1. Если навигация прерывается по любой из следующих причин, остановите соответствующие действия без изменения атрибутов window.performance.timing и window.performance.navigation.
    1. Навигация прекращается в связи с флагом контекста изолированной навигации или флагом контекста изолированной навигации верхнего уровня или с уже существующей попыткой навигации в данном контексте.
    2. Навигация вызвана переходом по идентификатору фрагмента внутри страницы.
    3. Новый ресурс будет обработан в пределах какого-то встроенного содержимого.
    4. Новый ресурс будет обработан с помощью механизма, который не влияет на текущий контекст.
    5. Пользователь отказывается          разрешить выгрузку документа.
  2. Сразу после того, как браузер предлагает выгрузить предыдущий документ, запишите текущее время как navigationStart.
  3. Запишите текущий тип навигации window.performance.navigation.type если он еще не задан:
    1. Если навигация была начата с клика на ссылке или с ввода URL в адресной строке браузера или подтверждением формы или инициализацией через действие скрипта отличное от метода location.reload(), то задается тип навигации TYPE_NAVIGATE.
    2. Если навигация была начата через meta refresh, или метод location.reload() или других эквивалентных действий, то задайте тип навигации TYPE_RELOAD.
    3. Если навигация была начата в результате перемещения по истории, задайте тип навигации TYPE_BACK_FORWARD.
    4. Во всех других случаях задайте тип навигации TYPE_RESERVED.
  4. Если текущий и предыдущий документы получены из разных источников, задайте значения unloadEventStart и unloadEventEnd равными 0, затем перейдите к пункту 6. В противном случае запишите в unloadEventStart момент времени непосредственно перед событием unload.
  5. Сразу после завершения события unload, запишите текущее время в качестве значения unloadEventEnd.
  6. Если надо получить новый ресурс с использованием HTTP GET или эквивалента, то непосредственно перед тем, как браузер проверит соответствующие кеши приложения, запишите текущее время в fetchStart. В противном случае непосредственно перед тем, как начнется процесс загрузки, запишите текущее время в fetchStart.
  7. Сделайте так, чтобы domainLookupStart, domainLookupEnd, connectStart и connectEnd имели то же значение, что и fetchStart.
  8. Если ресурс получен из соответствующих кешей приложений или локальных ресурсов, включая HTTP cache, перейдите к шагу 13.
  9. Если запрос имени домена не требуется, перейдите к шагу11. Иначе непосредственно перед тем, как браузер начнет запрос имени домена запишите текущее время в domainLookupStart.
  10. В свойство domainLookupEnd запишите текущее время сразу после успешного завершения запроса имени домена. Браузеру может потребовать несколько попыток для этого. Если запрос не удается, остальные действия выполнять не нужно.
  11. Если для получения ресурса используется постоянное соединение, то для connectStart и connectEnd задайте те же значения, что и domainLookupEnd. В противном случае запишите текущее время непосредственно перед тем, как браузер начнет установку соединения с сервером, в connectStart, а время сразу после установления соединения с сервером или прокси запишите в connectEnd. Браузеру может потребовать несколько попыток для этого. Если установление соединения невозможно, то остальные шаги выполнять не нужно.
  12. В шаге 11, браузеру, если он поддерживает атрибут secureConnectionStart, также следует выполнить следующие дополнительные шаги:
    1. Если схема текущего документа - HTTPS, то браузер должен записать текущее время в secureConnectionStart непосредственно перед тем, как браузер начнет процесс рукопожатия для установления безопасного соединения.
    2. Если схема текущего документа не HTTPS, браузер должен задать значение 0.
  13. Непосредственно перед тем, как браузер начнет запрос на получение документа с сервера, запишите текущее время в requestStart.
  14. Сразу после того, как браузер получит первый байт ответа от сервера, запишите текущее время в responseStart.
  15. Запишите текущее время в responseEnd сразу после получения последнего байта ответа.

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

    Пример

    Если работает постоянное соединение [RFC 2616] , то браузер может сперва попытаться повторно использовать открытое соединение, в то время как соединение может асинхронно закрыться. В этом случае следует сделать так, чтобы connectStart, connectEnd и requestStart представляли информацию о тайминге, собранную для переоткрытого соединения.

  16. Если получение ресурса приводит к перенаправлению HTTP или эквивалентному событию, то
    1. если текущий документ и документ, на который производится перенаправление, происходят не из одного источника, задайте значения redirectStart, redirectEnd, unloadEventStart, unloadEventEnd и redirectCount равным 0. Затем вернитесь к шагу 6 с этим новым ресурсом.
    2. если предыдущее перенаправление было с участием документов не из одного источника, задайте значения redirectStart, redirectEnd, unloadEventStart, unloadEventStart и redirectCount равным 0. Затем вернитесь к шагу6 с этим новым ресурсом.
    3. Увеличьте redirectCount на 1.
    4. Если значение redirectStart равно 0, то пусть таким же будет значение fetchStart.
    5. Сделайте так, чтобы значение redirectEnd равнялось значению responseEnd.
    6. Задайте все атрибуты в window.performance.timing равными 0, за исключением navigationStart, redirectStart, redirectEnd, unloadEventStart и unloadEventEnd.
    7. Вернитесь к шагу 6 с этим новым ресурсом.
  17. Запишите текущее время в domLoading непосредственно перед тем, как браузер задаст текущую готовность документа в значение "loading".
  18. Запишите текущее время в domInteractive непосредственно перед тем, как браузер задаст текущую готовность документа как "interactive".
  19. Запишите текущее время в domContentLoadedEventStart непосредственно перед тем, как браузер запустит событие документа DOMContentLoaded.
  20. Запишите текущее время в domContentLoadedEventEnd сразу после завершения события DOMContentLoaded event.
  21. Запишите текущее время в domComplete непосредственно перед тем, как браузер задаст текущую готовность документа как "complete".
  22. Запишите текущее время в loadEventStart непосредственно перед тем, как браузер запустит событие загрузки.
  23. Запишите текущее время в loadEventEnd сразу после того, как браузер завершит событие загрузки.

5.2 Сбор мусора

От объекта window к объектам window.performance.timing и window.performance.navigation идут подразумеваемые сильные ссылки.

5.3 Монотонные часы

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

5.4 Префиксы вендоров

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

6 Конфиденциальность

Этот раздел не является нормативным.

6.1 Раскрытие информации

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

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

6.2 Перекрестный доступ к каталогам

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

7 Безопасность

Этот раздел не является нормативным.

7.1 Обнаружение прокси-серверов

В случае, если между браузером и веб-сервером развернут прокси-сервер, интервал времени между атрибутами connectStart и connectEnd определяется задержкой между браузером и прокси сервером вместо веб сервера. По этой задержке веб-сервер может потенциально вычислить наличие прокси. Для SOCKS прокси-серверов этот временной интервал включает в себя время аутентификации на прокси сервере и время на соединение прокси сервера к веб серверу, что затрудняет обнаружение прокси. В случае HTTP прокси, браузер вообще может не иметь возможности узнать о наличии прокси-сервера, так что такой метод не всегда пригоден для ослабления этого типа атак.

7.2 Фальсификация заменой объектов тайминга

Объект window.performance является перезаписываемым, чтобы избежать конфликтов с существующими страницами, использующими тот же самый объект. За счет этого становится возможным замена этого объекта с третьей стороны так, что работа скриптов, описанных в этой работе и опирающихся на данный интерфейс, может быть нарушена.

8 Ссылки

8.1 Нормативные ссылки

[IETF RFC 2119]
Key words for use in RFCs to Indicate Requirement Levels, Scott Bradner, Author. Internet Engineering Task Force, March 1997. Available at http://www.ietf.org/rfc/rfc2119.txt.
[IETF RFC 2616]
Hypertext Transfer Protocol -- HTTP/1.1, R. Fielding et al., Authors. Internet Engineering Task Force, June 1999. Available at http://www.ietf.org/rfc/rfc2616.txt.
[IETF RFC 6454]
The Web Origin Concept, Adam Barth, Author. Internet Engineering Task Force, December 2011. Available at http://www.ietf.org/rfc/rfc6454.txt.
[ECMA-262]
ECMAScript Language Specification, 5.1 Edition. ECMA International, Standard ECMA-262, June 2011. This version of the ECMAScript Language is available from http://www.ecma-international.org/publications/standards/Ecma-262.htm.
[HTML5]
HTML5, Robin Berjon et al., Editors. World Wide Web Consortium, December 2012. This version of the HTML5 is available from http://www.w3.org/TR/html5/. The latest editor's draft of HTML5 is available at http://www.w3.org/html/wg/drafts/html/CR/.
[Web IDL]
Web IDL, Cameron McCormack, Editor. World Wide Web Consortium, April 2012. This version of the Web IDL specification is available from http://www.w3.org/TR/2012/CR-WebIDL-20120419/. The latest version of Web IDL is available at http://www.w3.org/TR/WebIDL/.

8.2 Информативные ссылки

[JSMEASURE]
Measuring Client-Perceived Response Times on the WWW, R. Rajamony and M. Elnozahy, The Proceedings of the 3rd USENIX Symposium on Internet Technologies and Systems (USITS), March 2001.
[Тайминг Навигации 2]
Navigation Timing 2, Jatinder Mann, Arvind Jain, Editors. World Wide Web Consortium, unpublished.

Благодарности

Хочу выразить искреннюю благодарность всем людям, с которыми пришлось взаимодействовать при написани этого документа, включая 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 за их рецензии и комментарии.