Chrome заблокирует тяжёлую рекламу в августе

Разработчики браузера Chrome приняли решение полностью заблокировать тяжёлую рекламу, которая потребляет слишком много вычислительных ресурсов на компьютере пользователя (трафик и CPU).

Вместо такой рекламы браузер будет показывать серые квадраты.

Новый механизм блокировки называется Heavy Ad Intervention. В технической документации сказано, что критерии «тяжёлой рекламы» ещё обсуждаются, но для начала предлагаются такие:

  • Использует основной вычислительный поток более чем на 60 секунд (не подряд, а в общей сложности)
  • Использует основной поток более 15 секунд в любом 30-секундном интервале
  • Загружает более 4 мегабайт


Реклама будет заблокирована, если соответствует любому из перечисленных критериев и если пользователь не взаимодействовал с интерактивными элементами этой рекламы.

Вероятно, что под такую блокировку сразу попадает любая видеореклама (ограничение по трафику) и любая реклама с JS-криптомайнером (ограничение по CPU). Видео блокируется в том случае, если оно загружается без явного разрешения пользователя.

По статистике Google, этим критериям соответствует всего 0,3% интернет-рекламы, но при этом она составляет 27% всего трафика и 28% использования CPU (доля в общем объёме рекламы).

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'.

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 года.
0iq13ceb1rqhy6ymre4-xvedsfu.jpeg

© Habrahabr.ru