| // Copyright 2012 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| syntax = "proto2"; |
| |
| option optimize_for = LITE_RUNTIME; |
| option java_package = "org.chromium.components.variations"; |
| |
| package variations; |
| |
| import "layer.proto"; |
| |
| // This defines the Protocol Buffer representation of a Chrome Variations study |
| // as sent to clients of the Variations server. |
| // |
| // Next tag: 13 |
| message Study { |
| // The name of the study. Should not contain spaces or special characters. |
| // Ex: "my_study" |
| required string name = 1; |
| |
| // DEPRECATED: Prefer end_date instead. |
| // The expiry date of the study in Unix time format. (Seconds since midnight |
| // January 1, 1970 UTC). See: http://en.wikipedia.org/wiki/Unix_time |
| // |
| // A study that has expired will be disabled, and users will be assigned |
| // groups based on the default_experiment_name. This will take precedence over |
| // a corresponding hardcoded field trial in the client. |
| // |
| // Ex: 1330893974 (corresponds to 2012-03-04 20:46:14Z) |
| optional int64 expiry_date = 3; |
| |
| // Consistency setting for a study. |
| enum Consistency { |
| SESSION = 0; // Can't change within a session. |
| PERMANENT = 1; // Can't change for a given user. |
| } |
| |
| // Consistency setting for this study. Optional - defaults to SESSION. |
| // Ex: PERMANENT |
| optional Consistency consistency = 7 [default = SESSION]; |
| |
| // Optionally specifies which layer the study is a part of, which will |
| // ensure only one study per layer is enabled for a client. A study must |
| // specify both the ID of the layer and the ID of the LayerMember within |
| // that layer that the study should be associated with. |
| optional LayerMemberReference layer = 16; |
| |
| // Name of the experiment that gets the default experience. This experiment |
| // must be included in the list below. If not specified, a generic default |
| // experiment name is used. |
| // Ex: "default" |
| optional string default_experiment_name = 8; |
| |
| // Specifies under which conditions a |google_web_experiment_id| or |
| // |google_web_trigger_experiment_id| is visible to Google web properties. |
| enum GoogleWebVisibility { |
| // Eligible requests to Google web properties include the experiment ID. See |
| // AppendHeaderIfNeeded() in variations_http_headers.cc for eligibility |
| // details. |
| ANY = 0; |
| |
| // Only eligible requests initiated from a first-party context include the |
| // experiment ID. |
| // |
| // The following requests are considered to be from a first-party context: |
| // requests initiated by (i) the browser, (ii) a Chrome internal page, |
| // (iii) a main frame with a Google-owned domain, and (iv) a subframe |
| // whose associated main frame has a Google-owned domain. See |
| // IsFirstPartyContext() in variations_http_headers.cc for more details. |
| FIRST_PARTY = 1; |
| } |
| |
| // An experiment within the study. |
| // |
| // Next tag: 17 |
| message Experiment { |
| // A named parameter value for this experiment. |
| // |
| // Next tag: 3 |
| message Param { |
| // The name of the parameter. |
| optional string name = 1; |
| |
| // The value of the parameter. |
| optional string value = 2; |
| } |
| |
| // The name of the experiment within the study. |
| // Ex: "bucketA" |
| required string name = 1; |
| |
| // The cut of the total probability taken for this experiment (the x in |
| // x / N, where N is the sum of all x’s). Ex: "50" |
| required uint32 probability_weight = 2; |
| |
| // Optional id used to uniquely identify this experiment for Google web |
| // properties. |
| optional uint64 google_web_experiment_id = 3; |
| |
| // Optional id used to allow this experiment to trigger experimental |
| // behavior on Google web properties. |
| optional uint64 google_web_trigger_experiment_id = 8; |
| |
| // Optional id that specifies under which conditions Google web and web |
| // trigger experiment ids are visible to Google web properties. |
| optional GoogleWebVisibility google_web_visibility = 16; |
| |
| // Optional id used to uniquely identify this experiment for Chrome Sync. |
| optional uint64 chrome_sync_experiment_id = 10; |
| |
| // Optional id used to uniquely identify this experiment when activating |
| // integrations with the Android Google App. |
| // IMPORTANT: This field is only approved for integrations with the Android |
| // Google App and must receive a privacy review before extending to other |
| // apps. |
| optional uint64 google_app_experiment_id = 15; |
| |
| // Specifies the feature association parameters for this experiment group. |
| // |
| // Next tag: 5 |
| message FeatureAssociation { |
| // Optional list of features to enable when this experiment is selected. |
| // Command-line overrides take precedence over this setting. No feature |
| // listed here should exist in the |disable_feature| list. |
| repeated string enable_feature = 1; |
| |
| // Optional list of features to disable when this experiment is selected. |
| // Command-line overrides take precedence over this setting. No feature |
| // listed here should exist in the |enable_feature| list. |
| repeated string disable_feature = 2; |
| |
| // Similar to |forcing_flag|, this is an optional name of a feature which |
| // will cause this experiment to be activated, if that feature is enabled |
| // from the command-line. Experiment with this set are not eligible for |
| // selection via a random dice roll. |
| // Mutually exclusive with |forcing_flag|, |forcing_feature_off| or |
| // having a non-zero |probability_weight|. |
| optional string forcing_feature_on = 3; |
| |
| // Similar to |forcing_flag|, this is an optional name of a feature which |
| // will cause this experiment to be activated, if that feature is disabled |
| // from the command-line. Experiment with this set are not eligible for |
| // selection via a random dice roll. |
| // Mutually exclusive with |forcing_flag|, |forcing_feature_on| or having |
| // a non-zero |probability_weight|. |
| optional string forcing_feature_off = 4; |
| } |
| optional FeatureAssociation feature_association = 12; |
| |
| // Optional name of a Chrome flag that, when present, causes this experiment |
| // to be forced. If the forcing_flag field is set, users will not be |
| // assigned to this experiment unless that flag is present in Chrome's |
| // command line. |
| // Mutually exclusive with |forcing_feature_on|, |forcing_feature_off| or |
| // having a non-zero |probability_weight|. |
| optional string forcing_flag = 5; |
| |
| // Parameter values for this experiment. |
| repeated Param param = 6; |
| |
| enum Type { |
| // Regular experiment group. This is the default value and can be omitted. |
| NORMAL = 0; |
| |
| // Changes to this experiment group are ignored for the purposes of |
| // kill-switch triggering. Included to allow the flexibility to not |
| // trigger this logic for specific cases (e.g. a group rename without |
| // any functionality changes). |
| IGNORE_CHANGE = 1; |
| |
| // This is a kill-switch group that should be killed at "best effort" |
| // priority, e.g. with a hot dog menu badge. The experiment must have a |
| // probability_weight of 0. |
| KILL_BEST_EFFORT = 2; |
| |
| // This is a kill-switch group that should be killed with "critical" |
| // priority. Depending on platform this may result in showing a |
| // non-dismissible restart prompt with a timer. This should only be used |
| // in very serious emergency circumstances. The experiment must have a |
| // probability_weight of 0. |
| KILL_CRITICAL = 3; |
| } |
| optional Type type = 7 [default = NORMAL]; |
| |
| // A UI string to override, and the new value to use. |
| message OverrideUIString { |
| // The first 32 bits of the MD5 hash digest of the resource name to |
| // override. |
| // e.g. Hash("IDS_BOOKMARK_BAR_UNDO") |
| optional fixed32 name_hash = 1; |
| |
| // The new value of the string being overridden. |
| // e.g. "Undo" |
| optional string value = 2; |
| } |
| repeated OverrideUIString override_ui_string = 9; |
| } |
| |
| // List of experiments in this study. This list should include the default / |
| // control experiment. |
| // |
| // For example, to specify that 99% of users get the default behavior, while |
| // 0.5% of users get experience "A" and 0.5% of users get experience "B", |
| // specify the values below. |
| // Ex: { "default": 990, "A": 5, "B": 5 } |
| repeated Experiment experiment = 9; |
| |
| // Possible Chrome release channels. |
| // See: http://dev.chromium.org/getting-involved/dev-channel |
| enum Channel { |
| // UNKNOWN value is defined here for the benefit of code using this enum |
| // type, but is not actually meant to be encoded in the protobuf. |
| UNKNOWN = -1; |
| CANARY = 0; |
| DEV = 1; |
| BETA = 2; |
| STABLE = 3; |
| } |
| |
| // Possible Chrome operating system platforms. |
| // These names must match those in tools/variations/fieldtrial_to_struct.py. |
| enum Platform { |
| PLATFORM_WINDOWS = 0; |
| PLATFORM_MAC = 1; |
| PLATFORM_LINUX = 2; |
| PLATFORM_CHROMEOS = 3; |
| PLATFORM_ANDROID = 4; |
| PLATFORM_IOS = 5; |
| PLATFORM_ANDROID_WEBVIEW = 6; |
| PLATFORM_FUCHSIA = 7; |
| PLATFORM_ANDROID_WEBLAYER = 8; |
| PLATFORM_CHROMEOS_LACROS = 9; |
| } |
| |
| // Possible form factors Chrome is running on. |
| enum FormFactor { |
| // Chrome Desktop on Windows, Mac, Linux, or Chrome OS. |
| DESKTOP = 0; |
| // Phone-based mobile Chrome, e.g. an Android phone or iPhone. |
| PHONE = 1; |
| // Tablet-based mobile Chrome, e.g. an Android tablet or iPad. |
| TABLET = 2; |
| // Chrome OS running in single-app Kiosk mode. |
| KIOSK = 3; |
| // Chrome OS running on Meet Hardware devices e.g. Chromebox For Meetings. |
| MEET_DEVICE = 4; |
| } |
| |
| // Possible CPU architectures Chrome is running on. Only supported on M90+. |
| enum CpuArchitecture { |
| X86_64 = 0; |
| ARM64 = 1; |
| X86_32 = 2; |
| ARM32 = 3; |
| |
| // A Mac-only value, indicating an x86-64 binary running on an arm64 host |
| // via "Rosetta 2" binary translation. |
| TRANSLATED_X86_64 = 4; |
| } |
| |
| // Enum to pass as optional bool. |
| enum OptionalBool { |
| // Neither True nor False. (For cases like missing / unset / default etc.) |
| OPTIONAL_BOOL_MISSING = 0; |
| // Explicit True. |
| OPTIONAL_BOOL_TRUE = 1; |
| // Explicit False. |
| OPTIONAL_BOOL_FALSE = 2; |
| } |
| |
| // Possible states of the severity filter. |
| enum PolicyRestriction { |
| // No restriction configs apply to clients that do not have a |
| // "ChromeVariations" policy set or if it is set to the variations enabled |
| // value. |
| NONE = 0; |
| // Critical studies apply to both clients that have all variations enabled |
| // or if the "ChromeVariations" policy is set to only allow critical |
| // variations. |
| CRITICAL = 1; |
| // Critical-only studies apply *only* to clients that have the |
| // "ChromeVariations" policy set to only allow critical variations. |
| CRITICAL_ONLY = 2; |
| } |
| |
| // Filtering criteria specifying whether this study is applicable to a given |
| // Chrome instance. |
| // |
| // Next tag: 24 |
| message Filter { |
| // The start date of the study in Unix time format. (Seconds since midnight |
| // January 1, 1970 UTC). See: http://en.wikipedia.org/wiki/Unix_time |
| // Ex: 1330893974 (corresponds to 2012-03-04 20:46:14Z) |
| optional int64 start_date = 1; |
| |
| // The end date of the study in Unix time format. (Seconds since midnight |
| // January 1, 1970 UTC). See: http://en.wikipedia.org/wiki/Unix_time |
| // Ex: 1330893974 (corresponds to 2012-03-04 20:46:14Z) |
| // Mutually exclusive with expiry_date. The difference between end_date and |
| // expiry_date is that, when end_date is past, the field trial will not be |
| // created. When expiry_date is past, the trial is still created, but will |
| // be disabled, causing it to select its default group. |
| optional int64 end_date = 13; |
| |
| // The minimum Chrome version for this study, allowing a trailing '*' |
| // character for pattern matching. Inclusive. (To check for a match, iterate |
| // over each component checking >= until a * or end of string is reached.) |
| // Optional - if not specified, there is no minimum version. |
| // Ex: "17.0.963.46", "17.0.963.*", "17.*" |
| optional string min_version = 2; |
| |
| // The maximum Chrome version for this study; same formatting as |
| // |min_version| above. Inclusive. (To check for a match, iterate over each |
| // component checking <= until a * or end of string is reached.) |
| // Optional - if not specified, there is no maximum version. |
| // Ex: "19.*" |
| optional string max_version = 3; |
| |
| // The minimum OS version for this study, allowing a trailing '*' character |
| // for pattern matching. Inclusive. (To check for a match, iterate over each |
| // component checking >= until a * or end of string is reached.) OS versions |
| // are sanitized into a list of digits separated by dots like so: |
| // Windows: "6.2.7601 SP1" --> "6.2.7601.1" |
| // Mac OS X: "10.11.2" --> "10.11.2" |
| // Linux: "4.13.0-27-generic" --> "4.13.0" |
| // Optional - if not specified, there is no minimum version. |
| optional string min_os_version = 16; |
| |
| // The maximum OS version for this study, allowing a trailing '*' character |
| // for pattern matching. Inclusive. (To check for a match, iterate over each |
| // component checking <= until a * or end of string is reached.) |
| // Optional - if not specified, there is no minimum version. |
| // Ex: See |min_os_version| for details. |
| optional string max_os_version = 17; |
| |
| // List of channels that will receive this study. If omitted, the study |
| // applies to all channels. |
| // Ex: [BETA, STABLE] |
| repeated Channel channel = 4; |
| |
| // List of platforms that will receive this study. If omitted, the study |
| // applies to all platforms. |
| // Ex: [PLATFORM_WINDOWS, PLATFORM_MAC] |
| repeated Platform platform = 5; |
| |
| // List of locales that will receive this study. If omitted, the study |
| // applies to all locales, unless |exclude_locale| is specified. Mutually |
| // exclusive with |exclude_locale|. |
| // Ex: ["en-US", "en-CA"] |
| repeated string locale = 6; |
| |
| // List of locales that will be excluded from this study. If omitted, the |
| // study applies to all locales unless |locale| is specified. Mutually |
| // exclusive with |locale|. |
| // Ex: ["en-US", "en-CA"] |
| repeated string exclude_locale = 12; |
| |
| // List of form factors that will receive this study. If omitted, the study |
| // applies to all form factors, unless |exclude_form_factor| is specified. |
| // Mutually exclusive with |exclude_form_factor|. |
| // Ex: [PHONE, TABLET] |
| repeated FormFactor form_factor = 7; |
| |
| // List of form factors that will be excluded from this study. If omitted, |
| // the study applies to all form factors unless |form_factor| is specified. |
| // Mutually exclusive with |form_factor|. |
| // Takes the same range of values as form_factor, e.g. [PHONE, TABLET]. |
| repeated FormFactor exclude_form_factor = 14; |
| |
| // List of hardware classes that will receive this study. |
| // This supports Chrome OS and as of M77, Android. |
| // |
| // Starting with Chrome M67, this does a case insensitive match on the same |
| // hardware class field that is reported to UMA in the SystemProfileProto's |
| // |hardware.hardware_class| field. |
| // |
| // Older versions did a case sensitive substring comparison, which was |
| // problematic for short hardware classes like "eve" that existed as |
| // substrings of other longer ones. |
| // |
| // If omitted, the study applies to all hardware classes unless |
| // |exclude_hardware_class| is specified. Mutually exclusive with |
| // |exclude_hardware_class|. |
| // Ex: ["veyron_minnie", "daisy"] |
| repeated string hardware_class = 8; |
| |
| // List of hardware classes that will be excluded in this study. |
| // This supports Chrome OS and as of M77, Android. |
| // |
| // Starting with Chrome M67, this does a case insensitive match on the same |
| // hardware class field that is reported to UMA in the SystemProfileProto's |
| // |hardware.hardware_class| field. |
| // |
| // Older versions did a case sensitive substring comparison, which was |
| // problematic for short hardware classes like "eve" that existed as |
| // substrings of other longer ones. |
| // |
| // If omitted, the study applies to all hardware classes unless |
| // |hardware_class| is specified. Mutually exclusive with |hardware_class|. |
| // Ex: ["veyron_minnie", "daisy"] |
| repeated string exclude_hardware_class = 9; |
| |
| // List of lowercase ISO 3166-1 alpha-2 country codes that will receive this |
| // study. If omitted, the study applies to all countries unless |
| // |exclude_country| is specified. Mutually exclusive with |
| // |exclude_country|. |
| // Ex: ["in", "us"] |
| repeated string country = 10; |
| |
| // List of lowercase ISO 3166-1 alpha-2 country codes that will be excluded |
| // from this study. If omitted, the study applies to all countries unless |
| // |country| is specified. Mutually exclusive with |country|. |
| // Ex: ["in", "us"] |
| repeated string exclude_country = 11; |
| |
| // Specifies whether the config should apply to low-end devices only. This |
| // is currently only supported on Android. |
| optional bool is_low_end_device = 15; |
| |
| // Specifies whether the config should apply to enterprise or non-enterprise |
| // only. If omitted, the config applies to both groups. |
| // - On windows and mac, machines on a domain network are considered |
| // enterprise. |
| // - On chromeOS, registered mode determines enterprise status. |
| // - Android, iOS, and linux consider all clients as non-enterprise. |
| optional bool is_enterprise = 18; |
| |
| // Specifies the restrictions applied by the "ChromeVariations" policy to |
| // the study. See the definition of the PolicyRestriction enum for details. |
| optional PolicyRestriction policy_restriction = 19 [default = NONE]; |
| |
| // List of CPU architectures that will receive this study. If omitted, the |
| // study applies to all architectures, unless |exclude_cpu_architecture| is |
| // specified. Mutually exclusive with |exclude_cpu_architecture|. Ex: |
| // [X86_32, ARM64] |
| repeated CpuArchitecture cpu_architecture = 20; |
| |
| // List of CPU architectures that will be excluded from this study. If |
| // omitted, the study applies to all architectures unless |cpu_architecture| |
| // is specified. Mutually exclusive with |cpu_architecture|. Takes the same |
| // range of values as cpu_architecture, e.g. [X86_32, ARM64]. |
| repeated CpuArchitecture exclude_cpu_architecture = 21; |
| |
| // Specifies that the config should apply only to clients where at least |
| // one of the signed in users is a member of at least one of the specified |
| // groups. |
| // The values are the gaia ID of the google group. |
| // Mutually exclusive with |exclude_google_group|. |
| repeated int64 google_group = 22 [packed = true]; |
| |
| // Specifies that the config should apply only to clients where none |
| // of the signed in users are a member of any of the specified groups. |
| // The values are the gaia ID of the google group. |
| // Mutually exclusive with |google_group|. |
| repeated int64 exclude_google_group = 23 [packed = true]; |
| } |
| |
| // Filtering criteria for this study. A study that is filtered out for a given |
| // client is equivalent to that study not being sent at all. |
| optional Filter filter = 10; |
| |
| // Randomization seed to be used when |consistency| is set to PERMANENT. If |
| // not specified, randomization will be done using the trial name. |
| optional uint32 randomization_seed = 11; |
| |
| // Specifies whether the study starts as active initially, or whether it |
| // requires the client to query its state before it is marked as active. |
| enum ActivationType { |
| // The study will be activated when its state is queried by the client. |
| // This is recommended for most studies that include client code. |
| ACTIVATE_ON_QUERY = 0; |
| // The study will be automatically activated when it is created. This |
| // is recommended for studies that do not have any client logic. |
| ACTIVATE_ON_STARTUP = 1; |
| } |
| |
| // Activation type for this study. Defaults to ACTIVATE_ON_QUERY if omitted. |
| optional ActivationType activation_type = 12; |
| } |