Cross-global fetch usage

Эта статья объясняет крайний случай, который случается с fetch (и потенциально с другими API, предоставляющими такой же способ получения данных). Когда cross-origin fetch, включающий относительный URL, инициируется из <iframe> (en-US), относительный URL может использовать текущий глобальный location вместо того что задаётся в iframe.

Крайний случай

Многие сайты никогда не столкнутся с таким поведением. Чтобы увидеть его:

  • Вам понадобится same-origin iframe
  • Этот same-origin iframe должен располагаться с другим base URL
  • Вы должны использовать функцию fetch cross-global, т. е. frame.contentWindow.fetch()
  • Переданный в fetch URL должен быть относительным

Проблема

В прошлом мы разрешали относительный URL адрес вместо текущего глобального, для примера:

js
let absolute = new URL(relative, window.location.href);

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

Решение

В Firefox 60 и далее, Mozilla сопоставляет относительный URL с глобальным, которой принадлежит используемой функции fetch() (смотри Firefox bug 1432272). Таким образом в случае описанном выше, он разрешается в зависимости от расположения iframe:

js
let absolute = new URL(relative, frame.contentWindow.location.href);

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