Кратко

  • Ссылка target="_blank" прежде обычно давала новой странице отношение opener с исходной вкладкой.
  • Обсуждение 2018 года и изменение HTML 2019 года сделали разъединение исходным правилом; rel="opener" запрашивает связь явно.

Нажимаете ссылку — появляется новая вкладка. Старая остаётся позади, будто дверь закрылась. Браузер долго вручал новой странице скрытую ручку window.opener. Через неё открывшаяся страница могла отправить исходную вкладку по другому адресу. На экране два отдельных прямоугольника, а за кулисами между ними натянут тонкий шнур.

Представьте конкретный маршрут: вы читаете отчёт и открываете вынесенную в новую вкладку справку. Страница справки использует полученный window.opener, чтобы отправить исходную вкладку на похожую страницу входа. Когда вы возвращаетесь к отчёту, в старой вкладке уже другой адрес. Это иллюстрация возможности навигации, о которой говорил автор предложения в WHATWG. Новая страница меняет не прочитанный вами текст, а место, куда вернётся ваш взгляд. Такой приём называют обратным захватом вкладки — reverse tabnabbing.

В обсуждении WHATWG, начатом 10 октября 2018 года, Chris Dumez описал исходный порядок: target="_blank" давал opener, пока автор не добавлял rel="noopener". Он предложил поменять начало: новая страница отделяется, а сайту, которому нужна совместная работа окон, доступен rel="opener". Удобство для связанных страниц незаметно сопровождало обычные переходы к посторонним адресам.

Уже на следующий день запись WebKit зафиксировала опыт с таким поведением: считать _blank эквивалентом noopener, оставив opener явным запросом на прежнюю связь. Внешне клик оставался тем же. Невидимый шнур переставал появляться сам собой, и редактору не приходилось помнить защитный токен на каждом выходе.

Поправка к HTML, принятая 7 февраля 2019 года, закрепила разворот. Действующий алгоритм ссылок разъединяет окна при noopener или noreferrer и также при _blank без opener. Для сохранения отношений теперь пишут rel="opener". Посетитель всё так же видит новую вкладку; меняется способность новой страницы повести старую за собой.

Для приложения, где два окна специально обмениваются действиями, связь может быть полезной: страница платёжного подтверждения или редактор с отдельным окном предпросмотра могут требовать согласованного поведения. Поэтому новая модель оставила автору явный rel="opener". В этом и состоит точность изменения: браузер не запретил сотрудничество окон, а потребовал назвать его в разметке. У обычной справочной ссылки такой запрос обычно отсутствует, и возвращаться читатель должен к той странице, которую оставил.

У этой перемены была цена и для добросовестных приложений. В исходном обсуждении WHATWG прямо говорилось о риске для совместимости: страницы, рассчитывавшие на автоматически полученный opener, должны назвать эту зависимость. Редактор с отдельным окном предпросмотра может добавить rel="opener" и проверить связь. Так стандарт превратил случайную привилегию в договор, который видно в разметке. У каждой оставшейся верёвки теперь должен быть тот, кто сознательно её привязал.