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