Разработчики браузера Chrome приняли решение полностью заблокировать тяжёлую рекламу, которая потребляет слишком много вычислительных ресурсов на компьютере пользователя (трафик и CPU).
Вместо такой рекламы браузер будет показывать серые квадраты.
Новый механизм блокировки называется Heavy Ad Intervention. В технической документации сказано, что критерии «тяжёлой рекламы» ещё обсуждаются, но для начала предлагаются такие:
Реклама будет заблокирована, если соответствует любому из перечисленных критериев и если пользователь не взаимодействовал с интерактивными элементами этой рекламы.
Вероятно, что под такую блокировку сразу попадает любая видеореклама (ограничение по трафику) и любая реклама с JS-криптомайнером (ограничение по CPU). Видео блокируется в том случае, если оно загружается без явного разрешения пользователя.
По статистике Google, этим критериям соответствует всего 0,3% интернет-рекламы, но при этом она составляет 27% всего трафика и 28% использования CPU (доля в общем объёме рекламы).
![](https://habrastorage.org/r/w1560/webt/hw/0l/oo/hw0loobdid28irwfwzp2opwqc8q.png)
Веб-разработчики и все желающие могут протестировать новую функцию уже сейчас, с версии Chrome 84 и выше.
Включить:
После включения опция начинает работать, но по умолчанию к пороговым значениям добавляется некоторый шум и вариабельность. Google пишет, что это делается для защиты конфиденциальности. Возможно, здесь речь идёт о возможности фингерпринтинга пользователей со стороны веб-сайта.
Чтобы отключить вариабельность и перейти на жёсткие лимиты, нужно установить опцию
Примечание: в более ранних версиях Chrome есть ещё флаг
При срабатывании данного фрагмента кода в браузере вы должны увидеть, что контент встроенного фрейма с рекламой заменяется сообщением 'Ad removed'.
![](https://habrastorage.org/r/w1560/webt/lx/hr/qu/lxhrquj4larz8zdgjiircnr24ha.png)
При переходе по ссылке написано: «Это объявление использует слишком много ресурсов вашего устройства, поэтому Chrome удалил его».
Демка: heavy-ads.glitch.me
О вмешательстве в Chrome сообщается через метко названный Reporting API с типом отчёта
Эти отчёты запускаются в корневом рекламном iframe со всеми его потомками, то есть если объявление поступает из стороннего источника, то есть с другого сайта, то именно эта третья сторона (например, поставщик рекламы) должен обрабатывать отчёт.
Чтобы настроить страницу для отчётов по HTTP, ответ должен содержать заголовок
Инициированный запрос POST будет включать в себя такой отчёт:
JavaScript API предоставляет
Однако, поскольку блокировка буквально удалит страницу из iframe, нужно добавить отказоустойчивость и гарантировать, что отчёт определённо получен до того, как страница полностью исчезнет. Для этого вы можете подключить тот же обратный вызов к событию
Итоговый JSON похож на то, что отправляется в запросе
Google планирует продолжить тестирование несколько месяцев и вывести функцию в стабильную версию Chrome примерно в конце августа 2020 года.
![](https://habrastorage.org/r/w780q1/webt/0i/q1/3c/0iq13ceb1rqhy6ymre4-xvedsfu.jpeg)
Вместо такой рекламы браузер будет показывать серые квадраты.
Новый механизм блокировки называется Heavy Ad Intervention. В технической документации сказано, что критерии «тяжёлой рекламы» ещё обсуждаются, но для начала предлагаются такие:
- Использует основной вычислительный поток более чем на 60 секунд (не подряд, а в общей сложности)
- Использует основной поток более 15 секунд в любом 30-секундном интервале
- Загружает более 4 мегабайт
Реклама будет заблокирована, если соответствует любому из перечисленных критериев и если пользователь не взаимодействовал с интерактивными элементами этой рекламы.
Вероятно, что под такую блокировку сразу попадает любая видеореклама (ограничение по трафику) и любая реклама с JS-криптомайнером (ограничение по CPU). Видео блокируется в том случае, если оно загружается без явного разрешения пользователя.
По статистике Google, этим критериям соответствует всего 0,3% интернет-рекламы, но при этом она составляет 27% всего трафика и 28% использования CPU (доля в общем объёме рекламы).
![](https://habrastorage.org/webt/hw/0l/oo/hw0loobdid28irwfwzp2opwqc8q.png)
Тестирование
Веб-разработчики и все желающие могут протестировать новую функцию уже сейчас, с версии 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'.
![](https://habrastorage.org/webt/lx/hr/qu/lxhrquj4larz8zdgjiircnr24ha.png)
При переходе по ссылке написано: «Это объявление использует слишком много ресурсов вашего устройства, поэтому 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 года.
![](https://habrastorage.org/webt/0i/q1/3c/0iq13ceb1rqhy6ymre4-xvedsfu.jpeg)