This document describes how to add a new Chrome feature flag visible to users
via chrome://flags
UI.
*** note
NOTE: It's NOT required if you don't intend to make your feature appear in
chrome://flags
UI.
See also the following for definitions:
*** note NOTE: All files mentioned in Step 1 require the features to be listed in alphabetical order.
This step would be different depending on where you want to use the flag:
Add a base::Feature
to the following files:
Add a base::Feature
to the following files:
Add a base::Feature
to the following files:
Historically, Blink also has its own runtime feature mechanism. So if you feature needs to be runtime-enabled, read also Blink's Runtime Enable Features doc and Initialization of Blink runtime features in content layer.
You can refer to this CL and this document to see
- Where to add the
base::Feature
: [1] [2] - How to use it: [1]
- How to wire your new
base::Feature
to a Blink runtime feature: [1] - How to use it in Blink: [1]
Also, this patch added a virtual test for running web tests with the flag. When you add a flag, you can consider to use that.
*** promo Googlers: Read also Chrome Feature Flag in chrome://flags.
*** promo Tip: Android WebView has its own flag UI. The WebView team recommends adding your features there too if they are supported on WebView. Follow these steps for WebView flags.
You have to modify these five files in total.
- chrome/browser/about_flags.cc (Add your changes at the bottom of the list)
- chrome/browser/flag_descriptions.cc (Features should be alphabetically sorted)
- chrome/browser/flag_descriptions.h (Features should be alphabetically sorted)
- tools/metrics/histograms/enums.xml
- chrome/browser/flag-metadata.json
At first you need to add an entry to about_flags.cc, flag_descriptions.cc and flag_descriptions.h. After that, try running the following script which will update enums.xml:
# Updates enums.xml
./tools/metrics/histograms/generate_flag_enums.py --feature <your awesome feature>
# Run AboutFlagsHistogramTest.CheckHistograms to verify enums.xml
./out/Default/unit_tests --gtest_filter=AboutFlagsHistogramTest.CheckHistograms
# Run AboutFlagsHistogramTest.CheckHistograms on Android to verify enums.xml
./out/Default/bin/run_unit_tests --gtest_filter=AboutFlagsHistogramTest.CheckHistograms
*** note
NOTE: If CheckHistograms returns an error, it will ask you to add several
entries to enums.xml. After doing so, run git cl format
which will insert the
entries in enums.xml in the correct order and run the tests again. You can refer
to this CL as an example.
Finally, run the following test.
./out/Default/unit_tests --gtest_filter=AboutFlagsTest.EveryFlagHasMetadata
That test will ask you to update the flag expiry metadata in flag-metadata.json.
When a feature flag is no longer used it should be removed. Once it has reached it's final state it can be removed in stages.
First remove the flag from the UI:
- chrome/browser/about_flags.cc
- chrome/browser/flag_descriptions.cc
- chrome/browser/flag_descriptions.h
- chrome/browser/flag-metadata.json
- Do not edit enums.xml. Keep the flag for archeological purposes.
Once there is no way to change the flag value, it's usage can be removed from the code.
Finally, once the flag is no longer referenced, it can be removed from content/ and third_party/blink/