Chrome заблокирует тяжёлую рекламу в августе
Разработчики браузера Chrome приняли решение полностью заблокировать тяжёлую рекламу, которая потребляет слишком много вычислительных ресурсов на компьютере пользователя (трафик и CPU).
Вместо такой рекламы браузер будет показывать серые квадраты.
Новый механизм блокировки называется Heavy Ad Intervention. В технической документации сказано, что критерии «тяжёлой рекламы» ещё обсуждаются, но для начала предлагаются такие:
- Использует основной вычислительный поток более чем на 60 секунд (не подряд, а в общей сложности)
- Использует основной поток более 15 секунд в любом 30-секундном интервале
- Загружает более 4 мегабайт
Реклама будет заблокирована, если соответствует любому из перечисленных критериев и если пользователь не взаимодействовал с интерактивными элементами этой рекламы.
Вероятно, что под такую блокировку сразу попадает любая видеореклама (ограничение по трафику) и любая реклама с JS-криптомайнером (ограничение по CPU). Видео блокируется в том случае, если оно загружается без явного разрешения пользователя.
По статистике Google, этим критериям соответствует всего 0,3% интернет-рекламы, но при этом она составляет 27% всего трафика и 28% использования CPU (доля в общем объёме рекламы).
Тестирование
Веб-разработчики и все желающие могут протестировать новую функцию уже сейчас, с версии Chrome 84 и выше.
Включить: chrome://flags/#enable-heavy-ad-intervention
После включения опция начинает работать, но по умолчанию к пороговым значениям добавляется некоторый шум и вариабельность. Google пишет, что это делается для защиты конфиденциальности. Возможно, здесь речь идёт о возможности фингерпринтинга пользователей со стороны веб-сайта.
Чтобы отключить вариабельность и перейти на жёсткие лимиты, нужно установить опцию chrome://flags/#heavy-ad-privacy-mitigations
в значение Disabled. Это облегчит отладку и тестирование.
Примечание: в более ранних версиях Chrome есть ещё флаг #heavy-ad-privacy-migrations-opt-out
, который нужно активировать для тестирования.
При срабатывании данного фрагмента кода в браузере вы должны увидеть, что контент встроенного фрейма с рекламой заменяется сообщением 'Ad removed'.
При переходе по ссылке написано: «Это объявление использует слишком много ресурсов вашего устройства, поэтому Chrome удалил его».
Демка: heavy-ads.glitch.me
Механизм срабатывания
О вмешательстве в Chrome сообщается через метко названный Reporting API с типом отчёта intervention
. Вы можете использовать Reporting API, чтобы получать уведомления о вмешательствах либо с помощью POST-запроса к конечной точке, либо в вашем JavaScript, сказано в документации для разработчиков.
Эти отчёты запускаются в корневом рекламном iframe со всеми его потомками, то есть если объявление поступает из стороннего источника, то есть с другого сайта, то именно эта третья сторона (например, поставщик рекламы) должен обрабатывать отчёт.
Чтобы настроить страницу для отчётов по HTTP, ответ должен содержать заголовок Report-To
:
Report-To: { "url": "https://example.com/reports", "max_age": 86400 }
Инициированный запрос POST будет включать в себя такой отчёт:
POST /reports HTTP/1.1
Host: example.com
…
Content-Type: application/report
[{
"type": "intervention",
"age": 60,
"url": "https://example.com/url/of/ad.html",
"body": {
"sourceFile": null,
"lineNumber": null,
"columnNumber": null,
"id": "HeavyAdIntervention",
"message": "Ad was removed because its CPU usage exceeded the limit. See https://www.chromestatus.com/feature/4800491902992384"
}
}]
JavaScript API предоставляет ReportingObserver
с методом observe()
, который можно использовать для запуска обратного вызова при блокировке. Это может быть полезно, если вы хотите прикрепить дополнительную информацию к отчёту, чтобы помочь в отладке.
// callback that will handle intervention reports
function sendReports(reports) {
for (let report of reports) {
// Log the `report` json via your own reporting process
navigator.sendBeacon('https://report.example/your-endpoint', report);
}
}
// create the observer with the callback
const observer = new ReportingObserver(
(reports, observer) => {
sendReports(reports);
},
{ buffered: true }
);
// start watching for interventions
observer.observe();
Однако, поскольку блокировка буквально удалит страницу из iframe, нужно добавить отказоустойчивость и гарантировать, что отчёт определённо получен до того, как страница полностью исчезнет. Для этого вы можете подключить тот же обратный вызов к событию unload
, советует документация.
window.addEventListener('unload', (event) => {
// pull all pending reports from the queue
let reports = observer.takeRecords();
sendReports(reports);
});
Итоговый JSON похож на то, что отправляется в запросе POST
:
[
{
type: 'intervention',
url: 'https://example.com/url/of/ad.html',
body: {
sourceFile: null,
lineNumber: null,
columnNumber: null,
id: 'HeavyAdIntervention',
message:
'Ad was removed because its network usage exceeded the limit. See https://www.chromestatus.com/feature/4800491902992384',
},
},
];
Google планирует продолжить тестирование несколько месяцев и вывести функцию в стабильную версию Chrome примерно в конце августа 2020 года.