Clicking Chrome's native “Make default” can change the HTML association while leaving HTTPS on Chromium. xdg-settings writes the ordinary MIME list, reads HTTP back through Omarchy's higher-priority omarchy-browser.desktop handler, rolls that write back, and exits before setting HTTPS. This reproduces the exact saved configuration from the affected laptop.
This adds a scoped xdg-settings bridge on the session PATH. When both active web-link handlers are Omarchy's router, browser-default set/get/check operate on the underlying associations. Ordinary link opening still goes through the existing handoff and window-focus path. Other properties and custom link handlers delegate unchanged to /usr/bin/xdg-settings; a custom BROWSER override remains intact. The bootstrap keeps account wrappers first and works for packaged and dev-linked sessions.
Chromium-family flags and Omarchy's Chromium policy no longer hide native default controls. The migration removes the old exact flag and disabled-default key while preserving other flags, symlinks, and policy keys. Existing applications need a new login session to inherit the bridge. Firefox's existing check policy is unchanged; this covers PATH-based xdg-settings callers rather than all toolkit APIs.
Related: #14441. This addresses the native-setting limitation acknowledged by that PR while retaining its link routing. #6590 covers the earlier session-wide BROWSER failure; the new test reproduces this routing failure even with BROWSER unset.
Validation
- New real-xdg-utils regression reproduces the partial write with the system setter, then verifies native set/get/check, Omarchy readback, xdg-open/GIO routing, repeat choices, invalid/missing desktop IDs, custom
BROWSER, and passthrough behavior through the bridge. Settings are isolated using temporary XDG directories. - Tested the installed Google Chrome 155.0.8059.84 binary with
--headless --no-first-run --make-default-browser, a temporary profile, isolated XDG settings, and a logging helper. It invokesxdg-settings set default-web-browser google-chrome.desktop. With the system helper it changes HTML, rolls HTTP back to Omarchy's router, and leaves HTTPS on Chromium. With this bridge it successfully selects Chrome for all underlying browser associations. The user's live defaults were not changed by the tests. - New migration tests pass, including repeat application, symlink preservation, other flags/policies, absent files, and an explicitly enabled policy.
- Existing browser-link-handoff, browser-handoff, launch-browser, hyprland-focus-app, default-browser-lookup, browser-env, policy-directory, previous check-migration, dev-env-path, and account-exec tests passed. Bash syntax and
git diff --checkpassed. ./test/allcompleted with isolated XDG state and graphical checks disabled: CLI passed; shell had 12 failures in 469 files, with 45 files containing skipped checks. All 12 failing files were individually rerun against both the candidate and clean upstream087f73d89with matching checkout helpers and isolated state; each failed in both. This is not a fully green run.
Failures reproduced on clean upstream
battery-status, crash-capture, elsewhen-migration, hyprland-workspace-layout, i18n, menu-plugin, migrate-notify, provision-user, screenrecording, screenrecording-wf-audio, sleep-lock, update-restart-kernel.
Review and remaining validation
The command-wrapper approach needs maintainer agreement. It leaves the system xdg-utils files untouched, but adds a narrowly scoped compatibility directory to the session PATH. The actual Chrome setter and regression are verified; the visible Settings button and focus behavior have not been exercised end to end in a fresh packaged login/ISO session. The policy migration's privileged install is covered with a stub, not applied to real machine-wide policies here. No desktop rollout is claimed.
Prepared with Codex; the original failure was reported by the laptop owner, and the reproductions and tests above were executed against the named code and installed Chrome binary.
[Medium impact] The PR appears safe to merge; no actionable defect was established.
Summary
Adds a scoped
xdg-settingsbridge so native browser choices can update ordinary associations without replacing Omarchy’s link router.Acknowledged validation limits:
prabhatCHexplicitly deferred fresh packaged-session checks of the visible Settings button and focus behavior. The privileged policy install was tested with a stub rather than real machine-wide policies. No desktop rollout was claimed.Diagram
Reviews (1) · Last reviewed commit: "Allow native browser default changes beh..." · Reviewed by Greptile