1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // Stores information about the user's brower and system configuration.
6 // The system configuration fields are recorded once per client session.
10 option optimize_for = LITE_RUNTIME;
11 option java_outer_classname = "SystemProfileProtos";
12 option java_package = "org.chromium.components.metrics";
17 message SystemProfileProto {
18 // The time when the client was compiled/linked, in seconds since the epoch.
19 optional int64 build_timestamp = 1;
21 // A version number string for the application.
22 // Most commonly this is the browser version number found in a user agent
23 // string, and is typically a 4-tuple of numbers separated by periods. In
24 // cases where the user agent version might be ambiguous (example: Linux 64-
25 // bit build, rather than 32-bit build, or a Windows version used in some
26 // special context, such as ChromeFrame running in IE), then this may include
27 // some additional postfix to provide clarification not available in the UA
30 // An example of a browser version 4-tuple is "5.0.322.0". Currently used
33 // "-64": a 64-bit build
34 // "-F": Chrome is running under control of ChromeFrame
35 // "-devel": this is not an official build of Chrome
37 // A full version number string could look similar to:
38 // "5.0.322.0-F-devel".
40 // This value, when available, is more trustworthy than the UA string
41 // associated with the request; and including the postfix, may be more
43 optional string app_version = 2;
45 // The brand code or distribution tag assigned to a partner, if available.
46 // Brand codes are only available on Windows. Not every Windows install
47 // though will have a brand code.
48 optional string brand_code = 12;
50 // The possible channels for an installation, from least to most stable.
52 CHANNEL_UNKNOWN = 0; // Unknown channel -- perhaps an unofficial build?
58 optional Channel channel = 10;
60 // True if Chrome build is ASan-instrumented.
61 optional bool is_asan_build = 20 [default = false];
63 // The date the user enabled UMA, in seconds since the epoch.
64 // If the user has toggled the UMA enabled state multiple times, this will
65 // be the most recent date on which UMA was enabled.
66 // For privacy, this is rounded to the nearest hour.
67 optional int64 uma_enabled_date = 3;
69 // The time when the client was installed, in seconds since the epoch.
70 // For privacy, this is rounded to the nearest hour.
71 optional int64 install_date = 16;
73 // The user's selected application locale, i.e. the user interface language.
74 // The locale includes a language code and, possibly, also a country code,
76 optional string application_locale = 4;
78 // Information on the user's operating system.
80 // The user's operating system. This should be one of:
83 // - Linux (includes ChromeOS)
86 optional string name = 1;
88 // The version of the OS. The meaning of this field is OS-dependent.
89 optional string version = 2;
91 // The fingerprint of the build. This field is used only on Android.
92 optional string fingerprint = 3;
94 // Whether the version of iOS appears to be "jailbroken". This field is
95 // used only on iOS. Chrome for iOS detects whether device contains a
96 // DynamicLibraries/ directory. It's a necessary but insufficient indicator
97 // of whether the operating system has been jailbroken.
98 optional bool is_jailbroken = 4;
102 // Next tag for Hardware: 18
103 // Information on the user's hardware.
105 // The CPU architecture (x86, PowerPC, x86_64, ...)
106 optional string cpu_architecture = 1;
108 // The amount of RAM present on the system, in megabytes.
109 optional int64 system_ram_mb = 2;
111 // The base memory address that chrome.dll was loaded at.
112 // (Logged only on Windows.)
113 optional int64 dll_base = 3;
115 // The Chrome OS device hardware class ID is a unique string associated with
116 // each Chrome OS device product revision generally assigned at hardware
117 // qualification time. The hardware class effectively identifies the
118 // configured system components such as CPU, WiFi adapter, etc.
120 // An example of such a hardware class is "IEC MARIO PONY 6101". An
121 // internal database associates this hardware class with the qualified
122 // device specifications including OEM information, schematics, hardware
123 // qualification reports, test device tags, etc.
124 optional string hardware_class = 4;
126 // The number of physical screens.
127 optional int32 screen_count = 5;
129 // The screen dimensions of the primary screen, in pixels.
130 optional int32 primary_screen_width = 6;
131 optional int32 primary_screen_height = 7;
133 // The device scale factor of the primary screen.
134 optional float primary_screen_scale_factor = 12;
136 // Max DPI for any attached screen. (Windows only)
137 optional float max_dpi_x = 9;
138 optional float max_dpi_y = 10;
140 // Information on the CPU obtained by CPUID.
142 // A 12 character string naming the vendor, e.g. "GeniuneIntel".
143 optional string vendor_name = 1;
145 // The signature reported by CPUID (from EAX).
146 optional uint32 signature = 2;
148 // Number of logical processors/cores on the current machine.
149 optional uint32 num_cores = 3;
151 optional CPU cpu = 13;
153 // Information on the GPU
155 // The GPU manufacturer's vendor id.
156 optional uint32 vendor_id = 1;
158 // The GPU manufacturer's device id for the chip set.
159 optional uint32 device_id = 2;
161 // The driver version on the GPU.
162 optional string driver_version = 3;
164 // The driver date on the GPU.
165 optional string driver_date = 4;
167 // The GL_VENDOR string. An example of a gl_vendor string is
168 // "Imagination Technologies". "" if we are not using OpenGL.
169 optional string gl_vendor = 6;
171 // The GL_RENDERER string. An example of a gl_renderer string is
172 // "PowerVR SGX 540". "" if we are not using OpenGL.
173 optional string gl_renderer = 7;
175 optional Graphics gpu = 8;
177 // Information about Bluetooth devices paired with the system.
179 // Whether Bluetooth is present on this system.
180 optional bool is_present = 1;
182 // Whether Bluetooth is enabled on this system.
183 optional bool is_enabled = 2;
185 // Describes a paired device.
186 message PairedDevice {
187 // Assigned class of the device. This is a bitfield according to the
188 // Bluetooth specification available at the following URL:
189 // https://www.bluetooth.org/en-us/specification/assigned-numbers-overview/baseband
190 optional uint32 bluetooth_class = 1;
192 // Decoded device type.
199 DEVICE_CAR_AUDIO = 5;
201 DEVICE_PERIPHERAL = 7;
204 DEVICE_KEYBOARD = 10;
207 DEVICE_KEYBOARD_MOUSE_COMBO = 13;
209 optional Type type = 2;
211 // Vendor prefix of the Bluetooth address, these are OUI registered by
212 // the IEEE and are encoded with the first byte in bits 16-23, the
213 // second byte in bits 8-15 and the third byte in bits 0-7.
215 // ie. Google's OUI (00:1A:11) is encoded as 0x00001A11
216 optional uint32 vendor_prefix = 4;
218 // The Vendor ID of a device, returned in vendor_id below, can be
219 // either allocated by the Bluetooth SIG or USB IF, providing two
220 // completely overlapping namespaces for identifiers.
222 // This field should be read along with vendor_id to correctly
223 // identify the vendor. For example Google is identified by either
224 // vendor_id_source = VENDOR_ID_BLUETOOTH, vendor_id = 0x00E0 or
225 // vendor_id_source = VENDOR_ID_USB, vendor_id = 0x18D1.
227 // If the device does not support the Device ID specification the
228 // unknown value will be set.
229 enum VendorIDSource {
230 VENDOR_ID_UNKNOWN = 0;
231 VENDOR_ID_BLUETOOTH = 1;
234 optional VendorIDSource vendor_id_source = 8;
236 // Vendor ID of the device, where available.
237 optional uint32 vendor_id = 5;
239 // Product ID of the device, where available.
240 optional uint32 product_id = 6;
242 // Device ID of the device, generally the release or version number in
243 // BCD format, where available.
244 optional uint32 device_id = 7;
246 repeated PairedDevice paired_device = 3;
248 optional Bluetooth bluetooth = 11;
250 // Whether the internal display produces touch events. Omitted if unknown.
251 // Logged on ChromeOS only.
252 optional bool internal_display_supports_touch = 14;
254 // Vendor ids and product ids of external touchscreens.
255 message TouchScreen {
256 // Touch screen vendor id.
257 optional uint32 vendor_id = 1;
258 // Touch screen product id.
259 optional uint32 product_id = 2;
261 // Lists vendor and product ids of external touchscreens.
262 // Logged on ChromeOS only.
263 repeated TouchScreen external_touchscreen = 15;
265 // Drive messages are currently logged on Windows 7+, iOS, and Android.
267 // Whether this drive incurs a time penalty when randomly accessed. This
268 // should be true for spinning disks but false for SSDs or other
269 // flash-based drives.
270 optional bool has_seek_penalty = 1;
272 // The drive that the application executable was loaded from.
273 optional Drive app_drive = 16;
274 // The drive that the current user data directory was loaded from.
275 optional Drive user_data_drive = 17;
277 optional Hardware hardware = 6;
279 // Information about the network connection.
281 // Set to true if connection_type changed during the lifetime of the log.
282 optional bool connection_type_is_ambiguous = 1;
284 // See net::NetworkChangeNotifier::ConnectionType.
285 enum ConnectionType {
286 CONNECTION_UNKNOWN = 0;
287 CONNECTION_ETHERNET = 1;
292 CONNECTION_BLUETOOTH = 6;
294 // The connection type according to NetworkChangeNotifier.
295 optional ConnectionType connection_type = 2;
297 // Set to true if wifi_phy_layer_protocol changed during the lifetime of the log.
298 optional bool wifi_phy_layer_protocol_is_ambiguous = 3;
300 // See net::WifiPHYLayerProtocol.
301 enum WifiPHYLayerProtocol {
302 WIFI_PHY_LAYER_PROTOCOL_NONE = 0;
303 WIFI_PHY_LAYER_PROTOCOL_ANCIENT = 1;
304 WIFI_PHY_LAYER_PROTOCOL_A = 2;
305 WIFI_PHY_LAYER_PROTOCOL_B = 3;
306 WIFI_PHY_LAYER_PROTOCOL_G = 4;
307 WIFI_PHY_LAYER_PROTOCOL_N = 5;
308 WIFI_PHY_LAYER_PROTOCOL_UNKNOWN = 6;
310 // The physical layer mode of the associated wifi access point, if any.
311 optional WifiPHYLayerProtocol wifi_phy_layer_protocol = 4;
313 // Describe wifi access point information.
314 message WifiAccessPoint {
315 // Vendor prefix of the access point's BSSID, these are OUIs
316 // (Organizationally Unique Identifiers) registered by
317 // the IEEE and are encoded with the first byte in bits 16-23, the
318 // second byte in bits 8-15 and the third byte in bits 0-7.
319 optional uint32 vendor_prefix = 1;
321 // Access point seurity mode definitions.
323 SECURITY_UNKNOWN = 0;
331 // The security mode of the access point.
332 optional SecurityMode security_mode = 2;
334 // Vendor specific information.
335 message VendorInformation {
336 // The model number, for example "0".
337 optional string model_number = 1;
339 // The model name (sometimes the same as the model_number),
340 // for example "WZR-HP-AG300H".
341 optional string model_name = 2;
343 // The device name (sometimes the same as the model_number),
344 // for example "Dummynet"
345 optional string device_name = 3;
347 // The list of vendor-specific OUIs (Organziationally Unqiue
348 // Identifiers). These are provided by the vendor through WPS
349 // (Wireless Provisioning Service) information elements, which
350 // identifies the content of the element.
351 repeated uint32 element_identifier = 4;
353 // The wireless access point vendor information.
354 optional VendorInformation vendor_info = 3;
356 // Information of the wireless AP that device is connected to.
357 optional WifiAccessPoint access_point_info = 5;
359 optional Network network = 13;
361 // Information on the Google Update install that is managing this client.
362 message GoogleUpdate {
363 // Whether the Google Update install is system-level or user-level.
364 optional bool is_system_install = 1;
366 // The date at which Google Update last started performing an automatic
367 // update check, in seconds since the Unix epoch.
368 optional int64 last_automatic_start_timestamp = 2;
370 // The date at which Google Update last successfully sent an update check
371 // and recieved an intact response from the server, in seconds since the
372 // Unix epoch. (The updates don't need to be successfully installed.)
373 optional int64 last_update_check_timestamp = 3;
375 // Describes a product being managed by Google Update. (This can also
376 // describe Google Update itself.)
377 message ProductInfo {
378 // The current version of the product that is installed.
379 optional string version = 1;
381 // The date at which Google Update successfully updated this product,
382 // stored in seconds since the Unix epoch. This is updated when an update
383 // is successfully applied, or if the server reports that no update
385 optional int64 last_update_success_timestamp = 2;
387 // The result reported by the product updater on its last run.
389 INSTALL_RESULT_SUCCESS = 0;
390 INSTALL_RESULT_FAILED_CUSTOM_ERROR = 1;
391 INSTALL_RESULT_FAILED_MSI_ERROR = 2;
392 INSTALL_RESULT_FAILED_SYSTEM_ERROR = 3;
393 INSTALL_RESULT_EXIT_CODE = 4;
395 optional InstallResult last_result = 3;
397 // The error code reported by the product updater on its last run. This
398 // will typically be a error code specific to the product installer.
399 optional int32 last_error = 4;
401 // The extra error code reported by the product updater on its last run.
402 // This will typically be a Win32 error code.
403 optional int32 last_extra_error = 5;
405 optional ProductInfo google_update_status = 4;
406 optional ProductInfo client_status = 5;
408 optional GoogleUpdate google_update = 11;
410 // Information on all installed plugins.
412 // The plugin's self-reported name and filename (without path).
413 optional string name = 1;
414 optional string filename = 2;
416 // The plugin's version.
417 optional string version = 3;
419 // True if the plugin is disabled.
420 // If a client has multiple local Chrome user accounts, this is logged based
421 // on the first user account launched during the current session.
422 optional bool is_disabled = 4;
424 // True if the plugin is PPAPI.
425 optional bool is_pepper = 5;
427 repeated Plugin plugin = 7;
429 // Figures that can be used to generate application stability metrics.
430 // All values are counts of events since the last time that these
431 // values were reported.
434 // Total amount of time that the program was running, in seconds,
435 // since the last time a log was recorded, as measured using a client-side
436 // clock implemented via TimeTicks, which guarantees that it is monotonic
437 // and does not jump if the user changes his/her clock. The TimeTicks
438 // implementation also makes the clock not count time the computer is
440 optional int64 incremental_uptime_sec = 1;
442 // Total amount of time that the program was running, in seconds,
443 // since startup, as measured using a client-side clock implemented
444 // via TimeTicks, which guarantees that it is monotonic and does not
445 // jump if the user changes his/her clock. The TimeTicks implementation
446 // also makes the clock not count time the computer is suspended.
447 // This field was added for M-35.
448 optional int64 uptime_sec = 23;
450 // Page loads along with renderer crashes and hangs, since page load count
451 // roughly corresponds to usage.
452 optional int32 page_load_count = 2;
453 optional int32 renderer_crash_count = 3;
454 optional int32 renderer_hang_count = 4;
456 // Number of renderer crashes that were for extensions. These crashes are
457 // not counted in renderer_crash_count.
458 optional int32 extension_renderer_crash_count = 5;
460 // Number of non-renderer child process crashes.
461 optional int32 child_process_crash_count = 6;
463 // Number of times the browser has crashed while logged in as the "other
464 // user" (guest) account.
465 // Logged on ChromeOS only.
466 optional int32 other_user_crash_count = 7;
468 // Number of times the kernel has crashed.
469 // Logged on ChromeOS only.
470 optional int32 kernel_crash_count = 8;
472 // Number of times the system has shut down uncleanly.
473 // Logged on ChromeOS only.
474 optional int32 unclean_system_shutdown_count = 9;
477 // All the remaining fields in the Stability are recorded at most once per
481 // The number of times the program was launched.
482 // This will typically be equal to 1. However, it is possible that Chrome
483 // was unable to upload stability metrics for previous launches (e.g. due to
484 // crashing early during startup), and hence this value might be greater
486 optional int32 launch_count = 15;
487 // The number of times that it didn't exit cleanly (which we assume to be
489 optional int32 crash_count = 16;
491 // The number of times the program began, but did not complete, the shutdown
492 // process. (For example, this may occur when Windows is shutting down, and
493 // it only gives the process a few seconds to clean up.)
494 optional int32 incomplete_shutdown_count = 17;
496 // The number of times the program was able register with breakpad crash
498 optional int32 breakpad_registration_success_count = 18;
500 // The number of times the program failed to register with breakpad crash
501 // services. If crash registration fails then when the program crashes no
502 // crash report will be generated.
503 optional int32 breakpad_registration_failure_count = 19;
505 // The number of times the program has run under a debugger. This should
506 // be an exceptional condition. Running under a debugger prevents crash
507 // dumps from being generated.
508 optional int32 debugger_present_count = 20;
510 // The number of times the program has run without a debugger attached.
511 // This should be most common scenario and should be very close to
513 optional int32 debugger_not_present_count = 21;
515 // Stability information for all installed plugins.
516 message PluginStability {
517 // The relevant plugin's information (name, etc.)
518 optional Plugin plugin = 1;
520 // The number of times this plugin's process was launched.
521 optional int32 launch_count = 2;
523 // The number of times this plugin was instantiated on a web page.
524 // This will be >= |launch_count|.
525 // (A page load with multiple sections drawn by this plugin will
526 // increase this count multiple times.)
527 optional int32 instance_count = 3;
529 // The number of times this plugin process crashed.
530 // This value will be <= |launch_count|.
531 optional int32 crash_count = 4;
533 // The number of times this plugin could not be loaded.
534 optional int32 loading_error_count = 5;
536 repeated PluginStability plugin_stability = 22;
538 optional Stability stability = 8;
540 // Description of a field trial or experiment that the user is currently
542 // All metrics reported in this upload can potentially be influenced by the
545 // The name of the field trial, as a 32-bit identifier.
546 // Currently, the identifier is a hash of the field trial's name.
547 optional fixed32 name_id = 1;
549 // The user's group within the field trial, as a 32-bit identifier.
550 // Currently, the identifier is a hash of the group's name.
551 optional fixed32 group_id = 2;
553 repeated FieldTrial field_trial = 9;
555 // Information about the A/V output device(s) (typically just a TV).
556 // However, a configuration may have one or more intermediate A/V devices
557 // between the source device and the TV (e.g. an A/V receiver, video
559 message ExternalAudioVideoDevice {
560 // The manufacturer name (possibly encoded as a 3-letter code, e.g. "YMH"
562 optional string manufacturer_name = 1;
564 // The model name (e.g. "RX-V1900"). Some devices may report generic names
565 // like "receiver" or use the full manufacturer name (e.g "PHILIPS").
566 optional string model_name = 2;
568 // The product code (e.g. "0218").
569 optional string product_code = 3;
571 // The device types. A single device can have multiple types (e.g. a set-top
572 // box could be both a tuner and a player). The same type may even be
573 // repeated (e.g a device that reports two tuners).
575 AV_DEVICE_TYPE_UNKNOWN = 0;
576 AV_DEVICE_TYPE_TV = 1;
577 AV_DEVICE_TYPE_RECORDER = 2;
578 AV_DEVICE_TYPE_TUNER = 3;
579 AV_DEVICE_TYPE_PLAYER = 4;
580 AV_DEVICE_TYPE_AUDIO_SYSTEM = 5;
582 repeated AVDeviceType av_device_type = 4;
584 // The year of manufacture.
585 optional int32 manufacture_year = 5;
587 // The week of manufacture.
588 // Note: per the Wikipedia EDID article, numbering for this field may not
589 // be consistent between manufacturers.
590 optional int32 manufacture_week = 6;
592 // Max horizontal resolution in pixels.
593 optional int32 horizontal_resolution = 7;
595 // Max vertical resolution in pixels.
596 optional int32 vertical_resolution = 8;
598 // Audio capabilities of the device.
599 // Ref: http://en.wikipedia.org/wiki/Extended_display_identification_data
600 message AudioDescription {
603 AUDIO_FORMAT_UNKNOWN = 0;
604 AUDIO_FORMAT_LPCM = 1;
605 AUDIO_FORMAT_AC_3 = 2;
606 AUDIO_FORMAT_MPEG1 = 3;
607 AUDIO_FORMAT_MP3 = 4;
608 AUDIO_FORMAT_MPEG2 = 5;
609 AUDIO_FORMAT_AAC = 6;
610 AUDIO_FORMAT_DTS = 7;
611 AUDIO_FORMAT_ATRAC = 8;
612 AUDIO_FORMAT_ONE_BIT = 9;
613 AUDIO_FORMAT_DD_PLUS = 10;
614 AUDIO_FORMAT_DTS_HD = 11;
615 AUDIO_FORMAT_MLP_DOLBY_TRUEHD = 12;
616 AUDIO_FORMAT_DST_AUDIO = 13;
617 AUDIO_FORMAT_MICROSOFT_WMA_PRO = 14;
619 optional AudioFormat audio_format = 1;
621 // Number of channels (e.g. 1, 2, 8, etc.).
622 optional int32 num_channels = 2;
624 // Supported sample frequencies in Hz (e.g. 32000, 44100, etc.).
625 // Multiple frequencies may be specified.
626 repeated int32 sample_frequency_hz = 3;
628 // Maximum bit rate in bits/s.
629 optional int32 max_bit_rate_per_second = 4;
631 // Bit depth (e.g. 16, 20, 24, etc.).
632 optional int32 bit_depth = 5;
634 repeated AudioDescription audio_description = 9;
636 // The position in AV setup.
637 // A value of 0 means this device is the TV.
638 // A value of 1 means this device is directly connected to one of
640 // Values > 1 indicate there are 1 or more devices between this device
642 optional int32 position_in_setup = 10;
644 // Whether this device is in the path to the TV.
645 optional bool is_in_path_to_tv = 11;
647 // The CEC version the device supports.
648 // CEC stands for Consumer Electronics Control, a part of the HDMI
649 // specification. Not all HDMI devices support CEC.
650 // Only devices that support CEC will report a value here.
651 optional int32 cec_version = 12;
653 // This message reports CEC commands seen by a device.
654 // After each log is sent, this information is cleared and gathered again.
655 // By collecting CEC status information by opcode we can determine
656 // which CEC features can be supported.
658 // The CEC command opcode. CEC supports up to 256 opcodes.
659 // We add only one CECCommand message per unique opcode. Only opcodes
660 // seen by the device will be reported. The remainder of the message
661 // accumulates status for this opcode (and device).
662 optional int32 opcode = 1;
664 // The total number of commands received from the external device.
665 optional int32 num_received_direct = 2;
667 // The number of commands received from the external device as part of a
668 // broadcast message.
669 optional int32 num_received_broadcast = 3;
671 // The total number of commands sent to the external device.
672 optional int32 num_sent_direct = 4;
674 // The number of commands sent to the external device as part of a
675 // broadcast message.
676 optional int32 num_sent_broadcast = 5;
678 // The number of aborted commands for unknown reasons.
679 optional int32 num_aborted_unknown_reason = 6;
681 // The number of aborted commands because of an unrecognized opcode.
682 optional int32 num_aborted_unrecognized = 7;
684 repeated CECCommand cec_command = 13;
686 repeated ExternalAudioVideoDevice external_audio_video_device = 14;
688 // Information about the current wireless access point. Collected directly
689 // from the wireless access point via standard apis if the device is
690 // connected to the Internet wirelessly. Introduced for Chrome on TV devices
691 // but also can be collected by ChromeOS, Android or other clients.
692 message ExternalAccessPoint {
693 // The manufacturer name, for example "ASUSTeK Computer Inc.".
694 optional string manufacturer = 1;
696 // The model name, for example "Wi-Fi Protected Setup Router".
697 optional string model_name = 2;
699 // The model number, for example "RT-N16".
700 optional string model_number = 3;
702 // The device name (sometime same as model_number), for example "RT-N16".
703 optional string device_name = 4;
705 optional ExternalAccessPoint external_access_point = 15;
707 // Number of users currently signed into a multiprofile session.
708 // A zero value indicates that the user count changed while the log is open.
709 // Logged only on ChromeOS.
710 optional uint32 multi_profile_user_count = 17;
712 // Information about extensions that are installed, masked to provide better
713 // privacy. Only extensions from a single profile are reported; this will
714 // generally be the profile used when the browser is started. The profile
715 // reported on will remain consistent at least until the browser is
716 // relaunched (or the profile is deleted by the user).
718 // Each client first picks a value for client_key derived from its UMA
720 // client_key = client_id % 4096
721 // Then, each installed extension is mapped into a hash bucket according to
722 // bucket = CityHash64(StringPrintf("%d:%s",
723 // client_key, extension_id)) % 1024
724 // The client reports the set of hash buckets occupied by all installed
725 // extensions. If multiple extensions map to the same bucket, that bucket is
726 // still only reported once.
727 repeated int32 occupied_extension_bucket = 18;
729 // The state of loaded extensions for this system. The system can have either
730 // no applicable extensions, extensions only from the webstore and verified by
731 // the webstore, extensions only from the webstore but not verified, or
732 // extensions not from the store. If there is a single off-store extension,
733 // then HAS_OFFSTORE is reported. This should be kept in sync with the
734 // corresponding enum in chrome/browser/metrics/extensions_metrics_provider.cc
735 enum ExtensionsState {
737 NO_OFFSTORE_VERIFIED = 1;
738 NO_OFFSTORE_UNVERIFIED = 2;
741 optional ExtensionsState offstore_extensions_state = 19;