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.