Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3356)

Unified Diff: docs/origin_trials_integration.md

Issue 2693503002: Add documentation for Origin Trials integration (Closed)
Patch Set: Address nits Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: docs/origin_trials_integration.md
diff --git a/docs/origin_trials_integration.md b/docs/origin_trials_integration.md
new file mode 100644
index 0000000000000000000000000000000000000000..227bd6d42727ef44e3b0e84d8b9ed0830d170f30
--- /dev/null
+++ b/docs/origin_trials_integration.md
@@ -0,0 +1,165 @@
+# Integrating a feature with the Origin Trials framework
+
+To expose your feature via the origin trials framework, there are a few code
+changes required.
+
+[TOC]
+
+## Code Changes
+
+### Runtime Enabled Features
+
+First, you’ll need to configure [RuntimeEnabledFeatures.json5]. This is
+explained in the file, but you use `origin_trial_feature_name` to associate your
+runtime feature flag with a name for your origin trial. The name can be the
+same as your runtime feature flag, or different. Eventually, this configured
+name will be used in the Origin Trials developer console (still under
+development). You can have both `status: experimental` and
+`origin_trial_feature_name` if you want your feature to be enabled either by
+using the `--enable-experimental-web-platform-features` flag **or** the origin
+trial.
+
+You may have a feature that is not available on all platforms, or need to limit
+the trial to specific platforms. Use `origin_trial_os: [list]` to specify which
+platforms will allow the trial to be enabled. The list values are case-
+insensitive, but must match one of the defined `OS_<platform>` macros (see
+[build_config.h]).
+
+#### Examples
+
+Flag name and trial name are the same:
+```
+{
+ name: "MyFeature",
+ origin_trial_feature_name: "MyFeature",
+ status: "experimental",
+},
+```
+Flag name and trial name are different:
+```
+{
+ name: "MyFeature",
+ origin_trial_feature_name: "MyFeatureTrial",
+ status: "experimental",
+},
+```
+Trial limited to specific platform:
+``` json
+{
+ name: "MyFeature",
+ origin_trial_feature_name: "MyFeature",
+ origin_trial_os: ["android"],
+ status: "experimental",
+},
+```
+
+### Gating Access
+
+Once configured, there are two mechanisms to gate access to your feature behind
+an origin trial. You can use either mechanism, or both, as appropriate to your
+feature implementation.
+
+1. A native C++ method that you can call in Blink code at runtime to expose your
+ feature: `bool OriginTrials::myFeatureEnabled()`
+2. An IDL attribute \[[OriginTrialEnabled]\] that you can use to automatically
+ expose and hide JavaScript methods/attributes/objects. This attribute works
+ very similar to \[RuntimeEnabled\].
+```
+[OriginTrialEnabled=MyFeature]
+partial interface Navigator {
+ readonly attribute MyFeatureManager myFeature;
+}
+```
+
+**NOTE:** Your feature implementation must not persist the result of the enabled
+check. Your code should simply call `OriginTrials::myFeatureEnabled()` as often
+as necessary to gate access to your feature.
+
+### IDL Bindings
+
+When using the \[OriginTrialEnabled\] IDL attribute, you'll need to manually
+install the appropriate methods in the V8 bindings code. Based on the
+\[OriginTrialEnabled\] attribute, there will be one or more `installMyFeature`
+methods generated in the bindings code. These methods must be manually
+installed:
+
+- Find the relevant methods by doing a code search for `installMyFeature`:
+ - Search within the generated bindings code, e.g. 'f:gen/blink/bindings'
+ - Example search results: `V8WindowPartial::installMyFeature`,
+ `V8NavigatorPartial::installMyFeature`, `V8<type>::installMyFeature`
+- Determine which bindings code needs to be updated:
+ - [ConditionalFeatures.cpp]: Your feature lives in `core` (i.e. generated
+ methods are found under .../bindings/core/...)
+ - [ConditionalFeaturesForModules.cpp]: Your feature lives under `modules`
+ (i.e. generated methods are found under .../bindings/modules/...)
+- Update `installConditionalFeatures[Core|ForModules]()`:
+ - These methods are broken down by type.
+ - Add/update the logic for each type to call the corresponding
+ `V8<type>::installMyFeature()` methods.
+- Update `installPendingConditionalFeature[Core|ForModules]()`:
+ - These methods are broken down by trial/feature.
+ - Add/update the logic for each feature to call all of the
+ `installMyFeature()` methods.
+
+Eventually, the V8 bindings code will be generated automatically (See
+[crbug.com/615060]).
+
+
+## Limitations
+
+What you can't do, because of the nature of these Origin Trials, is know at
+either browser or renderer startup time whether your feature is going to be used
+in the current page/context. This means that if you require lots of expensive
+processing to begin (say you index the user's hard drive, or scan an entire city
+for interesting weather patterns,) that you will have to either do it on browser
+startup for *all* users, just in case it's used, or do it on first access. (If
+you go with first access, then only people trying the experiment will notice the
+delay, and hopefully only the first time they use it.). We are investigating
+providing a method like `OriginTrials::myFeatureShouldInitialize()` that will
+hint if you should do startup initialization. For example, this could include
+checks for trials that have been revoked (or throttled) due to usage, if the
+entire origin trials framework has been disabled, etc. The method would be
+conservative and assume initialization is required, but it could avoid expensive
+startup in some known scenarios.
+
+Similarly, if you need to know in the browser process whether a feature should
+be enabled, then you will have to either have the renderer inform it at runtime,
+or else just assume that it's always enabled, and gate access to the feature
+from the renderer.
+
+## Testing
+
+If you want to test your code's interactions with the framework, you'll need to
+generate some tokens of your own. To generate your own tokens, use
+[generate_token.py]. You can generate signed tokens for localhost, or for
+127.0.0.1, or for any origin that you need to help you test. For example:
+
+```
+tools/origin_trials/generate_token.py http://localhost:8000 MyFeature
+```
+
+The file `tools/origin_trials/eftest.key` is used by default as the private key
+for the test keypair used by Origin Trials unit tests and layout tests (i.e. in
+content shell). Tokens generated with this key will **not** work in the browser
+by default (see the [Developer Guide] for instructions on creating real tokens).
+To use a test token with the browser, run Chrome with the command-line flag:
+
+```
+--origin-trial-public-key=dRCs+TocuKkocNKa0AtZ4awrt9XKH2SQCI6o4FY6BNA=
+```
+
+This is the base64 encoding of the public key associated with `eftest.key`. If
+it doesn't work, see [trial_token_unittest.cc]. If you cannot set command-line
+switches (e.g., on Chrome OS), you can also directly modify
+[chrome_origin_trial_policy.cc].
+
+[build_config.h]: /build/build_config.h
+[chrome_origin_trial_policy.cc]: /chrome/common/origin_trials/chrome_origin_trial_policy.cc
+[crbug.com/615060]: https://bugs.chromium.org/p/chromium/issues/detail?id=615060
+[ConditionalFeatures.cpp]: /third_party/WebKit/Source/bindings/core/v8/ConditionalFeatures.cpp
+[ConditionalFeaturesForModules.cpp]: /third_party/WebKit/Source/bindings/modules/v8/ConditionalFeaturesForModules.cpp
+[generate_token.py]: /tools/origin_trials/generate_token.py
+[Developer Guide]: https://github.com/jpchase/OriginTrials/blob/gh-pages/developer-guide.md
+[OriginTrialEnabled]: /third_party/WebKit/Source/bindings/IDLExtendedAttributes.md#_OriginTrialEnabled_i_m_a_c_
+[RuntimeEnabledFeatures.json5]: /third_party/WebKit/Source/platform/RuntimeEnabledFeatures.json5
+[trial_token_unittest.cc]: /content/common/origin_trials/trial_token_unittest.cc
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698