Ya.Metrika Webvisor bug with meta[viewport]

by Maksim Kachurin

JavaScript

/**
 * flexbe.ru
 *
 * Описание бага:
 * Мы используем аттрибут meta[viewport] для мобильных устройств, что бы сайты отображались одинаково для всех устройств, независимо от их реального размера
 * Т.к десктопные браузеры игнорируеют значение вьюпорт аттрибута, вебвизор затирает значение этого аттрибута, предварительно считав его 
 * и подстраивает документ внутри фрейма под это значение (указывает свойства `width` и `transform: scale()` для HTML элемента, width берется из device-width)
 * Но scale расчитывается в обратную сторону, т.е если значение device-width указанное в meta[viewport] больше фактического размера экрана - значение scale будет больше 1, а должно быть меньше 1
 * Кроме того, вьюпорт вообще игнорируется если соотношение высоты меньше соотношения ширины
 * Так же из кода видно что скейл берется из inital-scale свойства, но он может быть не задан вовсе (тогда должен расчитываться из соотношения ширины вьюпорта к экрану), но даже если задан, в коде метрики значение из аттрибута приводится к INTEGER (:facepalm:) [ result.initialScale=parseInt(parsed['initial-scale'],10);} ], у нас значение 0.86 на айфоне и это приводит его к нулю.
 *
 * Номер тикет который успешно динамит поддержка Яндекс.Метрики: 
 *  12047769
 *
 * Запись вебвизора на которой видно баг (у нас подобных записей тысячи):
 *  https://metrika.yandex.ru/inpage/visor-proto?visit_id=618092474602557147&date=2021-02-16&user_id_hash=620481900&date_visit=&offset=0&id=50856775
 *
 * Файл с версией кода с наличием проблемы:
 *  https://yastatic.net/s3/metrika/2.887803681.2/pages-desktop/metrika/wv2/_wv2_ru.js
*/

// Проблемный метод:
function setZoomLevel(e = 1) {
    var t,
        n = this.props,
        r = n.screen, // { height: 640, width: 360 } - размер экрана реального устройства/
        i = n.viewport, // { height: 528, width: 354 } - размер вьюпорта с учетом верхних панелей и возможно скролла (иначе куда делись 6px ширины я не знаю)
        o = n.device, // "AndroidPhone"
        a =...