Разработчики браузера Chrome приняли решение полностью заблокировать тяжёлую рекламу, которая потребляет слишком много вычислительных ресурсов на компьютере пользователя (трафик и CPU).
Вместо такой рекламы браузер будет показывать серые квадраты.
Новый механизм блокировки называется Heavy Ad Intervention. В технической документации сказано, что критерии «тяжёлой рекламы» ещё обсуждаются, но для начала предлагаются такие:
Реклама будет заблокирована, если соответствует любому из перечисленных критериев и если пользователь не взаимодействовал с интерактивными элементами этой рекламы.
Вероятно, что под такую блокировку сразу попадает любая видеореклама (ограничение по трафику) и любая реклама с JS-криптомайнером (ограничение по CPU). Видео блокируется в том случае, если оно загружается без явного разрешения пользователя.
По статистике Google, этим критериям соответствует всего 0,3% интернет-рекламы, но при этом она составляет 27% всего трафика и 28% использования CPU (доля в общем объёме рекламы).

Веб-разработчики и все желающие могут протестировать новую функцию уже сейчас, с версии Chrome 84 и выше.
Включить:
После включения опция начинает работать, но по умолчанию к пороговым значениям добавляется некоторый шум и вариабельность. Google пишет, что это делается для защиты конфиденциальности. Возможно, здесь речь идёт о возможности фингерпринтинга пользователей со стороны веб-сайта.
Чтобы отключить вариабельность и перейти на жёсткие лимиты, нужно установить опцию
Примечание: в более ранних версиях Chrome есть ещё флаг
При срабатывании данного фрагмента кода в браузере вы должны увидеть, что контент встроенного фрейма с рекламой заменяется сообщением 'Ad removed'.

При переходе по ссылке написано: «Это объявление использует слишком много ресурсов вашего устройства, поэтому Chrome удалил его».
Демка: heavy-ads.glitch.me
О вмешательстве в Chrome сообщается через метко названный Reporting API с типом отчёта
Эти отчёты запускаются в корневом рекламном iframe со всеми его потомками, то есть если объявление поступает из стороннего источника, то есть с другого сайта, то именно эта третья сторона (например, поставщик рекламы) должен обрабатывать отчёт.
Чтобы настроить страницу для отчётов по HTTP, ответ должен содержать заголовок
Инициированный запрос POST будет включать в себя такой отчёт:
JavaScript API предоставляет
Однако, поскольку блокировка буквально удалит страницу из iframe, нужно добавить отказоустойчивость и гарантировать, что отчёт определённо получен до того, как страница полностью исчезнет. Для этого вы можете подключить тот же обратный вызов к событию
Итоговый JSON похож на то, что отправляется в запросе
Google планирует продолжить тестирование несколько месяцев и вывести функцию в стабильную версию Chrome примерно в конце августа 2020 года.

Вместо такой рекламы браузер будет показывать серые квадраты.
Новый механизм блокировки называется 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 года.

