feat: settle Chrome's window, crash bubble and password prompts
Three things a volunteer should never have to see. Sway was drawing its own title bar above Chrome's tab strip, which already carries the window controls. Verified on a real session: Chrome is an xdg_shell client with app_id "google-chrome" and sway was giving it border "normal". A scoped rule removes the compositor decoration only — Chrome keeps its tabs and address bar, stays a normal window, and still maximises and minimises. A class rule covers an XWayland fallback. Nothing else changes: the only other window in this classroom is VLC, which is already borderless, so no broader rule is warranted. "Restore pages? Chrome didn't shut down correctly" is suppressed with --hide-crash-restore-bubble. Note the name. The switch this was going to use, --disable-session-crashed-bubble, is not present in Chrome 152 at all — checked against the strings of the installed binary — so it would have silently done nothing. That hides the prompt; the profile was still being marked as crashed, which is the untidy half. Chrome's browser process shuts down cleanly on SIGTERM, so a shutdown unit now gives it one and waits up to eight seconds before the session is torn out from under it. Best effort by construction: a shutdown that will not finish is far worse than a crash flag. Password prompts go off with the PasswordManagerEnabled policy, on the path the classroom already manages. Existing profile and session data are untouched, and website logins are unaffected: Wonder Ink and YouTube stay signed in. Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
co-authored by
Claude Opus 5
parent
890e365d81
commit
255072ac94
Executable
+61
@@ -0,0 +1,61 @@
|
||||
#!/bin/bash
|
||||
set -uo pipefail
|
||||
|
||||
# Closes Chrome properly before the machine goes down.
|
||||
#
|
||||
# Chrome marks a profile as crashed when it does not get to run its own
|
||||
# shutdown, which is what produces "Restore pages? Chrome didn't shut
|
||||
# down correctly" on the next boot. The browser process handles SIGTERM
|
||||
# by shutting down cleanly, so it is worth giving it one and waiting a
|
||||
# moment before the session is torn out from under it.
|
||||
#
|
||||
# --hide-crash-restore-bubble already hides the prompt. This stops the
|
||||
# profile being marked crashed at all, which is the tidier half of the
|
||||
# same problem.
|
||||
#
|
||||
# Run from ekklesia-classroom-shutdown.service. Never fails: a shutdown
|
||||
# that will not finish is far worse than a crash flag.
|
||||
|
||||
CLASSROOM_USER=classroom
|
||||
WAIT_SECONDS=8
|
||||
|
||||
log() {
|
||||
echo "[classroom-shutdown] $1"
|
||||
}
|
||||
|
||||
browser_processes() {
|
||||
# Only the browser process, not its renderers: those carry --type=
|
||||
# and are Chrome's own business to reap.
|
||||
local pid
|
||||
for pid in $(pgrep -u "$CLASSROOM_USER" -x chrome 2>/dev/null); do
|
||||
# Braces so a process exiting between pgrep and this read is
|
||||
# silent: bash reports a failed redirection itself, before the
|
||||
# command's own stderr redirect can catch it.
|
||||
if ! { tr '\0' '\n' < "/proc/$pid/cmdline"; } 2>/dev/null |
|
||||
grep -q '^--type='; then
|
||||
echo "$pid"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
pids="$(browser_processes)"
|
||||
|
||||
if [[ -z "$pids" ]]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
log "asking Chrome to close"
|
||||
|
||||
# shellcheck disable=SC2086
|
||||
kill -TERM $pids 2>/dev/null || true
|
||||
|
||||
for _ in $(seq 1 $((WAIT_SECONDS * 5))); do
|
||||
if [[ -z "$(browser_processes)" ]]; then
|
||||
log "Chrome closed cleanly"
|
||||
exit 0
|
||||
fi
|
||||
sleep 0.2
|
||||
done
|
||||
|
||||
log "Chrome did not close in time; leaving it to systemd"
|
||||
exit 0
|
||||
Reference in New Issue
Block a user