Why Chromium Removed WebKit Vendor Prefixes in Blink
In 2013, the Chromium project forked the WebKit rendering engine to
create Blink, marking a significant shift in how the browser handled
experimental web features. This article provides an overview of why
Chromium decided to systematically remove and stop adding
WebKit-specific vendor prefixes (such as -webkit-) after
this transition. The decision was primarily driven by the need to
eliminate codebase bloat, fix broken cross-browser compatibility,
enforce true web standards, and introduce a better method for testing
new features through browser runtime flags.
The Failure of Vendor Prefixes
Vendor prefixes were originally designed as a temporary measure. They allowed browser makers to test experimental CSS and JavaScript features before those features were officially standardized by the World Wide Web Consortium (W3C).
However, due to the overwhelming popularity of WebKit-based browsers
like Google Chrome and Apple Safari, web developers began using
-webkit- properties on live production websites. Worse,
they often failed to include prefixes for other engines (like
-moz- for Firefox) or the final standard property. This
created a web compatibility crisis where millions of websites only
rendered correctly in WebKit browsers, effectively locking out
competitors and harming the open web.
Eliminating Codebase Bloat
When Chromium transitioned to Blink, a primary engineering goal was to strip away legacy code to make the new engine faster, lighter, and easier to maintain.
Supporting vendor prefixes required the browser to maintain multiple
versions of the same feature. Blink engineers had to keep the old
-webkit- implementation alive while simultaneously
supporting the newly standardized version. By committing to phase out
WebKit prefixes, the Chromium team was able to delete massive amounts of
duplicate and obsolete code, streamlining the Blink engine's
architecture.
Enforcing True Web Standards
A major issue with vendor prefixes was that a feature's design often
changed between its initial -webkit- introduction and its
final approval as a web standard.
Because so many live websites relied on the early, flawed
-webkit- behavior, Chromium was frequently trapped into
maintaining broken, non-standard functionality indefinitely just to
prevent popular websites from breaking. Removing these prefixes broke
this cycle. It forced web developers to adopt the final,
W3C-standardized syntax, ensuring that code written for Chromium would
work identically in Firefox, Safari, and Edge.
The Shift to Runtime Flags
To replace vendor prefixes, the Blink team introduced a new policy for experimental features: runtime flags.
Instead of exposing unfinished features to the entire web via a
-webkit- prefix, Chromium began hiding them behind internal
browser settings (accessible via chrome://flags). This
allowed web developers to turn on and test bleeding-edge capabilities
locally, while preventing those unstable features from being used on
public websites. Once an experimental feature was finalized and
standardized by the W3C, Chromium simply enabled it by default without
any prefix.
The Reality of Legacy Compatibility
While Chromium successfully stopped adding new
-webkit- prefixes immediately after the Blink fork,
removing existing ones proved difficult. Because so many
abandoned or unmaintained websites relied on properties like
-webkit-box-reflect or -webkit-appearance,
removing them entirely would have broken large portions of the
internet.
Consequently, Chromium removed the prefixes that had low usage numbers and standardized the most popular ones, ultimately ending the era of vendor prefixes while keeping the legacy web functional.