#!/bin/sh
# Киоск: композитор cage, внутри него Chromium на весь экран.
#
# Почему не cog, на котором всё начиналось. Cog — оболочка вокруг WPE WebKit,
# и выбирали мы его за память: он влезал в 512 МБ Banana Pi, куда Chromium не
# влезает вовсе. На H313 с двумя гигабайтами это ограничение снято, а cog
# показал три независимых дефекта в передаче кадров от веб-процесса, причём
# все три в общем для всех его платформ слое WPEBackend-fdo:
#   1. вызов NULL в обработчике wl_surface.commit, если кадр приходит как
#      wl_shm (то есть всегда, когда нет рендер-ноды GPU);
#   2. «Buffer address requested when its parent pool has an external
#      reference and a deferred resize pending» на втором кадре;
#   3. застревание пула буферов видео: первый кадр показан, дальше тишина.
# Третий не лечится ничем со стороны настроек и делал видео на дашборде
# неработающим. Chromium играет тот же файл без единой жалобы.
#
# Флаги здесь, а не в ExecStart: их полтора десятка, и строка в юните
# превращается в нечитаемую простыню, которую никто не правит.
set -eu

[ -r /etc/default/dashdash ] && . /etc/default/dashdash

URL="http://127.0.0.1:${SCREEN_PORT:-3000}/"

# Подстраховка на случай запуска не из юнита (руками при отладке): без этого
# каталога композитор не создаст сокет Wayland и экран останется пустым.
if [ -z "${XDG_RUNTIME_DIR:-}" ]; then
	XDG_RUNTIME_DIR=/run/dashdash-kiosk
	export XDG_RUNTIME_DIR
	mkdir -p "$XDG_RUNTIME_DIR"
	chmod 700 "$XDG_RUNTIME_DIR"
fi

# --no-sandbox нужен потому, что киоск ходит под root: Chromium отказывается
# запускаться от root с включённой песочницей. Это временно — см. задачу про
# отдельного пользователя dashdash; отключённая песочница у браузера, который
# ходит в сеть, приемлема только на закрытом устройстве и только пока.
#
# --autoplay-policy: у телевизора некому нажать «play», а Chromium по
# умолчанию строже WebKit и без этого флага видео не стартует само.
#
# Потребительский шум (предложение перевода, вход в аккаунт, менеджер паролей,
# автозаполнение) выключается не флагами, а политиками — см.
# /etc/chromium/policies/managed/dashdash.json. Флаги ниже гасят то, что
# политиками не гасится.
# Сессионная шина D-Bus.
#
# Без неё Chromium работает, но сыпет в журнал «Failed to connect to the bus»
# на каждый запрос к UPower, портам и уведомлениям — десятки строк на запуск.
# Журнал экрана нам нужен читаемым: по нему разбирают, почему на стене висит
# не то. dbus-run-session поднимает шину на время работы браузера и убирает её
# следом.
if command -v dbus-run-session >/dev/null 2>&1; then
	set -- dbus-run-session --
else
	set --
fi

exec "$@" cage -- chromium \
	--kiosk \
	--no-sandbox \
	--no-first-run \
	--noerrdialogs \
	--no-default-browser-check \
	--disable-infobars \
	--disable-session-crashed-bubble \
	--disable-component-update \
	--disable-dev-shm-usage \
	--user-data-dir=/var/lib/dashdash/chromium \
	--ozone-platform=wayland \
	--lang=ru \
	--autoplay-policy=no-user-gesture-required \
	--disable-features=Translate,MediaRouter,GlobalMediaControls \
	${CHROMIUM_EXTRA_FLAGS:-} \
	"$URL"
