TL;DR
Chromium’s CSS zoom handling had a hidden gap: when a child explicitly inherited a normally non-inherited property from its parent, the value was not always adjusted for the child’s different effective zoom. Fixing it took a long campaign of patches across sizing, borders, margins, and more, and the tracked cases have now been fixed with broader regression coverage.
The bug that hid in plain sight
Some bugs announce themselves with a crash or a blank screen. This one was sneakier. Apply the CSS zoom property to part of a page, use inherit on a property like height or border-width, and Chromium could quietly compute an incorrectly scaled value. No error. No warning. Just an incorrect computed value.
That’s the heart of an issue fixed by Helmut Januschka, issue 420443621: non-inherited properties ignore zoom on inheritance.
How a proof of pattern became a loose end
The story starts with CL:5323090, which introduced a mechanism for adjusting CSS values when an element’s effective CSS zoom changes, tracked with an affected_by_zoom flag. It was designed as a proof of pattern, so it applied the flag to just two properties:
line-height, an inherited propertywidth, a non-inherited property
The plan was to extend the approach to other properties in follow-up changes. But as one contributor pointed out, that rollout was never finished for non-inherited properties, a gap Emilio discovered.
The consequence: when a property was explicitly set to inherit and the child had a different zoom value than its parent, Chrome didn’t rescale it. The list of affected properties turned out to be long. It included height, min/max width and height, inset properties, border properties, and many more.
A test case added later in the thread made it concrete. A child inheriting border-image-width from a parent under a zoom: 3 context came back with the wrong computed value instead of the correctly adjusted one.
The fix: a campaign, not a patch
There was no single heroic commit here. The fix was a long, incremental effort, with each patch marking another property or group as affected_by_zoom so it would inherit correctly:
- Sizing properties (the first follow-up fix)
- Inset properties
- Border properties
- Padding properties
- Margin properties
- Outline properties
- Column properties
flex-basis- Assorted “triage failing zoom test” cleanups, including one triggered by a related WPT test regression
- A broader pass, “Fix explicit inheritance for all length properties,” to close remaining gaps
- A fix for
animation-timelinere-zooming - Extra tree-scope validation checks
The issue was closed after an initial set of fixes, then reopened when additional failing properties were discovered. The reopening is the most instructive part: a maintainer found more failing cases, like the border-image-width example, and made the case that chasing bugs one property at a time wasn’t enough. In their words, the team needed to go through all properties systematically. The assignee agreed to review every property rather than patch individual reports as they surfaced.
Why this matters for Chromium developers
The Bug Bounty Program focuses on real bugs that affect real developers, and this one delivers on three fronts:
- Correct values, no more silent drift. If you use the CSS
zoomproperty alongside explicitinheriton sizing, spacing, border, outline, or length-based properties, Chrome should now compute the properly zoom-adjusted value. That removes a class of subtle rendering bugs that were hard to spot without cross-checking computed styles. - A map for the next debugger. The well-documented trail of changes shows which property categories have been covered and which fix patterns were used. Anyone chasing a similar zoom issue in future has a head start.
- Fewer surprises down the road. Shifting from reactive, per-bug patching to a systematic audit reduces the risk of the same bug resurfacing on a property nobody thought to test. That makes zoom and CSS inheritance more reliable together.
Acknowledgements
Although Helmut Januschka authored the ultimate fix for zoom inheritance failures across length properties, resolving the bug was a true collaborative effort built upon earlier foundational fixes from Chromium engineers Anders Hartvoll Ruud and Rune Lillesveen.
Your turn: pick a bug, get paid
The Supporters of Chromium-Based Browsers rewards the developers who make Chromium better for the people and browsers that depend on it every day. Bugs like this one, and the persistence it took to fix it properly, are exactly what our Bug Bounty Program exists to recognize.
Here’s how it works: pick a bug from one of our approved lists, submit a fix, and get paid.
- Small bugs: $1,000 for targeted fixes with clear user benefit, on the
BugBounty-Smallhotlist. - Medium bugs: $5,000 for moderate-impact issues, on the
BugBounty-Mediumhotlist. - Large bugs: $20,000 for high-impact bugs with broad user or developer visibility, on the
BugBounty-Largehotlist.
Ready to fix your first bug? Find out how to get involved.