Описание
 Используйте API chrome.webNavigation для получения уведомлений о статусе навигационных запросов в процессе выполнения.
Разрешения
webNavigation Для всех методов и событий chrome.webNavigation требуется объявить разрешение "webNavigation" в манифесте расширения . Например:
{
  "name": "My extension",
  ...
  "permissions": [
    "webNavigation"
  ],
  ...
}
Концепции и использование
Порядок событий
При успешном завершении навигации события запускаются в следующем порядке:
onBeforeNavigate -> onCommitted -> [onDOMContentLoaded] -> onCompleted
 Любая ошибка, возникающая во время процесса, приводит к возникновению события onErrorOccurred . Для конкретного перехода дальнейшие события после onErrorOccurred не возникают.
 Если навигационный фрейм содержит подфреймы, его onCommitted срабатывает до onBeforeNavigate всех его дочерних элементов, тогда как onCompleted срабатывает после onCompleted всех его дочерних элементов.
 При изменении опорного фрагмента фрейма срабатывает событие onReferenceFragmentUpdated . Это событие может сработать в любое время после onDOMContentLoaded , даже после onCompleted .
 Если API истории используется для изменения состояния фрейма (например, с помощью history.pushState() , запускается событие onHistoryStateUpdated . Это событие может произойти в любое время после onDOMContentLoaded .
 Если навигация восстановила страницу из кэша возврата и пересылки , событие onDOMContentLoaded не сработает. Событие не сработает, поскольку загрузка контента уже была завершена к моменту первого посещения страницы.
 Если навигация была запущена с помощью Chrome Instant или Instant Pages , полностью загруженная страница подставляется в текущую вкладку. В этом случае срабатывает событие onTabReplaced .
Связь с событиями webRequest
Между событиями API webRequest и событиями API webNavigation не существует определённого порядка. Возможно, события webRequest всё ещё поступают для фреймов, которые уже начали новую навигацию, или навигация продолжается только после полной загрузки сетевых ресурсов.
В целом события webNavigation тесно связаны с состоянием навигации, отображаемым в пользовательском интерфейсе, тогда как события webRequest соответствуют состоянию сетевого стека, которое, как правило, непрозрачно для пользователя.
Идентификаторы вкладок
 Не все навигационные вкладки соответствуют реальным вкладкам в пользовательском интерфейсе Chrome, например, вкладкам, которые находятся в процессе предварительной отрисовки. Такие вкладки недоступны через API вкладок, и вы не можете запросить информацию о них с помощью методов webNavigation.getFrame() или webNavigation.getAllFrames() . После замены такой вкладки активируется событие onTabReplaced , и она становится доступна через эти API.
Временные метки
 Важно отметить, что некоторые технические особенности обработки ОС отдельных процессов Chrome могут привести к смещению времени между самим браузером и процессами расширения. Это означает, что свойство timeStamp события WebNavigation гарантирует только внутреннюю согласованность. Сравнение одного события с другим даст вам timeStamp смещение между ними, но сравнение их с текущим временем внутри расширения (например, с помощью (new Date()).getTime() ) может привести к неожиданным результатам.
Идентификаторы кадров
Фреймы внутри вкладки можно идентифицировать по идентификатору фрейма. Идентификатор основного фрейма всегда равен 0, идентификатор дочерних фреймов — положительное число. После того, как документ создан во фрейме, его идентификатор фрейма остаётся неизменным на протяжении всего времени существования документа. Начиная с Chrome 49, этот идентификатор также остаётся неизменным на протяжении всего времени существования фрейма (при нескольких переходах).
 Из-за многопроцессной природы Chrome вкладка может использовать разные процессы для отображения исходного и конечного веб-страниц. Таким образом, если навигация происходит в новом процессе, вы можете получать события как с новой, так и со старой страницы до тех пор, пока новая навигация не будет зафиксирована (т.е. не будет отправлено событие onCommitted для нового основного фрейма). Другими словами, может быть несколько ожидающих последовательностей событий webNavigation с одинаковым frameId . Последовательности можно различать по ключу processId .
 Также обратите внимание, что во время предварительной загрузки процесс может переключаться несколько раз. Это происходит при перенаправлении загрузки на другой сайт. В этом случае вы будете получать повторяющиеся события onBeforeNavigate и onErrorOccurred , пока не получите финальное событие onCommitted .
Ещё одна концепция, вызывающая проблемы с расширениями, — это жизненный цикл фрейма. Фрейм содержит документ (связанный с закреплённым URL-адресом). Документ может измениться (например, при навигации), но frameId останется неизменным, поэтому сложно связать какие-либо события в конкретном документе только с frameIds . Мы вводим концепцию documentId , который является уникальным идентификатором для каждого документа. При переходе по фрейму и открытии нового документа идентификатор изменится. Это поле полезно для определения того, когда страницы меняют своё состояние жизненного цикла (между pre-render, active и cached), поскольку оно остаётся неизменным.
Типы переходов и квалификаторы
 Событие webNavigation onCommitted имеет свойства transitionType и transitionQualifiers . Тип перехода совпадает с используемым в API истории, описывающим, как браузер перешёл к данному URL-адресу. Кроме того, могут быть возвращены несколько квалификаторов перехода , которые более подробно определяют навигацию.
Существуют следующие квалификаторы перехода:
| Переходный квалификатор | Описание | 
|---|---|
| "client_redirect" | Во время навигации произошло одно или несколько перенаправлений, вызванных JavaScript или метатегами Refresh на странице. | 
| "server_redirect" | Во время навигации произошло одно или несколько перенаправлений, вызванных заголовками HTTP, отправленными с сервера. | 
| "вперед_назад" | Для начала навигации пользователь использовал кнопку «Вперед» или «Назад». | 
| "from_address_bar" | Пользователь инициировал навигацию из адресной строки (также известной как омнибокс). | 
Примеры
Чтобы опробовать этот API, установите пример API webNavigation из репозитория chrome-extension-samples .
Типы
TransitionQualifier
Перечисление
 "client_redirect"   "server_redirect"   "вперед_назад"   "from_address_bar" 
TransitionType
 Причина навигации. Используются те же типы переходов, что определены в API истории. Это те же типы переходов, что определены в API истории, за исключением того, что вместо "auto_toplevel" используется « "start_page" » (для обратной совместимости). 
Перечисление
 "связь"   "напечатанный"   "авто_закладка"   "auto_subframe"   "manual_subframe"   "сгенерированный"   "стартовая_страница"   "form_submit"   "перезагрузка"   "ключевое слово"   "keyword_generated" 
Методы
getAllFrames()
chrome.webNavigation.getAllFrames(
details: object,
): Promise<object[] | undefined>
Извлекает информацию обо всех кадрах заданной вкладки.
Параметры
- подробностиобъект Информация о вкладке, из которой следует извлечь все кадры. - tabIdчисло Идентификатор вкладки. 
 
Возврат
- Обещание<объект[] | неопределено> Хром 93+
getFrame()
chrome.webNavigation.getFrame(
details: object,
): Promise<object | undefined>
Получает информацию о заданном фрейме. Фрейм относится к элементу <iframe> или <frame> веб-страницы и идентифицируется идентификатором вкладки и идентификатором фрейма.
Параметры
- подробностиобъект Информация о кадре, о котором требуется получить информацию. - documentIdстрока необязательная Хром 106+UUID документа. Если указаны frameId и/или tabId, они будут проверены на соответствие документу, найденному по указанному идентификатору. 
- frameIdномер необязательный Идентификатор фрейма в данной вкладке. 
- processIdномер необязательный Не рекомендуется с Chrome 49Теперь фреймы однозначно идентифицируются по идентификатору вкладки и идентификатору фрейма; идентификатор процесса больше не нужен и поэтому игнорируется. Идентификатор процесса, который запускает рендерер для этой вкладки. 
- tabIdномер необязательный Идентификатор вкладки, в которой находится фрейм. 
 
Возврат
- Обещание<объект | неопределенный> Хром 93+
События
onBeforeNavigate
chrome.webNavigation.onBeforeNavigate.addListener(
callback: function,
filters?: object,
)
Срабатывает перед началом навигации.
Параметры
- функция - Параметр - callbackвыглядит так:- (details: object) => void - объект - Хром 106+Жизненный цикл документа. 
- число - 0 указывает на то, что навигация осуществляется в окне содержимого вкладки; положительное значение указывает на навигацию в подфрейме. Идентификаторы фреймов уникальны для данной вкладки и процесса. 
- Хром 106+Тип фрейма, в котором произошла навигация. 
- строка необязательная Хром 106+- UUID родительского документа, владеющего этим фреймом. Не устанавливается, если родительского документа нет. 
- число - Идентификатор родительского фрейма или - -1, если это основной фрейм.
- число Не рекомендуется с Chrome 50- ProcessId больше не задается для этого события, поскольку процесс, который будет визуализировать результирующий документ, неизвестен до onCommit. - Значение -1. 
- число - Идентификатор вкладки, в которой будет осуществляться навигация. 
- число - Время, когда браузер собирался начать навигацию, в миллисекундах с начала эпохи. 
- нить 
 
 
- объект необязательный - Условия, которым должен соответствовать URL-адрес, по которому осуществляется переход. Поля «схемы» и «порты» фильтра UrlFilter для этого события игнорируются. 
 
onCommitted
chrome.webNavigation.onCommitted.addListener(
callback: function,
filters?: object,
)
Срабатывает при подтверждении навигации. Документ (и ресурсы, на которые он ссылается, например, изображения и подфреймы) может всё ещё загружаться, но по крайней мере часть документа уже получена с сервера, и браузер решил переключиться на новый документ.
Параметры
- перезвонитьфункция Параметр callbackвыглядит так:(details: object) => void - подробностиобъект - documentIdнить Хром 106+UUID загруженного документа. 
- жизненный цикл документаХром 106+Жизненный цикл документа. 
- frameIdчисло 0 означает, что навигация осуществляется в окне содержимого вкладки; положительное значение указывает на навигацию в подфрейме. Идентификаторы фреймов уникальны в пределах вкладки. 
- frameTypeХром 106+Тип фрейма, в котором произошла навигация. 
- parentDocumentIdстрока необязательная Хром 106+UUID родительского документа, владеющего этим фреймом. Не устанавливается, если родительского документа нет. 
- parentFrameIdчисло Хром 74+Идентификатор родительского фрейма или -1, если это основной фрейм.
- processIdчисло Идентификатор процесса, запускающего рендерер для этого кадра. 
- tabIdчисло Идентификатор вкладки, в которой происходит навигация. 
- отметка временичисло Время завершения навигации в миллисекундах с начала эпохи. 
- transitionQualifiersСписок квалификаторов перехода. 
- тип переходаПричина навигации. 
- URL-адреснить 
 
 
- фильтрыобъект необязательный - URL-адресУсловия, которым должен соответствовать URL-адрес, по которому осуществляется переход. Поля «схемы» и «порты» фильтра UrlFilter для этого события игнорируются. 
 
onCompleted
chrome.webNavigation.onCompleted.addListener(
callback: function,
filters?: object,
)
Срабатывает, когда документ, включая ресурсы, на которые он ссылается, полностью загружен и инициализирован.
Параметры
- перезвонитьфункция Параметр callbackвыглядит так:(details: object) => void - подробностиобъект - documentIdнить Хром 106+UUID загруженного документа. 
- жизненный цикл документаХром 106+Жизненный цикл документа. 
- frameIdчисло 0 означает, что навигация осуществляется в окне содержимого вкладки; положительное значение указывает на навигацию в подфрейме. Идентификаторы фреймов уникальны в пределах вкладки. 
- frameTypeХром 106+Тип фрейма, в котором произошла навигация. 
- parentDocumentIdстрока необязательная Хром 106+UUID родительского документа, владеющего этим фреймом. Не устанавливается, если родительского документа нет. 
- parentFrameIdчисло Хром 74+Идентификатор родительского фрейма или -1, если это основной фрейм.
- processIdчисло Идентификатор процесса, запускающего рендерер для этого кадра. 
- tabIdчисло Идентификатор вкладки, в которой происходит навигация. 
- отметка временичисло Время завершения загрузки документа в миллисекундах с начала эпохи. 
- URL-адреснить 
 
 
- фильтрыобъект необязательный - URL-адресУсловия, которым должен соответствовать URL-адрес, по которому осуществляется переход. Поля «схемы» и «порты» фильтра UrlFilter для этого события игнорируются. 
 
onCreatedNavigationTarget
chrome.webNavigation.onCreatedNavigationTarget.addListener(
callback: function,
filters?: object,
)
Срабатывает при создании нового окна или новой вкладки в существующем окне для размещения навигации.
Параметры
- функция - Параметр - callbackвыглядит так:- (details: object) => void - объект - число - Идентификатор фрейма с sourceTabId, в котором запускается навигация. 0 указывает на основной фрейм. 
- число - Идентификатор процесса, запускающего рендерер для исходного кадра. 
- число - Идентификатор вкладки, в которой активируется навигация. 
- число - Идентификатор вкладки, в которой открыт URL-адрес 
- число - Время, когда браузер собирался создать новое представление, в миллисекундах с начала эпохи. 
- нить - URL-адрес, который будет открыт в новом окне. 
 
 
- объект необязательный - Условия, которым должен соответствовать URL-адрес, по которому осуществляется переход. Поля «схемы» и «порты» фильтра UrlFilter для этого события игнорируются. 
 
onDOMContentLoaded
chrome.webNavigation.onDOMContentLoaded.addListener(
callback: function,
filters?: object,
)
Срабатывает, когда DOM страницы полностью построен, но указанные ресурсы могут не завершить загрузку.
Параметры
- перезвонитьфункция Параметр callbackвыглядит так:(details: object) => void - подробностиобъект - documentIdнить Хром 106+UUID загруженного документа. 
- жизненный цикл документаХром 106+Жизненный цикл документа. 
- frameIdчисло 0 означает, что навигация осуществляется в окне содержимого вкладки; положительное значение указывает на навигацию в подфрейме. Идентификаторы фреймов уникальны в пределах вкладки. 
- frameTypeХром 106+Тип фрейма, в котором произошла навигация. 
- parentDocumentIdстрока необязательная Хром 106+UUID родительского документа, владеющего этим фреймом. Не устанавливается, если родительского документа нет. 
- parentFrameIdчисло Хром 74+Идентификатор родительского фрейма или -1, если это основной фрейм.
- processIdчисло Идентификатор процесса, запускающего рендерер для этого кадра. 
- tabIdчисло Идентификатор вкладки, в которой происходит навигация. 
- отметка временичисло Время, когда DOM страницы был полностью построен, в миллисекундах с начала эпохи. 
- URL-адреснить 
 
 
- фильтрыобъект необязательный - URL-адресУсловия, которым должен соответствовать URL-адрес, по которому осуществляется переход. Поля «схемы» и «порты» фильтра UrlFilter для этого события игнорируются. 
 
onErrorOccurred
chrome.webNavigation.onErrorOccurred.addListener(
callback: function,
filters?: object,
)
Срабатывает при возникновении ошибки и прерывании навигации. Это может произойти, если произошла ошибка сети или пользователь прервал навигацию.
Параметры
- перезвонитьфункция Параметр callbackвыглядит так:(details: object) => void - подробностиобъект - documentIdнить Хром 106+UUID загруженного документа. 
- жизненный цикл документаХром 106+Жизненный цикл документа. 
- ошибканить Описание ошибки. 
- frameIdчисло 0 означает, что навигация осуществляется в окне содержимого вкладки; положительное значение указывает на навигацию в подфрейме. Идентификаторы фреймов уникальны в пределах вкладки. 
- frameTypeХром 106+Тип фрейма, в котором произошла навигация. 
- parentDocumentIdстрока необязательная Хром 106+UUID родительского документа, владеющего этим фреймом. Не устанавливается, если родительского документа нет. 
- parentFrameIdчисло Хром 74+Идентификатор родительского фрейма или -1, если это основной фрейм.
- processIdчисло Не рекомендуется с Chrome 50ProcessId больше не установлен для этого события. Значение -1. 
- tabIdчисло Идентификатор вкладки, в которой происходит навигация. 
- отметка временичисло Время возникновения ошибки в миллисекундах с начала эпохи. 
- URL-адреснить 
 
 
- фильтрыобъект необязательный - URL-адресУсловия, которым должен соответствовать URL-адрес, по которому осуществляется переход. Поля «схемы» и «порты» фильтра UrlFilter для этого события игнорируются. 
 
onHistoryStateUpdated
chrome.webNavigation.onHistoryStateUpdated.addListener(
callback: function,
filters?: object,
)
Срабатывает при обновлении истории фрейма с новым URL-адресом. Все будущие события для этого фрейма будут использовать обновлённый URL-адрес.
Параметры
- перезвонитьфункция Параметр callbackвыглядит так:(details: object) => void - подробностиобъект - documentIdнить Хром 106+UUID загруженного документа. 
- жизненный цикл документаХром 106+Жизненный цикл документа. 
- frameIdчисло 0 означает, что навигация осуществляется в окне содержимого вкладки; положительное значение указывает на навигацию в подфрейме. Идентификаторы фреймов уникальны в пределах вкладки. 
- frameTypeХром 106+Тип фрейма, в котором произошла навигация. 
- parentDocumentIdстрока необязательная Хром 106+UUID родительского документа, владеющего этим фреймом. Не устанавливается, если родительского документа нет. 
- parentFrameIdчисло Хром 74+Идентификатор родительского фрейма или -1, если это основной фрейм.
- processIdчисло Идентификатор процесса, запускающего рендерер для этого кадра. 
- tabIdчисло Идентификатор вкладки, в которой происходит навигация. 
- отметка временичисло Время завершения навигации в миллисекундах с начала эпохи. 
- transitionQualifiersСписок квалификаторов перехода. 
- тип переходаПричина навигации. 
- URL-адреснить 
 
 
- фильтрыобъект необязательный - URL-адресУсловия, которым должен соответствовать URL-адрес, по которому осуществляется переход. Поля «схемы» и «порты» фильтра UrlFilter для этого события игнорируются. 
 
onReferenceFragmentUpdated
chrome.webNavigation.onReferenceFragmentUpdated.addListener(
callback: function,
filters?: object,
)
Срабатывает при обновлении фрагмента ссылки фрейма. Все будущие события для этого фрейма будут использовать обновлённый URL.
Параметры
- перезвонитьфункция Параметр callbackвыглядит так:(details: object) => void - подробностиобъект - documentIdнить Хром 106+UUID загруженного документа. 
- жизненный цикл документаХром 106+Жизненный цикл документа. 
- frameIdчисло 0 означает, что навигация осуществляется в окне содержимого вкладки; положительное значение указывает на навигацию в подфрейме. Идентификаторы фреймов уникальны в пределах вкладки. 
- frameTypeХром 106+Тип фрейма, в котором произошла навигация. 
- parentDocumentIdстрока необязательная Хром 106+UUID родительского документа, владеющего этим фреймом. Не устанавливается, если родительского документа нет. 
- parentFrameIdчисло Хром 74+Идентификатор родительского фрейма или -1, если это основной фрейм.
- processIdчисло Идентификатор процесса, запускающего рендерер для этого кадра. 
- tabIdчисло Идентификатор вкладки, в которой происходит навигация. 
- отметка временичисло Время завершения навигации в миллисекундах с начала эпохи. 
- transitionQualifiersСписок квалификаторов перехода. 
- тип переходаПричина навигации. 
- URL-адреснить 
 
 
- фильтрыобъект необязательный - URL-адресУсловия, которым должен соответствовать URL-адрес, по которому осуществляется переход. Поля «схемы» и «порты» фильтра UrlFilter для этого события игнорируются. 
 
onTabReplaced
chrome.webNavigation.onTabReplaced.addListener(
callback: function,
)
Срабатывает, когда содержимое вкладки заменяется другой (обычно ранее отрисованной) вкладкой.
Параметры
- перезвонитьфункция Параметр callbackвыглядит так:(details: object) => void - подробностиобъект - replacementTabIdчисло Идентификатор вкладки, которая была заменена. 
- tabIdчисло Идентификатор вкладки, которая заменила старую вкладку. 
- отметка временичисло Время, когда произошла замена, в миллисекундах с начала эпохи.