[webkit-dev] New status field required for feature flags
emw at apple.com
Mon Jan 9 14:11:37 PST 2023
Brent (CC’d) and I are rolling out changes to how we represent feature flags in WebKit. As of https://commits.webkit.org/258448@main, the WebPreferences*.yaml files have been merged to one feature list:
Instead of having separate lists of experimental features, internal debug features, etc., each feature now has a `status` field. A feature’s status determines which UIs it is visible in (if any), and in the future will control its default value. Right now, these are the semantic meanings of the features status:
embedder Adjust WebKit behavior for embedding application needs.
unstable Feature in active development. Unfinished, no promise it is usable or safe.
internal Tools for debugging the WebKit engine. Not generally useful to web developers.
developer Tools for web developers.
testable Enabled by default in test infrastructure, but not ready to ship yet. Should be accessible for STP users who wish to activate them for testing and feedback.
preview Enabled by default in Safari Technology Preview, but not considered ready to ship yet.
stable Enabled by default and ready for general use, but UI to toggle the feature remains to support debugging, A/B testing.
shipping Enabled by default and ready for general use, but no UI to toggle. In general, will be removed 1 year after the change to shipping.
When you’re adding or changing features, our source generator will force you to pick one of these status. The “public-facing” statuses (developer, testable, preview, stable) are visible from the various “experimental features” call sites declared by WebKit, and the rest are exposed as “internal debug features”. And I’m adding an additional WebPreferences API which lists all features, so clients can avoid the experimental/internal-debug dichotomy going forward.
There’s one topic I’d like feedback on, which pertains to the non-Apple ports:
Some features don’t seem to have the same “status” on all platforms. For example, pdf.js has been enabled for GTK and WPE for some time now, and should probably be considered `stable` on those platforms. But it’s off by default on Apple platforms, where it should be no more than `testable`. How do we resolve discrepancies like these? We could:
- allow a feature’s status to be platform-conditional
- allow each port to decide whether a feature is on or off by default (regardless of its status)
- do nothing, and require clients to change feature statuses at runtime in order to modify default behavior
I’d like to eventually use the committed feature list to power https://webkit.org/status/, which makes me want to avoid having platform-conditional statuses. It would also be nice for feature statuses to be a global truth, helping us speak collectively about what web platform features are supported.
More information about the webkit-dev