summaryrefslogtreecommitdiff
path: root/chromium/tools
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2019-07-31 15:50:41 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2019-08-30 12:35:23 +0000
commit7b2ffa587235a47d4094787d72f38102089f402a (patch)
tree30e82af9cbab08a7fa028bb18f4f2987a3f74dfa /chromium/tools
parentd94af01c90575348c4e81a418257f254b6f8d225 (diff)
downloadqtwebengine-chromium-7b2ffa587235a47d4094787d72f38102089f402a.tar.gz
BASELINE: Update Chromium to 76.0.3809.94
Change-Id: I321c3f5f929c105aec0f98c5091ef6108822e647 Reviewed-by: Michael Brüning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/tools')
-rw-r--r--chromium/tools/OWNERS2
-rw-r--r--chromium/tools/android/asan/third_party/BUILD.gn31
-rw-r--r--chromium/tools/android/errorprone_plugin/BUILD.gn4
-rw-r--r--chromium/tools/binary_size/.style.yapf6
-rw-r--r--chromium/tools/binary_size/BUILD.gn8
-rwxr-xr-xchromium/tools/binary_size/diagnose_bloat.py8
-rwxr-xr-xchromium/tools/binary_size/generate_milestone_reports.py3
-rwxr-xr-xchromium/tools/binary_size/generate_official_build_report.py17
-rw-r--r--chromium/tools/binary_size/libsupersize/archive.py27
-rw-r--r--chromium/tools/binary_size/libsupersize/console.py68
-rw-r--r--chromium/tools/binary_size/libsupersize/demangle.py8
-rw-r--r--chromium/tools/binary_size/libsupersize/describe.py18
-rw-r--r--chromium/tools/binary_size/libsupersize/diff.py84
-rwxr-xr-xchromium/tools/binary_size/libsupersize/diff_test.py196
-rwxr-xr-xchromium/tools/binary_size/libsupersize/integration_test.py116
-rwxr-xr-xchromium/tools/binary_size/libsupersize/linker_map_parser.py91
-rwxr-xr-xchromium/tools/binary_size/libsupersize/linker_map_parser_test.py31
-rw-r--r--chromium/tools/binary_size/libsupersize/models.py10
-rw-r--r--chromium/tools/binary_size/libsupersize/static/tree-worker.js41
-rw-r--r--chromium/tools/binary_size/sizes.gni29
-rwxr-xr-xchromium/tools/binary_size/sizes.py477
-rw-r--r--chromium/tools/binary_size/sizes.pydeps9
-rwxr-xr-xchromium/tools/boilerplate.py2
-rw-r--r--chromium/tools/cfi/blacklist.txt6
-rwxr-xr-xchromium/tools/check_grd_for_unused_strings.py2
-rwxr-xr-xchromium/tools/checklicenses/checklicenses.py3
-rw-r--r--chromium/tools/checkteamtags/OWNERS1
-rw-r--r--chromium/tools/checkteamtags/extract_components_test.py8
-rw-r--r--chromium/tools/chrome_proxy/webdriver/bypass.py176
-rw-r--r--chromium/tools/chrome_proxy/webdriver/common.py198
-rw-r--r--chromium/tools/chrome_proxy/webdriver/compression_regression.py389
-rw-r--r--chromium/tools/chrome_proxy/webdriver/data_use.py44
-rw-r--r--chromium/tools/chrome_proxy/webdriver/fallback.py47
-rw-r--r--chromium/tools/chrome_proxy/webdriver/https_previews.py112
-rw-r--r--chromium/tools/chrome_proxy/webdriver/lite_page.py238
-rw-r--r--chromium/tools/chrome_proxy/webdriver/lofi.py502
-rw-r--r--chromium/tools/chrome_proxy/webdriver/proxy_connection.py45
-rw-r--r--chromium/tools/chrome_proxy/webdriver/quic.py4
-rw-r--r--chromium/tools/chrome_proxy/webdriver/safebrowsing.py14
-rw-r--r--chromium/tools/chrome_proxy/webdriver/smoke.py35
-rw-r--r--chromium/tools/chrome_proxy/webdriver/variations_combinations.py3
-rw-r--r--chromium/tools/chrome_proxy/webdriver/video.py26
-rw-r--r--chromium/tools/clang/blink_gc_plugin/CheckFieldsVisitor.cpp3
-rw-r--r--chromium/tools/clang/blink_gc_plugin/CheckTraceVisitor.cpp12
-rw-r--r--chromium/tools/clang/blink_gc_plugin/Config.h4
-rw-r--r--chromium/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp4
-rw-r--r--chromium/tools/clang/blink_gc_plugin/Edge.h7
-rw-r--r--chromium/tools/clang/blink_gc_plugin/RecordInfo.cpp7
-rwxr-xr-xchromium/tools/clang/scripts/build.py841
-rwxr-xr-xchromium/tools/clang/scripts/download_lld_mac.py4
-rwxr-xr-xchromium/tools/clang/scripts/package.py335
-rwxr-xr-xchromium/tools/clang/scripts/update.py972
-rwxr-xr-xchromium/tools/clang/scripts/upload_revision.py48
-rw-r--r--chromium/tools/clang/traffic_annotation_extractor/README.md6
-rw-r--r--chromium/tools/clang/translation_unit/TranslationUnitGenerator.cpp10
-rwxr-xr-xchromium/tools/code_coverage/coverage.py6
-rw-r--r--chromium/tools/code_coverage/html_templates/table.html65
-rwxr-xr-xchromium/tools/code_coverage/run_fuzz_target.py14
-rwxr-xr-xchromium/tools/code_coverage/update_clang_coverage_tools.py28
-rw-r--r--chromium/tools/cros/bootstrap_deps2
-rw-r--r--chromium/tools/cygprofile/cluster.py151
-rwxr-xr-xchromium/tools/cygprofile/cluster_unittest.py233
-rwxr-xr-xchromium/tools/cygprofile/orderfile_generator_backend.py208
-rwxr-xr-xchromium/tools/cygprofile/process_profiles.py80
-rw-r--r--chromium/tools/cygprofile/test_utils.py3
-rwxr-xr-xchromium/tools/fuchsia/local-sdk.py44
-rw-r--r--chromium/tools/gdb/gdb_chrome.py76
-rw-r--r--chromium/tools/gdb/gdbinit20
-rw-r--r--chromium/tools/grit/BUILD.gn11
-rw-r--r--chromium/tools/grit/grit/extern/FP.py8
-rw-r--r--chromium/tools/grit/grit/extern/tclib.py26
-rw-r--r--chromium/tools/grit/grit/format/js_map_format.py43
-rwxr-xr-xchromium/tools/grit/grit/format/js_map_format_unittest.py92
-rwxr-xr-xchromium/tools/grit/grit/format/policy_templates_json_unittest.py51
-rw-r--r--chromium/tools/grit/grit/format/resource_map.py48
-rwxr-xr-xchromium/tools/grit/grit/format/resource_map_unittest.py63
-rw-r--r--chromium/tools/grit/grit/gather/chrome_scaled_image.py3
-rwxr-xr-xchromium/tools/grit/grit/gather/chrome_scaled_image_unittest.py19
-rw-r--r--chromium/tools/grit/grit/gather/policy_json.py33
-rwxr-xr-xchromium/tools/grit/grit/gather/policy_json_unittest.py79
-rw-r--r--chromium/tools/grit/grit/node/include.py7
-rwxr-xr-xchromium/tools/grit/grit/node/include_unittest.py6
-rwxr-xr-xchromium/tools/grit/grit/node/misc_unittest.py16
-rw-r--r--chromium/tools/grit/grit/tclib.py6
-rwxr-xr-xchromium/tools/grit/grit/test_suite_all.py34
-rw-r--r--chromium/tools/grit/grit/tool/build.py15
-rw-r--r--chromium/tools/grit/grit/util.py2
-rw-r--r--chromium/tools/grit/grit_rule.gni5
-rwxr-xr-xchromium/tools/grit/pak_util.py7
-rw-r--r--chromium/tools/gritsettings/resource_ids47
-rw-r--r--chromium/tools/gritsettings/translation_expectations.pyl12
-rwxr-xr-xchromium/tools/gypv8sh.py6
-rw-r--r--chromium/tools/ipc_fuzzer/fuzzer/BUILD.gn1
-rw-r--r--chromium/tools/ipc_fuzzer/message_lib/BUILD.gn2
-rw-r--r--chromium/tools/json_schema_compiler/feature_compiler.py1
-rw-r--r--chromium/tools/json_schema_compiler/json_schema_api.gni14
-rwxr-xr-xchromium/tools/licenses.py9
-rwxr-xr-xchromium/tools/linux/dump-static-initializers.py51
-rwxr-xr-xchromium/tools/mb/mb.py25
-rw-r--r--chromium/tools/mb/mb_config.pyl399
-rw-r--r--chromium/tools/metrics/BUILD.gn2
-rw-r--r--chromium/tools/metrics/actions/actions.xml452
-rwxr-xr-xchromium/tools/metrics/actions/extract_actions.py47
-rw-r--r--chromium/tools/metrics/histograms/OWNERS1
-rw-r--r--chromium/tools/metrics/histograms/README.md119
-rw-r--r--chromium/tools/metrics/histograms/enums.xml2094
-rw-r--r--chromium/tools/metrics/histograms/extract_histograms.py22
-rw-r--r--chromium/tools/metrics/histograms/extract_histograms_test.py25
-rw-r--r--chromium/tools/metrics/histograms/histograms.xml5983
-rwxr-xr-xchromium/tools/metrics/histograms/pretty_print.py1
-rw-r--r--chromium/tools/metrics/histograms/update_policies.py49
-rw-r--r--chromium/tools/metrics/ukm/PRESUBMIT.py2
-rw-r--r--chromium/tools/metrics/ukm/ukm.xml414
-rw-r--r--chromium/tools/metrics/ukm/ukm_model.py1
-rwxr-xr-xchromium/tools/metrics/ukm/validate_format.py22
-rw-r--r--chromium/tools/metrics/ukm/xml_validations.py33
-rw-r--r--chromium/tools/metrics/ukm/xml_validations_test.py25
-rw-r--r--chromium/tools/perf/BUILD.gn6
-rw-r--r--chromium/tools/perf/chrome_telemetry_build/BUILD.gn2
-rw-r--r--chromium/tools/perf/contrib/vr_benchmarks/BUILD.gn2
-rwxr-xr-xchromium/tools/polymer/polymer_grdp_to_txt.py22
-rwxr-xr-xchromium/tools/polymer/txt_to_polymer_grdp.py76
-rw-r--r--chromium/tools/resources/OWNERS4
-rw-r--r--chromium/tools/resources/PRESUBMIT.py23
-rw-r--r--chromium/tools/resources/__init__.py0
-rwxr-xr-xchromium/tools/resources/svgo.py26
-rw-r--r--chromium/tools/resources/svgo_presubmit.py26
-rwxr-xr-xchromium/tools/resources/svgo_presubmit_test.py55
-rw-r--r--chromium/tools/traffic_annotation/bin/README.md8
-rw-r--r--chromium/tools/traffic_annotation/bin/linux64/traffic_annotation_extractor.sha12
-rw-r--r--chromium/tools/traffic_annotation/bin/win32/traffic_annotation_extractor.exe.sha12
-rw-r--r--chromium/tools/traffic_annotation/summary/annotations.xml9
-rw-r--r--chromium/tools/translation/helper/translation_helper.py37
-rw-r--r--chromium/tools/translation/helper/translation_helper_unittest.py25
-rwxr-xr-xchromium/tools/translation/upload_screenshots.py5
-rw-r--r--chromium/tools/v8_context_snapshot/BUILD.gn2
-rw-r--r--chromium/tools/v8_context_snapshot/v8_context_snapshot_generator.cc6
-rwxr-xr-xchromium/tools/variations/fieldtrial_to_struct.py23
-rw-r--r--chromium/tools/variations/fieldtrial_to_struct_unittest.py85
-rw-r--r--chromium/tools/variations/unittest_data/expected_output.cc55
-rw-r--r--chromium/tools/variations/unittest_data/expected_output.h7
-rw-r--r--chromium/tools/variations/unittest_data/test_config.json11
-rw-r--r--chromium/tools/vscode/settings.json53
-rw-r--r--chromium/tools/vscode/tasks.json5154
-rw-r--r--chromium/tools/wayland_aux/Makefile31
-rw-r--r--chromium/tools/wayland_aux/OWNERS2
-rw-r--r--chromium/tools/wayland_aux/gv_diagram.py220
-rw-r--r--chromium/tools/wayland_aux/main.py67
-rw-r--r--chromium/tools/wayland_aux/proto_gen.py121
-rw-r--r--chromium/tools/wayland_aux/protocol_util.py124
-rw-r--r--chromium/tools/web_dev_style/html_checker.py2
-rwxr-xr-xchromium/tools/web_dev_style/html_checker_test.py1
-rw-r--r--chromium/tools/win/DebugVisualizers/BUILD.gn4
-rw-r--r--chromium/tools/win/DebugVisualizers/chrome.natvis5
-rw-r--r--chromium/tools/win/DebugVisualizers/libc++.natvis148
-rw-r--r--chromium/tools/win/DebugVisualizers/webkit.natvis28
-rw-r--r--chromium/tools/win/pe_summarize.py70
157 files changed, 13961 insertions, 4293 deletions
diff --git a/chromium/tools/OWNERS b/chromium/tools/OWNERS
index 4f3ab753e73..979662157d4 100644
--- a/chromium/tools/OWNERS
+++ b/chromium/tools/OWNERS
@@ -30,7 +30,7 @@ per-file check_grd_for_unused_strings.py=estade@chromium.org
per-file gyp-explain.py=thakis@chromium.org
-per-file gypv8shy.py=jochen@chromium.org
+per-file gypv8sh.py=jochen@chromium.org
per-file include_tracer.py=thakis@chromium.org
diff --git a/chromium/tools/android/asan/third_party/BUILD.gn b/chromium/tools/android/asan/third_party/BUILD.gn
index ecb998bb7bb..7c18f14d275 100644
--- a/chromium/tools/android/asan/third_party/BUILD.gn
+++ b/chromium/tools/android/asan/third_party/BUILD.gn
@@ -7,35 +7,48 @@ import("//build/config/clang/clang.gni")
import("//build/util/generate_wrapper.gni")
generate_wrapper("asan_device_setup") {
+ testonly = true
executable = "with_asan.py"
wrapper_script = "$root_out_dir/bin/run_with_asan"
- if (target_cpu == "arm") {
- _lib_arch = "arm"
- } else if (target_cpu == "arm64") {
- _lib_arch = "aarch64"
+ _lib_archs = []
+
+ if (target_cpu == "arm" || target_cpu == "arm64") {
+ _lib_archs += [
+ "arm",
+ "aarch64",
+ ]
} else if (target_cpu == "x86") {
- _lib_arch = "i686"
+ _lib_archs += [ "i686" ]
} else {
assert(false, "No ASAN library available for $target_cpu")
}
_adb_path = "${android_sdk_root}/platform-tools/adb"
- _lib_path = "${clang_base_path}/lib/clang/${clang_version}/lib/linux/libclang_rt.asan-${_lib_arch}-android.so"
+ _lib_dir = "${clang_base_path}/lib/clang/${clang_version}/lib/linux"
+ _lib_paths = []
+ foreach(_lib_arch, _lib_archs) {
+ _lib_paths += [ "${_lib_dir}/libclang_rt.asan-${_lib_arch}-android.so" ]
+ }
data = [
"asan_device_setup.sh",
"with_asan.py",
_adb_path,
- _lib_path,
+ ]
+ data += _lib_paths
+
+ data_deps = [
+ "//build/android:devil_chromium_py",
+ "//third_party/catapult/devil",
]
- _rebased_lib_path = rebase_path(_lib_path, root_build_dir)
_rebased_adb_path = rebase_path(_adb_path, root_build_dir)
+ _rebased_lib_dir_path = rebase_path(_lib_dir, root_build_dir)
executable_args = [
"--adb",
"@WrappedPath(${_rebased_adb_path})",
"--lib",
- "@WrappedPath(${_rebased_lib_path})",
+ "@WrappedPath(${_rebased_lib_dir_path})",
]
}
diff --git a/chromium/tools/android/errorprone_plugin/BUILD.gn b/chromium/tools/android/errorprone_plugin/BUILD.gn
index e61b0c4ed34..2df14764b23 100644
--- a/chromium/tools/android/errorprone_plugin/BUILD.gn
+++ b/chromium/tools/android/errorprone_plugin/BUILD.gn
@@ -19,8 +19,8 @@ java_library("errorprone_plugin_java") {
enable_errorprone = false
enable_bytecode_rewriter = false
- # So that we don't need to inject emma runtime into the compiler's classpath.
- emma_never_instrument = true
+ # So that we don't need to inject jacoco runtime into the compiler's classpath.
+ jacoco_never_instrument = true
annotation_processor_deps = [ "//third_party/auto:auto_service_processor" ]
deps = [
diff --git a/chromium/tools/binary_size/.style.yapf b/chromium/tools/binary_size/.style.yapf
new file mode 100644
index 00000000000..ef24bfc6b1a
--- /dev/null
+++ b/chromium/tools/binary_size/.style.yapf
@@ -0,0 +1,6 @@
+[style]
+based_on_style = pep8
+column_limit = 80
+blank_line_before_nested_class_or_def = true
+blank_line_before_module_docstring = true
+indent_width = 2
diff --git a/chromium/tools/binary_size/BUILD.gn b/chromium/tools/binary_size/BUILD.gn
index ce623d0521f..538fcd5918c 100644
--- a/chromium/tools/binary_size/BUILD.gn
+++ b/chromium/tools/binary_size/BUILD.gn
@@ -14,3 +14,11 @@ python_library("binary_size_trybot_py") {
"//build/android/resource_sizes.py",
]
}
+
+python_library("sizes_py") {
+ testonly = true
+ pydeps_file = "sizes.pydeps"
+ data_deps = [
+ "//third_party/catapult/tracing:convert_chart_json",
+ ]
+}
diff --git a/chromium/tools/binary_size/diagnose_bloat.py b/chromium/tools/binary_size/diagnose_bloat.py
index ae850c1f809..77270390c0c 100755
--- a/chromium/tools/binary_size/diagnose_bloat.py
+++ b/chromium/tools/binary_size/diagnose_bloat.py
@@ -264,10 +264,13 @@ class _BuildHelper(object):
@property
def main_lib_path(self):
# Cannot extract this from GN because --cloud needs to work without GN.
+ # TODO(agrieve): Could maybe extract from .apk?
if self.IsLinux():
return 'chrome'
- if 'monochrome' in self.target:
+ if 'monochrome' in self.target or 'trichrome' in self.target:
ret = 'lib.unstripped/libmonochrome_base.so'
+ elif 'webview' in self.target:
+ ret = 'lib.unstripped/libwebviewchromium.so'
else:
ret = 'lib.unstripped/libchrome_base.so'
# Maintain support for measuring non-bundle apks.
@@ -336,6 +339,8 @@ class _BuildHelper(object):
def _GenGnCmd(self):
gn_args = 'is_official_build=true'
+ gn_args += ' android_channel="stable"'
+ gn_args += ' enable_chrome_language_splits=true'
# Variables often become unused when experimenting with macros to reduce
# size, so don't fail on warnings.
gn_args += ' treat_warnings_as_errors=false'
@@ -1064,4 +1069,3 @@ def main():
if __name__ == '__main__':
sys.exit(main())
-
diff --git a/chromium/tools/binary_size/generate_milestone_reports.py b/chromium/tools/binary_size/generate_milestone_reports.py
index f0c66d49e20..343701ee77c 100755
--- a/chromium/tools/binary_size/generate_milestone_reports.py
+++ b/chromium/tools/binary_size/generate_milestone_reports.py
@@ -59,7 +59,8 @@ _DESIRED_VERSIONS = [
'71.0.3578.99',
'72.0.3626.105',
'73.0.3683.75',
- '74.0.3729.11', # Beta
+ '74.0.3729.112',
+ '75.0.3770.12', # Beta
]
diff --git a/chromium/tools/binary_size/generate_official_build_report.py b/chromium/tools/binary_size/generate_official_build_report.py
index 4fe245f63af..44649c40e42 100755
--- a/chromium/tools/binary_size/generate_official_build_report.py
+++ b/chromium/tools/binary_size/generate_official_build_report.py
@@ -85,15 +85,19 @@ def _WriteReportsJson(out):
def _UploadReports(reports_json_path, base_url, *ndjson_paths):
for path in ndjson_paths:
dst = os.path.join(base_url, os.path.basename(path))
- subprocess.check_call(['gsutil.py', 'cp', '-a', 'public-read', path, dst])
+ cmd = ['gsutil.py', 'cp', '-a', 'public-read', path, dst]
+ logging.warning(' '.join(cmd))
+ subprocess.check_call(cmd)
with open(reports_json_path, 'w') as f:
_WriteReportsJson(f)
- subprocess.check_call([
+ cmd = [
'gsutil.py', 'cp', '-a', 'public-read', reports_json_path,
_REPORTS_JSON_GS_URL
- ])
+ ]
+ logging.warning(' '.join(cmd))
+ subprocess.check_call(cmd)
def main():
@@ -134,9 +138,10 @@ def main():
diff_report_path = os.path.join(
tmp_dir, 'report_{}_{}.ndjson'.format(ref_version, args.version))
reports_json_path = os.path.join(tmp_dir, 'reports.json')
- reports_base_url = os.path.join(
- _REPORTS_GS_URL, args.arch,
- os.path.splitext(os.path.basename(args.size_path))[0])
+ report_basename = os.path.splitext(os.path.basename(args.size_path))[0]
+ # Maintain name through transition to bundles.
+ report_basename = report_basename.replace('.minimal.apks', '.apk')
+ reports_base_url = os.path.join(_REPORTS_GS_URL, args.arch, report_basename)
_FetchSizeFileForVersion(args.gs_size_url, ref_version, args.gs_size_path,
ref_size_path)
diff --git a/chromium/tools/binary_size/libsupersize/archive.py b/chromium/tools/binary_size/libsupersize/archive.py
index ee54015190a..96d2fc0e9dd 100644
--- a/chromium/tools/binary_size/libsupersize/archive.py
+++ b/chromium/tools/binary_size/libsupersize/archive.py
@@ -359,6 +359,13 @@ def _AssignNmAliasPathsAndCreatePathAliases(raw_symbols, object_paths_by_name):
for symbol in raw_symbols:
ret.append(symbol)
full_name = symbol.full_name
+ # '__typeid_' symbols appear in linker .map only, and not nm output.
+ if full_name.startswith('__typeid_'):
+ if object_paths_by_name.get(full_name):
+ logging.warning('Found unexpected __typeid_ symbol in nm output: %s',
+ full_name)
+ continue
+
# Don't skip if symbol.IsBss(). This is needed for LLD-LTO to work, since
# .bss object_path data are unavailable for linker_map_parser, and need to
# be extracted here. For regular LLD flow, incorrect aliased symbols can
@@ -526,17 +533,6 @@ def _CalculatePadding(raw_symbols):
'Found duplicate symbols:\n%r\n%r' % (prev_symbol, symbol))
padding = symbol.address - prev_symbol.end_address
- # These thresholds were found by experimenting with arm32 Chrome.
- # E.g.: Set them to 0 and see what warnings get logged, then take max value.
- # TODO(agrieve): See if these thresholds make sense for architectures
- # other than arm32.
- if (not symbol.full_name.startswith('*') and
- not symbol.IsStringLiteral() and (
- symbol.section in 'rd' and padding >= 256 or
- symbol.section in 't' and padding >= 64)):
- # Should not happen.
- logging.warning('Large padding of %d between:\n A) %r\n B) %r' % (
- padding, prev_symbol, symbol))
symbol.padding = padding
symbol.size += padding
assert symbol.size >= 0, (
@@ -651,12 +647,15 @@ def _AddNmAliases(raw_symbols, names_by_address):
# Don't alias padding-only symbols (e.g. ** symbol gap)
if s.size_without_padding == 0:
continue
+ # Also skip artificial symbols that won't appear in nm output.
+ if s.full_name.startswith('** CFI jump table'):
+ continue
name_list = names_by_address.get(s.address)
if name_list:
if s.full_name not in name_list:
missing_names[s.full_name].append(s.address)
- logging.warning('Name missing from aliases: %s %s', s.full_name,
- name_list)
+ logging.warning('Name missing from aliases: %08x %s %s', s.address,
+ s.full_name, name_list)
continue
replacements.append((i, name_list))
num_new_symbols += len(name_list) - 1
@@ -1539,7 +1538,9 @@ def _DeduceMainPaths(args, parser, extracted_minimal_apk_path=None):
aab_or_apk = args.apk_file or args.minimal_apks_file
mapping_path = args.mapping_file
if aab_or_apk:
+ # Allow either .minimal.apks or just .apks.
aab_or_apk = aab_or_apk.replace('.minimal.apks', '.aab')
+ aab_or_apk = aab_or_apk.replace('.apks', '.aab')
if not mapping_path:
mapping_path = aab_or_apk + '.mapping'
logging.debug('Detected --mapping-file=%s', mapping_path)
diff --git a/chromium/tools/binary_size/libsupersize/console.py b/chromium/tools/binary_size/libsupersize/console.py
index 2d4bc765e52..85c30f2c691 100644
--- a/chromium/tools/binary_size/libsupersize/console.py
+++ b/chromium/tools/binary_size/libsupersize/console.py
@@ -85,7 +85,6 @@ class _Session(object):
self._output_directory_finder = output_directory_finder
self._tool_prefix_finder = tool_prefix_finder
self._size_infos = size_infos
- self._disassemble_prefix_len = None
if len(size_infos) == 1:
self._variables['size_info'] = size_infos[0]
@@ -261,26 +260,6 @@ class _Session(object):
'ensure {} is located beside {}, or pass its path explicitly using '
'elf_path=').format(os.path.basename(filename), size_info.size_path)
- def _DetectDisassemblePrefixLen(self, args):
- # Look for a line that looks like:
- # /usr/{snip}/src/out/Release/../../net/quic/core/quic_time.h:100
- output = subprocess.check_output(args)
- for line in output.splitlines():
- if line and line[0] == os.path.sep and line[-1].isdigit():
- release_idx = line.find('Release')
- if release_idx != -1:
- return line.count(os.path.sep, 0, release_idx)
- dot_dot_idx = line.find('..')
- if dot_dot_idx != -1:
- return line.count(os.path.sep, 0, dot_dot_idx) - 1
- out_idx = line.find(os.path.sep + 'out')
- if out_idx != -1:
- return line.count(os.path.sep, 0, out_idx) + 2
- logging.warning('Could not guess source path from found path.')
- return None
- logging.warning('Found no source paths in objdump output.')
- return None
-
def _SizeInfoForSymbol(self, symbol):
for size_info in self._size_infos:
if symbol in size_info.raw_symbols:
@@ -302,32 +281,27 @@ class _Session(object):
'passing .before_symbol or .after_symbol.')
size_info = self._SizeInfoForSymbol(symbol)
tool_prefix = self._ToolPrefixForSymbol(size_info)
- elf_path = self._ElfPathForSymbol(
- size_info, tool_prefix, elf_path)
-
- args = [path_util.GetObjDumpPath(tool_prefix), '--disassemble', '--source',
- '--line-numbers', '--start-address=0x%x' % symbol.address,
- '--stop-address=0x%x' % symbol.end_address, elf_path]
- # llvm-objdump does not support '--demangle' switch.
- if not self._tool_prefix_finder.IsLld():
- args.append('--demangle')
- if self._disassemble_prefix_len is None:
- prefix_len = self._DetectDisassemblePrefixLen(args)
- if prefix_len is not None:
- self._disassemble_prefix_len = prefix_len
-
- if self._disassemble_prefix_len is not None:
- output_directory = self._output_directory_finder.Tentative()
- # Only matters for non-generated paths, so be lenient here.
- if output_directory is None:
- output_directory = os.path.join(path_util.SRC_ROOT, 'out', 'Release')
- if not os.path.exists(output_directory):
- os.makedirs(output_directory)
-
- args += [
- '--prefix-strip', str(self._disassemble_prefix_len),
- '--prefix', os.path.normpath(os.path.relpath(output_directory))
- ]
+ elf_path = self._ElfPathForSymbol(size_info, tool_prefix, elf_path)
+ # Always use Android NDK's objdump because llvm-objdump does not seem to
+ # correctly disassemble.
+ output_directory_finder = self._output_directory_finder
+ if not output_directory_finder.Tentative():
+ output_directory_finder = path_util.OutputDirectoryFinder(
+ any_path_within_output_directory=elf_path)
+ tool_prefix = path_util.ToolPrefixFinder(
+ output_directory_finder=output_directory_finder,
+ linker_name='ld').Finalized()
+
+ args = [
+ path_util.GetObjDumpPath(tool_prefix),
+ '--disassemble',
+ '--source',
+ '--line-numbers',
+ '--demangle',
+ '--start-address=0x%x' % symbol.address,
+ '--stop-address=0x%x' % symbol.end_address,
+ elf_path,
+ ]
proc = subprocess.Popen(args, stdout=subprocess.PIPE)
lines = itertools.chain(('Showing disassembly for %r' % symbol,
diff --git a/chromium/tools/binary_size/libsupersize/demangle.py b/chromium/tools/binary_size/libsupersize/demangle.py
index e15574884d9..9e8b6700236 100644
--- a/chromium/tools/binary_size/libsupersize/demangle.py
+++ b/chromium/tools/binary_size/libsupersize/demangle.py
@@ -50,9 +50,11 @@ def _ExtractDemanglablePart(names):
if pos > 0:
name = name[pos:]
- # Some mangled symbols end with '$' followed by 32 lower-case hex digits.
- # These interfere with demangling by c++filt. This function is an adaptor
- # for iterable |name| to detect and strip these hash suffixes.
+ # Some mangled symbols end with '$' followed by 32 lower-case hex digits,
+ # and possibly '.cfi'. These interfere with demangling by c++filt, and
+ # should be stripped.
+ if name.endswith('.cfi'):
+ name = name[:-4]
if len(name) > 33 and name[-33] == '$' and _IsLowerHex(name[-32:]):
yield name[:-33]
else:
diff --git a/chromium/tools/binary_size/libsupersize/describe.py b/chromium/tools/binary_size/libsupersize/describe.py
index d6796d5d4d3..166d6b83ba5 100644
--- a/chromium/tools/binary_size/libsupersize/describe.py
+++ b/chromium/tools/binary_size/libsupersize/describe.py
@@ -589,6 +589,24 @@ def DescribeSizeInfoCoverage(size_info):
if len(syms):
yield '* {} symbols are {}. {}'.format(len(syms), desc, size_msg(syms))
+ # These thresholds were found by experimenting with arm32 Chrome.
+ # E.g.: Set them to 0 and see what warnings get logged, then take max value.
+ spam_counter = 0
+ for i in xrange(len(in_section) - 1):
+ sym = in_section[i + 1]
+ if (not sym.full_name.startswith('*')
+ and not sym.source_path.endswith('.S') # Assembly symbol are iffy.
+ and not sym.IsStringLiteral()
+ and ((sym.section in 'rd' and sym.padding >= 256) or
+ (sym.section in 't' and sym.padding >= 64))):
+ # TODO(crbug.com/959906): We should synthesize symbols for these gaps
+ # rather than attribute them as padding.
+ spam_counter += 1
+ if spam_counter <= 5:
+ yield 'Large padding of {} between:'.format(sym.padding)
+ yield ' A) ' + repr(in_section[i])
+ yield ' B) ' + repr(sym)
+
class DescriberCsv(Describer):
def __init__(self, verbose=False):
diff --git a/chromium/tools/binary_size/libsupersize/diff.py b/chromium/tools/binary_size/libsupersize/diff.py
index 9cf6e2a3708..c84791f79da 100644
--- a/chromium/tools/binary_size/libsupersize/diff.py
+++ b/chromium/tools/binary_size/libsupersize/diff.py
@@ -14,50 +14,45 @@ _STRIP_NUMBER_SUFFIX_PATTERN = re.compile(r'[.0-9]+$')
_NORMALIZE_STAR_SYMBOLS_PATTERN = re.compile(r'\s+\d+( \(.*\))?$')
-def _ExactMatchKey(s):
+# Matches symbols that are unchanged (will generally be the majority).
+# Matching by size is important for string literals, which all have the same
+# name, but which one addition would shift their order.
+def _Key1(s):
# Remove numbers and periods for symbols defined by macros that use __line__
# in names, or for linker symbols like ".L.ref.tmp.2".
+ # TODO(agrieve): Should this strip numbers only when periods are present?
name = _STRIP_NUMBER_SUFFIX_PATTERN.sub('', s.full_name)
+ # Prefer source_path over object_path since object_path for native files have
+ # the target_name in it (which can get renamed).
+ path = s.source_path or s.object_path
# Use section rather than section_name since clang & gcc use
# .data.rel.ro vs. .data.rel.ro.local.
- return s.section, name, s.object_path, s.size_without_padding
-
-
-def _GoodMatchKey(symbol):
- """Returns a tuple that can be used to see if two Symbol are the same.
-
- Keys are not guaranteed to be unique within a SymbolGroup. When multiple
- symbols have the same key, they will be matched up in order of appearance.
- We do this because the numbering of these generated symbols is not stable.
-
- Examples of symbols with shared keys:
- "** merge strings"
- "** symbol gap 3", "** symbol gap 5 (end of section)"
- "foo() [clone ##]"
- "CSWTCH.61", "CSWTCH.62"
- ".L.ref.tmp.2", ".L.ref.tmp"
- "._468", "._467"
- ".L__unnamed_1193", ".L__unnamed_712"
- """
- if symbol.IsPak():
- # full_name looks like "about_ui_resources.grdp: IDR_ABOUT_UI_CREDITS_HTML".
- # name is just "IDR_ABOUT_UI_CREDITS_HTML".
- name = symbol.name
- else:
- name = _STRIP_NUMBER_SUFFIX_PATTERN.sub('', symbol.full_name)
- clone_idx = name.find(' [clone ')
- if clone_idx != -1:
- name = name[:clone_idx]
- if name.startswith('*'):
- # "symbol gap 3 (bar)" -> "symbol gaps"
- name = _NORMALIZE_STAR_SYMBOLS_PATTERN.sub('s', name)
-
- return symbol.section, symbol.object_path, name
-
-
-def _PoorMatchKey(symbol):
- section, _, name = _GoodMatchKey(symbol)
- return section, name
+ return s.section, name, path, s.size_without_padding
+
+
+# Same as _Key1, but size can change.
+def _Key2(s):
+ return _Key1(s)[:3]
+
+
+# Same as _Key2, but allow signature changes (uses name rather than full_name).
+def _Key3(s):
+ path = s.source_path or s.object_path
+ name = _STRIP_NUMBER_SUFFIX_PATTERN.sub('', s.name)
+ clone_idx = name.find(' [clone ')
+ if clone_idx != -1:
+ name = name[:clone_idx]
+ if name.startswith('*'):
+ # "* symbol gap 3 (bar)" -> "* symbol gaps"
+ name = _NORMALIZE_STAR_SYMBOLS_PATTERN.sub('s', name)
+ return s.section, name, path
+
+
+# Match on full name, but without path (to account for file moves).
+def _Key4(s):
+ if not s.IsNameUnique():
+ return None
+ return s.section, s.full_name
def _MatchSymbols(before, after, key_func, padding_by_section_name):
@@ -70,7 +65,8 @@ def _MatchSymbols(before, after, key_func, padding_by_section_name):
unmatched_after = []
delta_symbols = []
for after_sym in after:
- before_sym = before_symbols_by_key.get(key_func(after_sym))
+ key = key_func(after_sym)
+ before_sym = key and before_symbols_by_key.get(key)
if before_sym:
before_sym = before_sym.pop(0)
# Padding tracked in aggregate, except for padding-only symbols.
@@ -97,9 +93,9 @@ def _DiffSymbolGroups(before, after):
# Usually >90% of symbols are exact matches, so all of the time is spent in
# this first pass.
- all_deltas, before, after = _MatchSymbols(
- before, after, _ExactMatchKey, padding_by_section_name)
- for key_func in (_GoodMatchKey, _PoorMatchKey):
+ all_deltas, before, after = _MatchSymbols(before, after, _Key1,
+ padding_by_section_name)
+ for key_func in (_Key2, _Key3, _Key4):
delta_syms, before, after = _MatchSymbols(
before, after, key_func, padding_by_section_name)
all_deltas.extend(delta_syms)
@@ -141,6 +137,8 @@ def Diff(before, after, sort=False):
logging.debug('Grouping')
# Group path aliases so that functions defined in headers will be sorted
# by their actual size rather than shown as many small symbols.
+ # Grouping these is nice since adding or remove just one path alias changes
+ # the PSS of all symbols (a lot of noise).
syms = syms.GroupedByAliases(same_name_only=True)
logging.debug('Sorting')
ret.symbols = syms.Sorted()
diff --git a/chromium/tools/binary_size/libsupersize/diff_test.py b/chromium/tools/binary_size/libsupersize/diff_test.py
new file mode 100755
index 00000000000..3213a02d0fb
--- /dev/null
+++ b/chromium/tools/binary_size/libsupersize/diff_test.py
@@ -0,0 +1,196 @@
+#!/usr/bin/env python
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import unittest
+
+import diff
+import models
+
+
+def _MakeSym(section, size, path, name=None):
+ if name is None:
+ # Trailing letter is important since diffing trims numbers.
+ name = '{}_{}A'.format(section[1:], size)
+ return models.Symbol(
+ section,
+ size,
+ full_name=name,
+ template_name=name,
+ name=name,
+ object_path=path)
+
+
+def _SetName(symbol, full_name, name=None):
+ if name is None:
+ name = full_name
+ symbol.full_name = full_name
+ symbol.template_name = full_name
+ symbol.name = name
+
+
+def _CreateSizeInfo(aliases=None):
+ section_sizes = {'.text': 100, '.bss': 40}
+ TEXT = models.SECTION_TEXT
+ symbols = [
+ _MakeSym(TEXT, 10, 'a'),
+ _MakeSym(TEXT, 20, 'a'),
+ _MakeSym(TEXT, 30, 'b'),
+ _MakeSym(TEXT, 40, 'b'),
+ _MakeSym(TEXT, 50, 'b'),
+ _MakeSym(TEXT, 60, ''),
+ ]
+ if aliases:
+ for tup in aliases:
+ syms = symbols[tup[0]:tup[1]]
+ for sym in syms:
+ sym.aliases = syms
+ return models.SizeInfo(section_sizes, symbols)
+
+
+class DiffTest(unittest.TestCase):
+
+ def testIdentity(self):
+ size_info1 = _CreateSizeInfo()
+ size_info2 = _CreateSizeInfo()
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 0, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+ self.assertEquals(0, d.raw_symbols.padding)
+
+ def testSimple_Add(self):
+ size_info1 = _CreateSizeInfo()
+ size_info2 = _CreateSizeInfo()
+ size_info1.raw_symbols -= [size_info1.raw_symbols[0]]
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 1, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(10, d.raw_symbols.size)
+ self.assertEquals(0, d.raw_symbols.padding)
+
+ def testSimple_Delete(self):
+ size_info1 = _CreateSizeInfo()
+ size_info2 = _CreateSizeInfo()
+ size_info2.raw_symbols -= [size_info2.raw_symbols[0]]
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 0, 1), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(-10, d.raw_symbols.size)
+ self.assertEquals(0, d.raw_symbols.padding)
+
+ def testSimple_Change(self):
+ size_info1 = _CreateSizeInfo()
+ size_info2 = _CreateSizeInfo()
+ size_info2.raw_symbols[0].size += 11
+ size_info2.raw_symbols[0].padding += 20
+ size_info2.raw_symbols[-1].size += 11
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((2, 1, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(22, d.raw_symbols.size)
+ self.assertEquals(20, d.raw_symbols.padding)
+
+ def testDontMatchAcrossSections(self):
+ size_info1 = _CreateSizeInfo()
+ size_info1.raw_symbols += [
+ _MakeSym(models.SECTION_TEXT, 11, 'asdf', name='Hello'),
+ ]
+ size_info2 = _CreateSizeInfo()
+ size_info2.raw_symbols += [
+ _MakeSym(models.SECTION_RODATA, 11, 'asdf', name='Hello'),
+ ]
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 1, 1), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+ def testAliases_Remove(self):
+ size_info1 = _CreateSizeInfo(aliases=[(0, 3)])
+ size_info2 = _CreateSizeInfo(aliases=[(0, 2)])
+ d = diff.Diff(size_info1, size_info2)
+ # Aliases cause all sizes to change.
+ self.assertEquals((3, 0, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+ def testAliases_Add(self):
+ size_info1 = _CreateSizeInfo(aliases=[(0, 2)])
+ size_info2 = _CreateSizeInfo(aliases=[(0, 3)])
+ d = diff.Diff(size_info1, size_info2)
+ # Aliases cause all sizes to change.
+ self.assertEquals((3, 0, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+ def testAliases_ChangeGroup(self):
+ size_info1 = _CreateSizeInfo(aliases=[(0, 2), (2, 5)])
+ size_info2 = _CreateSizeInfo(aliases=[(0, 3), (3, 5)])
+ d = diff.Diff(size_info1, size_info2)
+ # Aliases cause all sizes to change.
+ self.assertEquals((4, 0, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+ def testStarSymbolNormalization(self):
+ size_info1 = _CreateSizeInfo()
+ _SetName(size_info1.raw_symbols[0], '* symbol gap 1 (end of section)')
+ size_info2 = _CreateSizeInfo()
+ _SetName(size_info2.raw_symbols[0], '* symbol gap 2 (end of section)')
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 0, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+ def testNumberNormalization(self):
+ TEXT = models.SECTION_TEXT
+ size_info1 = _CreateSizeInfo()
+ size_info1.raw_symbols += [
+ _MakeSym(TEXT, 11, 'a', name='.L__unnamed_1193'),
+ _MakeSym(TEXT, 22, 'a', name='.L__unnamed_1194'),
+ ]
+ size_info2 = _CreateSizeInfo()
+ size_info2.raw_symbols += [
+ _MakeSym(TEXT, 11, 'a', name='.L__unnamed_2194'),
+ _MakeSym(TEXT, 22, 'a', name='.L__unnamed_2195'),
+ ]
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 0, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+ def testChangedParams(self):
+ size_info1 = _CreateSizeInfo()
+ size_info1.raw_symbols[0].full_name = 'Foo()'
+ size_info1.raw_symbols[0].name = 'Foo'
+ size_info2 = _CreateSizeInfo()
+ size_info2.raw_symbols[0].full_name = 'Foo(bool)'
+ size_info2.raw_symbols[0].name = 'Foo'
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 0, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+ def testChangedPaths(self):
+ size_info1 = _CreateSizeInfo()
+ size_info2 = _CreateSizeInfo()
+ size_info2.raw_symbols[0].object_path = 'asdf'
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 0, 0), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+ def testChangedPaths_ChangedParams(self):
+ size_info1 = _CreateSizeInfo()
+ size_info1.raw_symbols[0].full_name = 'Foo()'
+ size_info1.raw_symbols[0].name = 'Foo'
+ size_info2 = _CreateSizeInfo()
+ size_info2.raw_symbols[0].full_name = 'Foo(bool)'
+ size_info2.raw_symbols[0].name = 'Foo'
+ size_info2.raw_symbols[0].object_path = 'asdf'
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 1, 1), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+ def testChangedPaths_StringLiterals(self):
+ size_info1 = _CreateSizeInfo()
+ size_info1.raw_symbols[0].full_name = models.STRING_LITERAL_NAME
+ size_info2 = _CreateSizeInfo()
+ size_info2.raw_symbols[0].full_name = models.STRING_LITERAL_NAME
+ size_info2.raw_symbols[0].object_path = 'asdf'
+ d = diff.Diff(size_info1, size_info2)
+ self.assertEquals((0, 1, 1), d.raw_symbols.CountsByDiffStatus()[1:])
+ self.assertEquals(0, d.raw_symbols.size)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/chromium/tools/binary_size/libsupersize/integration_test.py b/chromium/tools/binary_size/libsupersize/integration_test.py
index 65c07929cb6..24c636e31ca 100755
--- a/chromium/tools/binary_size/libsupersize/integration_test.py
+++ b/chromium/tools/binary_size/libsupersize/integration_test.py
@@ -92,13 +92,6 @@ def _RunApp(name, args, debug_measures=False):
return subprocess.check_output(argv, env=env).splitlines()
-def _DiffCounts(sym):
- counts = sym.CountsByDiffStatus()
- return (counts[models.DIFF_STATUS_CHANGED],
- counts[models.DIFF_STATUS_ADDED],
- counts[models.DIFF_STATUS_REMOVED])
-
-
class IntegrationTest(unittest.TestCase):
maxDiff = None # Don't trucate diffs in errors.
cached_size_info = {}
@@ -378,7 +371,7 @@ class IntegrationTest(unittest.TestCase):
d = diff.Diff(size_info1, size_info2)
d.raw_symbols = d.raw_symbols.Sorted()
- self.assertEquals(d.raw_symbols.CountsByDiffStatus()[1:], [2, 2, 3])
+ self.assertEquals(d.raw_symbols.CountsByDiffStatus()[1:], (2, 2, 3))
changed_sym = d.raw_symbols.WhereNameMatches('Patcher::Name_')[0]
padding_sym = d.raw_symbols.WhereNameMatches('symbol gap 0')[0]
bss_sym = d.raw_symbols.WhereInSection(models.SECTION_BSS)[0]
@@ -392,113 +385,6 @@ class IntegrationTest(unittest.TestCase):
return describe.GenerateLines(d, verbose=True)
- def test_Diff_Aliases1(self):
- size_info1 = self._CloneSizeInfo()
- size_info2 = self._CloneSizeInfo()
-
- # Find a list of exact 4 symbols with the same aliases in |size_info2|:
- # text@2a0010: BarAlias()
- # text@2a0010: FooAlias()
- # text@2a0010: blink::ContiguousContainerBase::shrinkToFit() @ path1
- # text@2a0010: blink::ContiguousContainerBase::shrinkToFit() @ path2
- # The blink::...::shrinkToFit() group has another member:
- # text@2a0000: blink::ContiguousContainerBase::shrinkToFit() @ path3
- a1, _, _, _ = (
- size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 4)[0].aliases)
- # Remove FooAlias().
- size_info2.raw_symbols -= [a1]
- a1.aliases.remove(a1)
-
- # From |size_info1| -> |size_info2|: 1 symbol is deleted.
- d = diff.Diff(size_info1, size_info2)
- # Total size should not change.
- self.assertEquals(d.raw_symbols.pss, 0)
- # 1 symbol is erased, and PSS distributed among 3 remaining aliases, and
- # considered as change.
- self.assertEquals((3, 0, 1), _DiffCounts(d.raw_symbols))
- # Grouping combines 2 x blink::ContiguousContainerBase::shrinkToFit(), so
- # now ther are 2 changed aliases.
- self.assertEquals((2, 0, 1), _DiffCounts(d.symbols.GroupedByFullName()))
-
- # From |size_info2| -> |size_info1|: 1 symbol is added.
- d = diff.Diff(size_info2, size_info1)
- self.assertEquals(d.raw_symbols.pss, 0)
- self.assertEquals((3, 1, 0), _DiffCounts(d.raw_symbols))
- self.assertEquals((2, 1, 0), _DiffCounts(d.symbols.GroupedByFullName()))
-
- def test_Diff_Aliases2(self):
- size_info1 = self._CloneSizeInfo()
- size_info2 = self._CloneSizeInfo()
-
- # Same list of 4 symbols as before.
- a1, _, a2, _ = (
- size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 4)[0].aliases)
- # Remove BarAlias() and blink::...::shrinkToFit().
- size_info2.raw_symbols -= [a1, a2]
- a1.aliases.remove(a1)
- a1.aliases.remove(a2)
-
- # From |size_info1| -> |size_info2|: 2 symbols are deleted.
- d = diff.Diff(size_info1, size_info2)
- self.assertEquals(d.raw_symbols.pss, 0)
- self.assertEquals((2, 0, 2), _DiffCounts(d.raw_symbols))
- self.assertEquals((2, 0, 1), _DiffCounts(d.symbols.GroupedByFullName()))
-
- # From |size_info2| -> |size_info1|: 2 symbols are added.
- d = diff.Diff(size_info2, size_info1)
- self.assertEquals(d.raw_symbols.pss, 0)
- self.assertEquals((2, 2, 0), _DiffCounts(d.raw_symbols))
- self.assertEquals((2, 1, 0), _DiffCounts(d.symbols.GroupedByFullName()))
-
- def test_Diff_Aliases4(self):
- size_info1 = self._CloneSizeInfo()
- size_info2 = self._CloneSizeInfo()
-
- # Same list of 4 symbols as before.
- a1, a2, a3, a4 = (
- size_info2.raw_symbols.Filter(lambda s: s.num_aliases == 4)[0].aliases)
-
- # Remove all 4 aliases.
- size_info2.raw_symbols -= [a1, a2, a3, a4]
-
- # From |size_info1| -> |size_info2|: 4 symbols are deleted.
- d = diff.Diff(size_info1, size_info2)
- self.assertEquals(d.raw_symbols.pss, -a1.size)
- self.assertEquals((0, 0, 4), _DiffCounts(d.raw_symbols))
- # When grouped, BarAlias() and FooAlias() are deleted, but the
- # blink::...::shrinkToFit() has 1 remaining symbol, so is changed.
- self.assertEquals((1, 0, 2), _DiffCounts(d.symbols.GroupedByFullName()))
-
- # From |size_info2| -> |size_info1|: 4 symbols are added.
- d = diff.Diff(size_info2, size_info1)
- self.assertEquals(d.raw_symbols.pss, a1.size)
- self.assertEquals((0, 4, 0), _DiffCounts(d.raw_symbols))
- self.assertEquals((1, 2, 0), _DiffCounts(d.symbols.GroupedByFullName()))
-
- def test_Diff_Clustering(self):
- size_info1 = self._CloneSizeInfo()
- size_info2 = self._CloneSizeInfo()
- S = models.SECTION_TEXT
- size_info1.symbols += [
- models.Symbol(S, 11, name='.L__unnamed_1193', object_path='a'), # 1
- models.Symbol(S, 22, name='.L__unnamed_1194', object_path='a'), # 2
- models.Symbol(S, 33, name='.L__unnamed_1195', object_path='b'), # 3
- models.Symbol(S, 44, name='.L__bar_195', object_path='b'), # 4
- models.Symbol(S, 55, name='.L__bar_1195', object_path='b'), # 5
- ]
- size_info2.symbols += [
- models.Symbol(S, 33, name='.L__unnamed_2195', object_path='b'), # 3
- models.Symbol(S, 11, name='.L__unnamed_2194', object_path='a'), # 1
- models.Symbol(S, 22, name='.L__unnamed_2193', object_path='a'), # 2
- models.Symbol(S, 44, name='.L__bar_2195', object_path='b'), # 4
- models.Symbol(S, 55, name='.L__bar_295', object_path='b'), # 5
- ]
- d = diff.Diff(size_info1, size_info2)
- d.symbols = d.symbols.Sorted()
- self.assertEquals(d.symbols.CountsByDiffStatus()[models.DIFF_STATUS_ADDED],
- 0)
- self.assertEquals(d.symbols.size, 0)
-
@_CompareWithGolden()
def test_FullDescription(self):
size_info = self._CloneSizeInfo()
diff --git a/chromium/tools/binary_size/libsupersize/linker_map_parser.py b/chromium/tools/binary_size/libsupersize/linker_map_parser.py
index 14488be612e..a6267d250a5 100755
--- a/chromium/tools/binary_size/libsupersize/linker_map_parser.py
+++ b/chromium/tools/binary_size/libsupersize/linker_map_parser.py
@@ -73,6 +73,8 @@ def _NormalizeName(name):
return '** outlined function'
if name.startswith('.L.str'):
return models.STRING_LITERAL_NAME
+ if name.endswith(' (.cfi)'):
+ return name[:-7]
return name
@@ -483,6 +485,11 @@ class MapFileParserLld(object):
thin_map = {}
tokenizer = self.Tokenize(lines)
+
+ in_jump_table = False
+ jump_tables_count = 0
+ jump_entries_count = 0
+
for (line, address, size, level, span, tok) in tokenizer:
# Level 1 data match the "Out" column. They specify sections or
# PROVIDE_HIDDEN lines.
@@ -504,28 +511,37 @@ class MapFileParserLld(object):
if level == 2:
# E.g., 'path.o:(.text._name)' => ['path.o', '(.text._name)'].
cur_obj, paren_value = tok.split(':')
- # E.g., '(.text.unlikely._name)' -> '_name'.
- mangled_name = paren_value[mangled_start_idx:-1]
- cur_flags = _FlagsFromMangledName(mangled_name)
- is_partial = True
- # As of 2017/11 LLD does not distinguish merged strings from other
- # merged data. Feature request is filed under:
- # https://bugs.llvm.org/show_bug.cgi?id=35248
- if cur_obj == '<internal>':
- if cur_section == '.rodata' and mangled_name == '':
- # Treat all <internal> sections within .rodata as as string
- # literals. Some may hold numeric constants or other data, but
- # there is currently no way to distinguish them.
- mangled_name = '** lld merge strings'
- else:
- # e.g. <internal>:(.text.thunk)
- mangled_name = '** ' + mangled_name
- is_partial = False
- cur_obj = None
- elif cur_obj == 'lto.tmp' or 'thinlto-cache' in cur_obj:
- thin_map[address] = os.path.basename(cur_obj)
- cur_obj = None
+ in_jump_table = '.L.cfi.jumptable' in paren_value
+ if in_jump_table:
+ # Store each CFI jump table as a Level 2 symbol, whose Level 3
+ # details are discarded.
+ jump_tables_count += 1
+ cur_obj = '' # Replaces 'lto.tmp' to prevent problem later.
+ mangled_name = '** CFI jump table'
+ else:
+ # E.g., '(.text.unlikely._name)' -> '_name'.
+ mangled_name = paren_value[mangled_start_idx:-1]
+ cur_flags = _FlagsFromMangledName(mangled_name)
+ is_partial = True
+ # As of 2017/11 LLD does not distinguish merged strings from other
+ # merged data. Feature request is filed under:
+ # https://bugs.llvm.org/show_bug.cgi?id=35248
+ if cur_obj == '<internal>':
+ if cur_section == '.rodata' and mangled_name == '':
+ # Treat all <internal> sections within .rodata as as string
+ # literals. Some may hold numeric constants or other data, but
+ # there is currently no way to distinguish them.
+ mangled_name = '** lld merge strings'
+ else:
+ # e.g. <internal>:(.text.thunk)
+ mangled_name = '** ' + mangled_name
+
+ is_partial = False
+ cur_obj = None
+ elif cur_obj == 'lto.tmp' or 'thinlto-cache' in cur_obj:
+ thin_map[address] = os.path.basename(cur_obj)
+ cur_obj = None
# Create a symbol here since there may be no ensuing Level 3 lines.
# But if there are, then the symbol can be modified later as sym[-1].
@@ -542,6 +558,17 @@ class MapFileParserLld(object):
# '$t.42' also appear at Level 3, but they are consumed by |tokenizer|,
# so don't appear hear.
elif level == 3:
+ # Handle .L.cfi.jumptable.
+ if in_jump_table:
+ # Level 3 entries in CFI jump tables are thunks with mangled names.
+ # Extracting them as symbols is not worthwhile; we only store the
+ # Level 2 symbol, and print the count for verbose output. For
+ # counting, '__typeid_' entries are excluded since they're likely
+ # just annotations.
+ if not tok.startswith('__typeid_'):
+ jump_entries_count += 1
+ continue
+
# Ignore anything with '.L_MergedGlobals' prefix. This seems to only
# happen for ARM (32-bit) builds.
if tok.startswith('.L_MergedGlobals'):
@@ -578,8 +605,23 @@ class MapFileParserLld(object):
next_usable_address = address + syms[-1].size
is_partial = False
elif address >= next_usable_address:
- # Prefer |size|, and only fall back to |span| if |size == 0|.
- size_to_use = size if size > 0 else span
+ if tok.startswith('__typeid_'):
+ assert size == 1
+ if tok.endswith('_byte_array'):
+ # CFI byte array table: |size| is inaccurate, so use |span|.
+ size_to_use = span
+ else:
+ # Likely '_global_addr' or '_unique_member'. These should be:
+ # * Skipped since they're in CFI tables.
+ # * Suppressed (via |next_usable_address|) by another Level 3
+ # symbol.
+ # Anything that makes it here would be an anomaly worthy of
+ # investigation, so print warnings.
+ logging.warn('Unrecognized __typeid_ symbol at %08X', address)
+ continue
+ else:
+ # Prefer |size|, and only fall back to |span| if |size == 0|.
+ size_to_use = size if size > 0 else span
sym = models.Symbol(cur_section, size_to_use, address=address,
full_name=tok, flags=cur_flags)
syms.append(sym)
@@ -595,6 +637,9 @@ class MapFileParserLld(object):
if promoted_name_count:
logging.info('Found %d promoted global names', promoted_name_count)
+ if jump_tables_count:
+ logging.info('Found %d CFI jump tables with %d total entries',
+ jump_tables_count, jump_entries_count)
return self._section_sizes, syms, {'thin_map': thin_map}
diff --git a/chromium/tools/binary_size/libsupersize/linker_map_parser_test.py b/chromium/tools/binary_size/libsupersize/linker_map_parser_test.py
index 31252fec246..a050df9a067 100755
--- a/chromium/tools/binary_size/libsupersize/linker_map_parser_test.py
+++ b/chromium/tools/binary_size/libsupersize/linker_map_parser_test.py
@@ -14,6 +14,7 @@ import test_util
_SCRIPT_DIR = os.path.dirname(__file__)
_TEST_DATA_DIR = os.path.join(_SCRIPT_DIR, 'testdata', 'linker_map_parser')
_TEST_MAP_PATH = os.path.join(_TEST_DATA_DIR, 'test_lld-lto_v1.map')
+_TEST_CFI_MAP_PATH = os.path.join(_TEST_DATA_DIR, 'test_lld-lto_v1_cfi.map')
def _CompareWithGolden(name=None):
@@ -45,23 +46,35 @@ def _ReadMapFile(map_file):
return ret
+def _RenderSectionSizesAndRawSymbols(section_sizes, raw_symbols):
+ ret = []
+ ret.append('******** section_sizes ********')
+ for k, v in sorted(section_sizes.iteritems()):
+ ret.append('%-24s %d' % (k, v))
+ ret.append('')
+ ret.append('******** raw_symbols ********')
+ for sym in raw_symbols:
+ ret.append(repr(sym))
+ return ret
+
+
class LinkerMapParserTest(unittest.TestCase):
@_CompareWithGolden()
def test_Parser(self):
- ret = []
map_file = _ReadMapFile(_TEST_MAP_PATH)
linker_name = linker_map_parser.DetectLinkerNameFromMapFile(iter(map_file))
section_sizes, raw_symbols, _ = (
linker_map_parser.MapFileParser().Parse(linker_name, iter(map_file)))
- ret.append('******** section_sizes ********')
- for k, v in sorted(section_sizes.iteritems()):
- ret.append('%-24s %d' % (k, v))
- ret.append('')
- ret.append('******** raw_symbols ********')
- for sym in raw_symbols:
- ret.append(repr(sym))
- return ret
+ return _RenderSectionSizesAndRawSymbols(section_sizes, raw_symbols)
+
+ @_CompareWithGolden()
+ def test_ParserCfi(self):
+ map_file = _ReadMapFile(_TEST_CFI_MAP_PATH)
+ linker_name = linker_map_parser.DetectLinkerNameFromMapFile(iter(map_file))
+ section_sizes, raw_symbols, _ = (
+ linker_map_parser.MapFileParser().Parse(linker_name, iter(map_file)))
+ return _RenderSectionSizesAndRawSymbols(section_sizes, raw_symbols)
def test_ParseArmAnnotations(self):
fun = linker_map_parser.MapFileParserLld.ParseArmAnnotations
diff --git a/chromium/tools/binary_size/libsupersize/models.py b/chromium/tools/binary_size/libsupersize/models.py
index 519405f0ad1..e0fb07df740 100644
--- a/chromium/tools/binary_size/libsupersize/models.py
+++ b/chromium/tools/binary_size/libsupersize/models.py
@@ -350,6 +350,14 @@ class BaseSymbol(object):
def IsStringLiteral(self):
return self.full_name == STRING_LITERAL_NAME
+ # Used for diffs to know whether or not it is accurate to consider two symbols
+ # with the same name as being the same.
+ def IsNameUnique(self):
+ return not (self.IsStringLiteral() or # "string literal"
+ self.IsOverhead() or # "Overhead: APK File"
+ self.full_name.startswith('*') or # "** outlined symbol"
+ '.' in self.full_name) # ".L__unnamed_1195"
+
def IterLeafSymbols(self):
yield self
@@ -1128,7 +1136,7 @@ class DeltaSymbolGroup(SymbolGroup):
ret = [0, 0, 0, 0]
for sym in self:
ret[sym.diff_status] += 1
- return ret
+ return tuple(ret)
def CountUniqueSymbols(self):
"""Returns (num_unique_before_symbols, num_unique_after_symbols)."""
diff --git a/chromium/tools/binary_size/libsupersize/static/tree-worker.js b/chromium/tools/binary_size/libsupersize/static/tree-worker.js
index e384a374c34..c2e274c9512 100644
--- a/chromium/tools/binary_size/libsupersize/static/tree-worker.js
+++ b/chromium/tools/binary_size/libsupersize/static/tree-worker.js
@@ -139,6 +139,8 @@ class TreeBuilder {
* attached to the tree.
* @param {(symbolNode: TreeNode) => boolean} options.highlightTest Called to
* see if a symbol should be highlighted.
+ * @param {boolean} options.methodCountMode Whether we're in "method count"
+ * mode.
* @param {string} options.sep Path seperator used to find parent names.
* @param {Meta} options.meta Metadata associated with this tree.
*/
@@ -146,6 +148,7 @@ class TreeBuilder {
this._getPath = options.getPath;
this._filterTest = options.filterTest;
this._highlightTest = options.highlightTest;
+ this._methodCountMode = options.methodCountMode;
this._sep = options.sep || _PATH_SEP;
this._meta = options.meta;
@@ -223,16 +226,11 @@ class TreeBuilder {
* @param {TreeNode} node
*/
_joinDexMethodClasses(node) {
+ const isFileNode = node.type[0] === _CONTAINER_TYPES.FILE;
const hasDex = node.childStats[_DEX_SYMBOL_TYPE] ||
node.childStats[_DEX_METHOD_SYMBOL_TYPE];
- if (!hasDex || !node.children) return node;
+ if (!isFileNode || !hasDex || !node.children) return node;
- if (node.type[0] !== _CONTAINER_TYPES.FILE) {
- for (const child of node.children) {
- this._joinDexMethodClasses(child);
- }
- return node;
- }
/** @type {Map<string, TreeNode>} */
const javaClassContainers = new Map();
/** @type {TreeNode[]} */
@@ -243,7 +241,9 @@ class TreeBuilder {
// Java classes are denoted with a "#", such as "LogoView#onDraw"
// Except for some older .ndjson files, which didn't do this for fields.
const splitIndex = childNode.idPath.lastIndexOf('#');
- const isClassNode = childNode.idPath.indexOf(' ') == -1;
+ // No return type / field type means it's a class node.
+ const isClassNode = childNode.idPath.indexOf(
+ ' ', childNode.shortNameIndex) == -1;
const hasClassPrefix = isClassNode || splitIndex != -1;
if (hasClassPrefix) {
@@ -419,6 +419,12 @@ class TreeBuilder {
const numAliases =
_KEYS.NUM_ALIASES in symbol ? symbol[_KEYS.NUM_ALIASES] : 1;
+ // Skip methods that have changed in size but not count when in
+ // "method count" mode.
+ if (this._methodCountMode && count === 0) {
+ continue;
+ }
+
const symbolNode = createNode({
// Join file path to symbol name with a ":"
idPath: `${idPath}:${symbol[_KEYS.SYMBOL_NAME]}`,
@@ -723,7 +729,7 @@ function parseOptions(options) {
highlightTest = () => false;
}
- return {groupBy, filterTest, highlightTest, url};
+ return {groupBy, filterTest, highlightTest, url, methodCountMode};
}
/** @type {TreeBuilder | null} */
@@ -737,10 +743,12 @@ const fetcher = new DataFetcher('data.ndjson');
* each symbol is tested against
* @param {(symbolNode: TreeNode) => boolean} highlightTest Filter function that
* each symbol's flags are tested against
+ * @param {boolean} methodCountMode
* @param {(msg: TreeProgress) => void} onProgress
* @returns {Promise<TreeProgress>}
*/
-async function buildTree(groupBy, filterTest, highlightTest, onProgress) {
+async function buildTree(
+ groupBy, filterTest, highlightTest, methodCountMode, onProgress) {
/** @type {Meta | null} Object from the first line of the data file */
let meta = null;
@@ -805,6 +813,7 @@ async function buildTree(groupBy, filterTest, highlightTest, onProgress) {
getPath: getPathMap[groupBy],
filterTest,
highlightTest,
+ methodCountMode,
sep: groupBy === 'component' ? '>' : _PATH_SEP,
meta,
});
@@ -838,7 +847,8 @@ async function buildTree(groupBy, filterTest, highlightTest, onProgress) {
const actions = {
/** @param {{input:string|null,options:string}} param0 */
load({input, options}) {
- const {groupBy, filterTest, highlightTest, url} = parseOptions(options);
+ const {groupBy, filterTest, highlightTest, url, methodCountMode} =
+ parseOptions(options);
if (input === 'from-url://' && url) {
// Display the data from the `load_url` query parameter
console.info('Displaying data from', url);
@@ -848,10 +858,11 @@ const actions = {
fetcher.setInput(input);
}
- return buildTree(groupBy, filterTest, highlightTest, progress => {
- // @ts-ignore
- self.postMessage(progress);
- });
+ return buildTree(
+ groupBy, filterTest, highlightTest, methodCountMode, progress => {
+ // @ts-ignore
+ self.postMessage(progress);
+ });
},
/** @param {string} path */
async open(path) {
diff --git a/chromium/tools/binary_size/sizes.gni b/chromium/tools/binary_size/sizes.gni
new file mode 100644
index 00000000000..8e2085693ff
--- /dev/null
+++ b/chromium/tools/binary_size/sizes.gni
@@ -0,0 +1,29 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/util/generate_wrapper.gni")
+
+template("sizes_test") {
+ generate_wrapper(target_name) {
+ forward_variables_from(invoker, [ "data" ])
+ testonly = true
+ executable = "//tools/binary_size/sizes.py"
+ wrapper_script = "$root_out_dir/bin/${target_name}"
+
+ data_deps = [
+ "//tools/binary_size:sizes_py",
+ ]
+ if (defined(invoker.data_deps)) {
+ data_deps += invoker.data_deps
+ }
+
+ executable_args = [
+ "--output-directory",
+ "@WrappedPath(.)",
+ ]
+ if (defined(invoker.executable_args)) {
+ executable_args += invoker.executable_args
+ }
+ }
+}
diff --git a/chromium/tools/binary_size/sizes.py b/chromium/tools/binary_size/sizes.py
new file mode 100755
index 00000000000..87f73937291
--- /dev/null
+++ b/chromium/tools/binary_size/sizes.py
@@ -0,0 +1,477 @@
+#!/usr/bin/env python
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A tool to extract size information for chrome.
+
+For a list of command-line options, call this script with '--help'.
+"""
+
+import argparse
+import errno
+import glob
+import json
+import platform
+import os
+import re
+import stat
+import subprocess
+import sys
+import tempfile
+
+SRC_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
+
+# Add Catapult to the path so we can import the chartjson-histogramset
+# conversion.
+sys.path.append(os.path.join(SRC_DIR, 'third_party', 'catapult', 'tracing'))
+from tracing.value import convert_chart_json
+
+
+class ResultsCollector(object):
+
+ def __init__(self):
+ self.results = {}
+
+ def add_result(self, name, identifier, value, units):
+ assert name not in self.results
+ self.results[name] = {
+ 'identifier': identifier,
+ 'value': int(value),
+ 'units': units
+ }
+
+ # Legacy printing, previously used for parsing the text logs.
+ print 'RESULT %s: %s= %s %s' % (name, identifier, value, units)
+
+
+def get_size(filename):
+ return os.stat(filename)[stat.ST_SIZE]
+
+
+def get_linux_stripped_size(filename):
+ EU_STRIP_NAME = 'eu-strip'
+ # Assumes |filename| is in out/Release
+ # build/linux/bin/eu-strip'
+ src_dir = os.path.dirname(os.path.dirname(os.path.dirname(filename)))
+ eu_strip_path = os.path.join(src_dir, 'build', 'linux', 'bin', EU_STRIP_NAME)
+ if (platform.architecture()[0] == '64bit'
+ or not os.path.exists(eu_strip_path)):
+ eu_strip_path = EU_STRIP_NAME
+
+ with tempfile.NamedTemporaryFile() as stripped_file:
+ strip_cmd = [eu_strip_path, '-o', stripped_file.name, filename]
+ result = 0
+ result, _ = run_process(result, strip_cmd)
+ if result != 0:
+ return (result, 0)
+ return (result, get_size(stripped_file.name))
+
+
+def run_process(result, command):
+ p = subprocess.Popen(command, stdout=subprocess.PIPE)
+ stdout = p.communicate()[0]
+ if p.returncode != 0:
+ print 'ERROR from command "%s": %d' % (' '.join(command), p.returncode)
+ if result == 0:
+ result = p.returncode
+ return result, stdout
+
+
+def main_mac(output_directory, results_collector):
+ """Print appropriate size information about built Mac targets.
+
+ Returns the first non-zero exit status of any command it executes,
+ or zero on success.
+ """
+ # Set DEVELOPER_DIR to the hermetic Xcode.app so 'size' will work.
+ if not 'DEVELOPER_DIR' in os.environ:
+ xcode_path = os.path.join(SRC_DIR, 'build', 'mac_files', 'Xcode.app')
+ if os.path.exists(xcode_path):
+ os.environ['DEVELOPER_DIR'] = xcode_path
+
+ result = 0
+ # Work with either build type.
+ base_names = ('Chromium', 'Google Chrome')
+ for base_name in base_names:
+ app_bundle = base_name + '.app'
+ framework_name = base_name + ' Framework'
+ framework_bundle = framework_name + '.framework'
+ framework_dsym_bundle = framework_name + '.dSYM'
+
+ chromium_app_dir = os.path.join(output_directory, app_bundle)
+ chromium_executable = os.path.join(chromium_app_dir, 'Contents', 'MacOS',
+ base_name)
+
+ chromium_framework_dir = os.path.join(output_directory, framework_bundle)
+ chromium_framework_executable = os.path.join(chromium_framework_dir,
+ framework_name)
+
+ chromium_framework_dsym_dir = os.path.join(output_directory,
+ framework_dsym_bundle)
+ chromium_framework_dsym = os.path.join(chromium_framework_dsym_dir,
+ 'Contents', 'Resources', 'DWARF',
+ framework_name)
+ if os.path.exists(chromium_executable):
+ print_dict = {
+ # Remove spaces in the names so any downstream processing is less
+ # likely to choke.
+ 'app_name': re.sub(r'\s', '', base_name),
+ 'app_bundle': re.sub(r'\s', '', app_bundle),
+ 'framework_name': re.sub(r'\s', '', framework_name),
+ 'framework_bundle': re.sub(r'\s', '', framework_bundle),
+ 'app_size': get_size(chromium_executable),
+ 'framework_size': get_size(chromium_framework_executable),
+ 'framework_dsym_name': re.sub(r'\s', '', framework_name) + 'Dsym',
+ 'framework_dsym_size': get_size(chromium_framework_dsym),
+ }
+
+ # Collect the segment info out of the App
+ result, stdout = run_process(result, ['size', chromium_executable])
+ print_dict['app_text'], print_dict['app_data'], print_dict['app_objc'] = \
+ re.search(r'(\d+)\s+(\d+)\s+(\d+)', stdout).groups()
+
+ # Collect the segment info out of the Framework
+ result, stdout = run_process(result,
+ ['size', chromium_framework_executable])
+ print_dict['framework_text'], print_dict['framework_data'], \
+ print_dict['framework_objc'] = \
+ re.search(r'(\d+)\s+(\d+)\s+(\d+)', stdout).groups()
+
+ # Collect the whole size of the App bundle on disk (include the framework)
+ result, stdout = run_process(result, ['du', '-s', '-k', chromium_app_dir])
+ du_s = re.search(r'(\d+)', stdout).group(1)
+ print_dict['app_bundle_size'] = (int(du_s) * 1024)
+
+ results_collector.add_result(print_dict['app_name'],
+ print_dict['app_name'],
+ print_dict['app_size'], 'bytes')
+ results_collector.add_result('%s-__TEXT' % print_dict['app_name'],
+ '__TEXT', print_dict['app_text'], 'bytes')
+ results_collector.add_result('%s-__DATA' % print_dict['app_name'],
+ '__DATA', print_dict['app_data'], 'bytes')
+ results_collector.add_result('%s-__OBJC' % print_dict['app_name'],
+ '__OBJC', print_dict['app_objc'], 'bytes')
+ results_collector.add_result(print_dict['framework_name'],
+ print_dict['framework_name'],
+ print_dict['framework_size'], 'bytes')
+ results_collector.add_result('%s-__TEXT' % print_dict['framework_name'],
+ '__TEXT', print_dict['framework_text'],
+ 'bytes')
+ results_collector.add_result('%s-__DATA' % print_dict['framework_name'],
+ '__DATA', print_dict['framework_data'],
+ 'bytes')
+ results_collector.add_result('%s-__OBJC' % print_dict['framework_name'],
+ '__OBJC', print_dict['framework_objc'],
+ 'bytes')
+ results_collector.add_result(print_dict['app_bundle'],
+ print_dict['app_bundle'],
+ print_dict['app_bundle_size'], 'bytes')
+ results_collector.add_result(print_dict['framework_dsym_name'],
+ print_dict['framework_dsym_name'],
+ print_dict['framework_dsym_size'], 'bytes')
+
+ # Found a match, don't check the other base_names.
+ return result
+ # If no base_names matched, fail script.
+ return 66
+
+
+def check_linux_binary(binary_name, output_directory):
+ """Collect appropriate size information about the built Linux binary given.
+
+ Returns a tuple (result, sizes). result is the first non-zero exit
+ status of any command it executes, or zero on success. sizes is a list
+ of tuples (name, identifier, totals_identifier, value, units).
+ The printed line looks like:
+ name: identifier= value units
+ When this same data is used for totals across all the binaries, then
+ totals_identifier is the identifier to use, or '' to just use identifier.
+ """
+ binary_file = os.path.join(output_directory, binary_name)
+
+ if not os.path.exists(binary_file):
+ # Don't print anything for missing files.
+ return 0, []
+
+ result = 0
+ sizes = []
+
+ sizes.append((binary_name, binary_name, 'size', get_size(binary_file),
+ 'bytes'))
+
+ result, stripped_size = get_linux_stripped_size(binary_file)
+ sizes.append((binary_name + '-stripped', 'stripped', 'stripped',
+ stripped_size, 'bytes'))
+
+ result, stdout = run_process(result, ['size', binary_file])
+ text, data, bss = re.search(r'(\d+)\s+(\d+)\s+(\d+)', stdout).groups()
+ sizes += [
+ (binary_name + '-text', 'text', '', text, 'bytes'),
+ (binary_name + '-data', 'data', '', data, 'bytes'),
+ (binary_name + '-bss', 'bss', '', bss, 'bytes'),
+ ]
+
+ # Determine if the binary has the DT_TEXTREL marker.
+ result, stdout = run_process(result, ['readelf', '-Wd', binary_file])
+ if re.search(r'\bTEXTREL\b', stdout) is None:
+ # Nope, so the count is zero.
+ count = 0
+ else:
+ # There are some, so count them.
+ result, stdout = run_process(result, ['eu-findtextrel', binary_file])
+ count = stdout.count('\n')
+ sizes.append((binary_name + '-textrel', 'textrel', '', count, 'relocs'))
+
+ return result, sizes
+
+
+def main_linux(output_directory, results_collector):
+ """Print appropriate size information about built Linux targets.
+
+ Returns the first non-zero exit status of any command it executes,
+ or zero on success.
+ """
+ binaries = [
+ 'chrome',
+ 'nacl_helper',
+ 'nacl_helper_bootstrap',
+ 'libffmpegsumo.so',
+ 'libgcflashplayer.so',
+ 'libppGoogleNaClPluginChrome.so',
+ ]
+
+ result = 0
+
+ totals = {}
+
+ for binary in binaries:
+ this_result, this_sizes = check_linux_binary(binary, output_directory)
+ if result == 0:
+ result = this_result
+ for name, identifier, totals_id, value, units in this_sizes:
+ results_collector.add_result(name, identifier, value, units)
+ totals_id = totals_id or identifier, units
+ totals[totals_id] = totals.get(totals_id, 0) + int(value)
+
+ files = [
+ 'nacl_irt_x86_64.nexe',
+ 'resources.pak',
+ ]
+
+ for filename in files:
+ path = os.path.join(output_directory, filename)
+ try:
+ size = get_size(path)
+ except OSError, e:
+ if e.errno == errno.ENOENT:
+ continue # Don't print anything for missing files.
+ raise
+ results_collector.add_result(filename, filename, size, 'bytes')
+ totals['size', 'bytes'] += size
+
+ # TODO(mcgrathr): This should all be refactored so the mac and win flavors
+ # also deliver data structures rather than printing, and the logic for
+ # the printing and the summing totals is shared across all three flavors.
+ for (identifier, units), value in sorted(totals.iteritems()):
+ results_collector.add_result('totals-%s' % identifier, identifier, value,
+ units)
+
+ return result
+
+
+def check_android_binaries(binaries,
+ output_directory,
+ results_collector,
+ binaries_to_print=None):
+ """Common method for printing size information for Android targets.
+
+ Prints size information for each element of binaries in the output
+ directory. If binaries_to_print is specified, the name of each binary from
+ binaries is replaced with corresponding element of binaries_to_print
+ in output. Returns the first non-zero exit status of any command it
+ executes, or zero on success.
+ """
+ result = 0
+ if not binaries_to_print:
+ binaries_to_print = binaries
+
+ for (binary, binary_to_print) in zip(binaries, binaries_to_print):
+ this_result, this_sizes = check_linux_binary(binary, output_directory)
+ if result == 0:
+ result = this_result
+ for name, identifier, _, value, units in this_sizes:
+ name = name.replace('/', '_').replace(binary, binary_to_print)
+ identifier = identifier.replace(binary, binary_to_print)
+ results_collector.add_result(name, identifier, value, units)
+
+ return result
+
+
+def main_android_cronet(output_directory, results_collector):
+ """Print appropriate size information about Android Cronet targets.
+
+ Returns the first non-zero exit status of any command it executes,
+ or zero on success.
+ """
+ # Use version in binary file name, but not in printed output.
+ binaries_with_paths = glob.glob(
+ os.path.join(output_directory, 'libcronet.*.so'))
+ num_binaries = len(binaries_with_paths)
+ assert num_binaries == 1, "Got %d binaries: %s" % (
+ num_binaries, ', '.join(binaries_with_paths))
+ binaries = [os.path.basename(binaries_with_paths[0])]
+ binaries_to_print = ['libcronet.so']
+
+ return check_android_binaries(binaries, output_directory, results_collector,
+ binaries_to_print)
+
+
+def main_win(output_directory, results_collector):
+ """Print appropriate size information about built Windows targets.
+
+ Returns the first non-zero exit status of any command it executes,
+ or zero on success.
+ """
+ files = [
+ 'chrome.dll',
+ 'chrome.dll.pdb',
+ 'chrome.exe',
+ 'chrome_child.dll',
+ 'chrome_child.dll.pdb',
+ 'chrome_elf.dll',
+ 'chrome_watcher.dll',
+ 'libEGL.dll',
+ 'libGLESv2.dll',
+ 'mini_installer.exe',
+ 'resources.pak',
+ 'setup.exe',
+ 'swiftshader\\libEGL.dll',
+ 'swiftshader\\libGLESv2.dll',
+ 'WidevineCdm\\_platform_specific\\win_x64\\widevinecdm.dll',
+ 'WidevineCdm\\_platform_specific\\win_x64\\widevinecdmadapter.dll',
+ 'WidevineCdm\\_platform_specific\\win_x86\\widevinecdm.dll',
+ 'WidevineCdm\\_platform_specific\\win_x86\\widevinecdmadapter.dll',
+ ]
+
+ for f in files:
+ p = os.path.join(output_directory, f)
+ if os.path.isfile(p):
+ results_collector.add_result(f, f, get_size(p), 'bytes')
+
+ return 0
+
+
+def format_for_histograms_conversion(data):
+ # We need to do two things to the provided data to make it compatible with the
+ # conversion script:
+ # 1. Add a top-level "benchmark_name" key.
+ # 2. Pull out the "identifier" value to be the story name.
+ formatted_data = {}
+ for metric, metric_data in data.iteritems():
+ story = metric_data['identifier']
+ formatted_data[metric] = {story: metric_data.copy()}
+ del formatted_data[metric][story]['identifier']
+ return {'benchmark_name': 'sizes', 'charts': formatted_data}
+
+
+def main():
+ if sys.platform in ('win32', 'cygwin'):
+ default_platform = 'win'
+ elif sys.platform.startswith('darwin'):
+ default_platform = 'mac'
+ elif sys.platform == 'linux2':
+ default_platform = 'linux'
+ else:
+ default_platform = None
+
+ main_map = {
+ 'android-cronet': main_android_cronet,
+ 'linux': main_linux,
+ 'mac': main_mac,
+ 'win': main_win,
+ }
+ platforms = sorted(main_map.keys())
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ '--output-directory',
+ type=os.path.realpath,
+ help='Chromium output directory, e.g. /path/to/src/out/Debug')
+ parser.add_argument(
+ '--platform',
+ default=default_platform,
+ help='specify platform (%s) [default: %%(default)s]' %
+ ', '.join(platforms))
+
+ # Accepted to conform to the isolated script interface, but ignored.
+ parser.add_argument('--isolated-script-test-filter', help=argparse.SUPPRESS)
+ parser.add_argument(
+ '--isolated-script-test-perf-output', help=argparse.SUPPRESS)
+
+ parser.add_argument(
+ '--isolated-script-test-output',
+ type=os.path.realpath,
+ help='File to which simplified JSON results will be written.')
+
+ args = parser.parse_args()
+
+ real_main = main_map.get(args.platform)
+ if not real_main:
+ if args.platform is None:
+ sys.stderr.write('Unsupported sys.platform %s.\n' % repr(sys.platform))
+ else:
+ sys.stderr.write('Unknown platform %s.\n' % repr(args.platform))
+ msg = 'Use the --platform= option to specify a supported platform:\n'
+ sys.stderr.write(msg + ' ' + ' '.join(platforms) + '\n')
+ return 2
+
+ isolated_script_output = {
+ 'valid': False,
+ 'failures': [],
+ 'version': 'simplified'
+ }
+ test_name = 'sizes'
+
+ results_directory = None
+ if args.isolated_script_test_output:
+ results_directory = os.path.join(
+ os.path.dirname(args.isolated_script_test_output), test_name)
+ if not os.path.exists(results_directory):
+ os.makedirs(results_directory)
+
+ results_collector = ResultsCollector()
+ try:
+ rc = real_main(args.output_directory, results_collector)
+ isolated_script_output = {
+ 'valid': True,
+ 'failures': [test_name] if rc else [],
+ 'version': 'simplified',
+ }
+ finally:
+ if results_directory:
+ results_path = os.path.join(results_directory, 'test_results.json')
+ with open(results_path, 'w') as output_file:
+ json.dump(isolated_script_output, output_file)
+
+ histogram_path = os.path.join(results_directory, 'perf_results.json')
+ # We need to add a bit more data to the results and rearrange some things,
+ # otherwise the conversion fails due to the provided data being malformed.
+ updated_results = format_for_histograms_conversion(
+ results_collector.results)
+ with open(histogram_path, 'w') as f:
+ json.dump(updated_results, f)
+ histogram_result = convert_chart_json.ConvertChartJson(histogram_path)
+ if histogram_result.returncode != 0:
+ sys.stderr.write(
+ 'chartjson conversion failed: %s\n' % histogram_result.stdout)
+ rc = rc or histogram_result.returncode
+ else:
+ with open(histogram_path, 'w') as f:
+ f.write(histogram_result.stdout)
+
+ return rc
+
+
+if '__main__' == __name__:
+ sys.exit(main())
diff --git a/chromium/tools/binary_size/sizes.pydeps b/chromium/tools/binary_size/sizes.pydeps
new file mode 100644
index 00000000000..2a36b2b6292
--- /dev/null
+++ b/chromium/tools/binary_size/sizes.pydeps
@@ -0,0 +1,9 @@
+# Generated by running:
+# build/print_python_deps.py --root tools/binary_size --output tools/binary_size/sizes.pydeps tools/binary_size/sizes.py
+../../third_party/catapult/third_party/vinn/vinn/__init__.py
+../../third_party/catapult/third_party/vinn/vinn/_vinn.py
+../../third_party/catapult/tracing/tracing/__init__.py
+../../third_party/catapult/tracing/tracing/value/__init__.py
+../../third_party/catapult/tracing/tracing/value/convert_chart_json.py
+../../third_party/catapult/tracing/tracing_project.py
+sizes.py
diff --git a/chromium/tools/boilerplate.py b/chromium/tools/boilerplate.py
index 03e71f5ef0b..344d63eae2d 100755
--- a/chromium/tools/boilerplate.py
+++ b/chromium/tools/boilerplate.py
@@ -28,6 +28,8 @@ EXTENSIONS_TO_COMMENTS = {
'py': '#',
'gn': '#',
'gni': '#',
+ 'mojom': '//',
+ 'typemap': '#',
}
def _GetHeader(filename):
diff --git a/chromium/tools/cfi/blacklist.txt b/chromium/tools/cfi/blacklist.txt
index 273b8788d5d..0adc97687af 100644
--- a/chromium/tools/cfi/blacklist.txt
+++ b/chromium/tools/cfi/blacklist.txt
@@ -29,6 +29,9 @@ fun:*internal_default_instance*
# CAtlArray<T> casts to uninitialized T*.
src:*atlcoll.h
+# https://github.com/grpc/grpc/issues/19375
+src:*third_party/grpc/src/src/core/lib/gprpp/inlined_vector.h
+
#############################################################################
# Base class's constructor accesses a derived class.
@@ -49,7 +52,7 @@ fun:*ThreadSafeRefCountedGarbageCollected*makeKeepAlive*
fun:*DatabaseContext*contextDestroyed*
# FIXME: Cannot handle template function LifecycleObserver<>::setContext,
-# so exclude source file for now.
+# so exclude source file for now.
src:*lifecycle_observer.h*
#############################################################################
@@ -204,6 +207,7 @@ fun:*LocaleConvertCase*
# PropertyCallbackArguments::Call methods cast function pointers
src:*v8/src/api-arguments-inl.h
+src:*v8/src/api/api-arguments-inl.h
# v8 callback that casts argument template parameters
fun:*PendingPhantomCallback*Invoke*
diff --git a/chromium/tools/check_grd_for_unused_strings.py b/chromium/tools/check_grd_for_unused_strings.py
index 71ba386dacb..1c6497a7bca 100755
--- a/chromium/tools/check_grd_for_unused_strings.py
+++ b/chromium/tools/check_grd_for_unused_strings.py
@@ -132,6 +132,7 @@ def main():
chrome_app_dir = os.path.join(chrome_dir, 'app')
chrome_app_res_dir = os.path.join(chrome_app_dir, 'resources')
device_base_dir = os.path.join(src_dir, 'device')
+ services_dir = os.path.join(src_dir, 'services')
ui_dir = os.path.join(src_dir, 'ui')
ui_strings_dir = os.path.join(ui_dir, 'strings')
ui_chromeos_dir = os.path.join(ui_dir, 'chromeos')
@@ -156,6 +157,7 @@ def main():
'renderer_resources.grd'),
os.path.join(device_base_dir, 'bluetooth', 'bluetooth_strings.grd'),
os.path.join(device_base_dir, 'fido', 'fido_strings.grd'),
+ os.path.join(services_dir, 'services_strings.grd')
os.path.join(src_dir, 'chromeos', 'chromeos_strings.grd'),
os.path.join(src_dir, 'extensions', 'strings', 'extensions_strings.grd'),
os.path.join(src_dir, 'ui', 'resources', 'ui_resources.grd'),
diff --git a/chromium/tools/checklicenses/checklicenses.py b/chromium/tools/checklicenses/checklicenses.py
index e670c685de1..0d455fc7c80 100755
--- a/chromium/tools/checklicenses/checklicenses.py
+++ b/chromium/tools/checklicenses/checklicenses.py
@@ -456,9 +456,6 @@ PATH_SPECIFIC_WHITELISTED_LICENSES = {
'third_party/openh264/src': [
'UNKNOWN',
],
- 'third_party/openmax_dl/dl' : [
- 'Khronos Group',
- ],
'third_party/boringssl': [
# There are some files in BoringSSL which came from OpenSSL and have no
# license in them. We don't wish to add the license header ourselves
diff --git a/chromium/tools/checkteamtags/OWNERS b/chromium/tools/checkteamtags/OWNERS
index 8b2c6bf2b37..7091274b86e 100644
--- a/chromium/tools/checkteamtags/OWNERS
+++ b/chromium/tools/checkteamtags/OWNERS
@@ -1,2 +1 @@
robertocn@chromium.org
-stgao@chromium.org
diff --git a/chromium/tools/checkteamtags/extract_components_test.py b/chromium/tools/checkteamtags/extract_components_test.py
index 54ce53ab1d4..27c79211f66 100644
--- a/chromium/tools/checkteamtags/extract_components_test.py
+++ b/chromium/tools/checkteamtags/extract_components_test.py
@@ -204,9 +204,9 @@ class ExtractComponentsTest(unittest.TestCase):
'# COMPONENT: Dummy>Component2'),
('chromium/src/dir1/subdir', 'dummy@chromium.org'),
('chromium/src/dir2/subdir', None),
- ('third_party/WebKit/LayoutTests/foo',
+ ('third_party/blink/web_tests/foo',
'# TEAM: dummy-team-3@chromium.org\n'),
- ('third_party/WebKit/LayoutTests/bar',
+ ('third_party/blink/web_tests/bar',
'# TEAM: dummy-team-3@chromium.org\n'
'# COMPONENT: Dummy>Component3\n'),
])):
@@ -231,10 +231,10 @@ class ExtractComponentsTest(unittest.TestCase):
u'chromium/src/dir1/subdir': u'Dummy>Component',
u'chromium/src/dir2': u'Dummy>Component2',
u'chromium/src/dir2/subdir': u'Dummy>Component2',
- u'third_party/WebKit/LayoutTests/bar': u'Dummy>Component3',
+ u'third_party/blink/web_tests/bar': u'Dummy>Component3',
},
u'dir-to-team': {
- u'third_party/WebKit/LayoutTests/foo':
+ u'third_party/blink/web_tests/foo':
u'dummy-team-3@chromium.org',
}})
diff --git a/chromium/tools/chrome_proxy/webdriver/bypass.py b/chromium/tools/chrome_proxy/webdriver/bypass.py
index fea8ae17830..2c4d75209bd 100644
--- a/chromium/tools/chrome_proxy/webdriver/bypass.py
+++ b/chromium/tools/chrome_proxy/webdriver/bypass.py
@@ -6,7 +6,6 @@ import common
from common import TestDriver
from common import IntegrationTest
from decorators import ChromeVersionEqualOrAfterM
-from decorators import ChromeVersionBeforeM
class Bypass(IntegrationTest):
@@ -60,30 +59,130 @@ class Bypass(IntegrationTest):
# Verify that CORS requests receive a block-once from the data reduction
# proxy by checking that those requests are retried without data reduction
- # proxy.
+ # proxy. CORS tests needs to be verified with and without OutOfBlinkCors
+ # feature, since this feature affects sending CORS blocked response headers to
+ # the renderer in different ways.
def testCorsBypass(self):
+ self.VerifyCorsTestWithOutOfBlinkCors(True)
+
+ def testCorsBypassWithoutOutOfBlinkCors(self):
+ # Verifies CORS behavior without OutOfBlinkCors feature. This feature is
+ # currently under experimentation and once it is fully enabled this test can
+ # be removed.
+ self.VerifyCorsTestWithOutOfBlinkCors(False)
+
+ def VerifyProxyServesPageWithoutBypass(self, test_driver):
+ drp_responses = 0
+ test_driver.LoadURL('http://check.googlezip.net/test.html')
+ for response in test_driver.GetHTTPResponses():
+ self.assertHasProxyHeaders(response)
+ drp_responses += 1
+ self.assertNotEqual(0, drp_responses)
+ test_driver.SleepUntilHistogramHasEntry('PageLoad.Clients.'
+ 'DataReductionProxy.ParseTiming.NavigationToFirstContentfulPaint')
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BlockTypePrimary'))
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BlockTypeFallback'))
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BypassTypePrimary'))
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BypassTypeFallback'))
+
+ def VerifyCorsTestWithOutOfBlinkCors(self, is_out_of_blink_cors_feature_on):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
+ if is_out_of_blink_cors_feature_on:
+ test_driver.EnableChromeFeature('OutOfBlinkCors')
+ else:
+ test_driver.DisableChromeFeature('OutOfBlinkCors')
+
+ # The CORS test page makes a cross-origin XHR request to a resource for
+ # which DRP requests to bypass proxy for the current request. This 502
+ # block-once bypass will not be received by the DRP bypass logic in the
+ # renderer if proper response headers (Access-Control-Allow-Origin and
+ # Access-Control-Allow-Headers) are not present.
+ # This test verifies that the bypass logic received one block-once bypass,
+ # and the request is retried without DRP. The 502 bypass response cannot
+ # be verified to contain proper response headers set by the DRP since only
+ # the retried response will be picked up by the webdriver.
test_driver.LoadURL('http://www.gstatic.com/chrome/googlezip/cors/')
- # Navigate to a different page to verify that later requests are not
- # blocked.
- test_driver.LoadURL('http://check.googlezip.net/test.html')
-
+ test_driver.SleepUntilHistogramHasEntry(
+ 'DataReductionProxy.BlockTypePrimary')
+ # Verify that one request received block-once(bucket=0), and no other
+ # bypasses or fallbacks are received. Explicit checks for response headers
+ # content-type=text/plain, Access-Control-Allow-Origin,
+ # Access-Control-Allow-Headers, Via, Chrome-Proxy cannot be added, since
+ # webdriver does not get the headers for 502 response. However, since
+ # BlockTypePrimary is checked for one block-once entry, we know the DRP
+ # bypass logic has picked it up.
+ blocked = test_driver.GetHistogram('DataReductionProxy.BlockTypePrimary')
+ self.assertEqual(1, blocked['count'])
+ self.assertEqual(blocked['buckets'][0]['low'], 0)
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BlockTypeFallback'))
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BypassTypePrimary'))
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BypassTypeFallback'))
cors_requests = 0
same_origin_requests = 0
for response in test_driver.GetHTTPResponses():
- # The origin header implies that |response| is a CORS request.
- if ('origin' not in response.request_headers):
- self.assertHasProxyHeaders(response)
- same_origin_requests = same_origin_requests + 1
- else:
+ # The cross-origin XHR request is a CORS request.
+ if response.request_type == 'XHR':
self.assertNotHasChromeProxyViaHeader(response)
+ self.assertEqual(200, response.status)
cors_requests = cors_requests + 1
+ else:
+ self.assertHasProxyHeaders(response)
+ same_origin_requests = same_origin_requests + 1
# Verify that both CORS and same origin requests were seen.
self.assertNotEqual(0, same_origin_requests)
self.assertNotEqual(0, cors_requests)
+ # Navigate to a different page to verify that later requests are not
+ # blocked.
+ self.VerifyProxyServesPageWithoutBypass(test_driver)
+
+ # Tests that data reduction proxy bypasses are not blocked by CORB. Since the
+ # bypass/fallback handling is in the renderer process, CORB failures will skip
+ # the bypasses/fallbacks and the resource will not be retried without data
+ # reduction proxy.
+ def testBypassNotBlockedByCorb(self):
+ with TestDriver() as test_driver:
+ test_driver.AddChromeArg('--enable-spdy-proxy-auth')
+
+ # The CORB test page loads an <img> to a cross-origin resource for which
+ # DRP requests to bypass proxy for the current request. This 502
+ # block-once bypass will not be received by the DRP bypass logic in the
+ # renderer, if CORB blocks it based on mislabeled content-type or the
+ # actual type observed from sniffing the body.
+ test_driver.LoadURL('http://www.gstatic.com/chrome/googlezip/corb.html')
+ drp_responses = 0
+ for response in test_driver.GetHTTPResponses():
+ if response.ResponseHasViaHeader():
+ self.assertHasProxyHeaders(response)
+ drp_responses += 1
+ self.assertNotEqual(0, drp_responses)
+ test_driver.SleepUntilHistogramHasEntry(
+ 'DataReductionProxy.BlockTypePrimary')
+ # Verify that one request received block-once (bucket=0), and no other
+ # bypasses or fallbacks are received.
+ blocked = test_driver.GetHistogram('DataReductionProxy.BlockTypePrimary')
+ self.assertEqual(1, blocked['count'])
+ self.assertEqual(blocked['buckets'][0]['low'], 0)
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BlockTypeFallback'))
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BypassTypePrimary'))
+ self.assertEqual({},
+ test_driver.GetHistogram('DataReductionProxy.BypassTypeFallback'))
+
+ # Navigate to a different page to verify that later requests are not
+ # blocked.
+ self.VerifyProxyServesPageWithoutBypass(test_driver)
+
# Verify that when an origin times out using Data Saver, the request is
# fetched directly and data saver is bypassed only for one request.
def testOriginTimeoutBlockOnce(self):
@@ -110,7 +209,7 @@ class Bypass(IntegrationTest):
def testMissingViaHeaderNoBypassExperiment(self):
with TestDriver() as t:
t.AddChromeArg('--enable-spdy-proxy-auth')
- t.AddChromeArg('--enable-features=DataReductionProxyRobustConnection'
+ t.EnableChromeFeature('DataReductionProxyRobustConnection'
'<DataReductionProxyRobustConnection')
t.AddChromeArg('--force-fieldtrials=DataReductionProxyRobustConnection/'
'Enabled')
@@ -145,43 +244,6 @@ class Bypass(IntegrationTest):
self.assertEqual(histogram['buckets'][0]['low'], 2)
self.assertEqual(histogram['buckets'][0]['high'], 3)
- # Verify that when Chrome receives a 4xx response through a Data Reduction
- # Proxy that doesn't set a proper via header, Chrome bypasses all proxies and
- # retries the request over direct.
- @ChromeVersionBeforeM(67)
- def testMissingViaHeader4xxBypass(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
-
- # Set the primary Data Reduction Proxy to be the test server, which does
- # not add any Via headers.
- test_driver.AddChromeArg('--data-reduction-proxy-http-proxies='
- 'https://chromeproxy-test.appspot.com;'
- 'http://compress.googlezip.net')
-
- # Load a page that will come back with a 4xx response code and without the
- # proper via header. Chrome should bypass all proxies and retry the
- # request.
- test_driver.LoadURL(
- 'http://chromeproxy-test.appspot.com/default?respStatus=414')
- responses = test_driver.GetHTTPResponses()
- self.assertNotEqual(0, len(responses))
- for response in responses:
- self.assertNotHasChromeProxyViaHeader(response)
- self.assertEqual(u'http/1.1', response.protocol)
-
- # Check that the BlockTypePrimary histogram has at least one entry in the
- # MissingViaHeader4xx category (which is enum value 4), to make sure that
- # the bypass was caused by the missing via header logic and not something
- # else. The favicon for this URL may also be fetched, but will return a
- # 404.
- histogram = test_driver.GetHistogram(
- "DataReductionProxy.BlockTypePrimary")
- self.assertNotEqual(0, histogram['count'])
- self.assertEqual(1, len(histogram['buckets']))
- self.assertEqual(5, histogram['buckets'][0]['high'])
- self.assertEqual(4, histogram['buckets'][0]['low'])
-
# Verify that the Data Reduction Proxy understands the "exp" directive.
def testExpDirectiveBypass(self):
# If it was attempted to run with another experiment, skip this test.
@@ -190,8 +252,7 @@ class Bypass(IntegrationTest):
self.skipTest('This test cannot be run with other experiments.')
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--data-reduction-proxy-experiment='
- 'client_test_bypass')
+ test_driver.SetExperiment('client_test_bypass')
# Verify that loading a page other than the specific exp directive test
# page loads through the proxy without being bypassed.
@@ -265,5 +326,18 @@ class Bypass(IntegrationTest):
if client in clientType:
self.assertNotHasChromeProxyViaHeader(response)
+ def testHTTPSubresourcesOnHTTPSPage(self):
+ with TestDriver() as test_driver:
+ test_driver.AddChromeArg('--enable-spdy-proxy-auth')
+ test_driver.LoadURL(
+ 'https://check.googlezip.net/previews/mixed_images.html')
+ responses = test_driver.GetHTTPResponses()
+ self.assertEqual(3, len(responses))
+ for response in responses:
+ if response.url.startswith('http://'):
+ self.assertHasProxyHeaders(response)
+ elif response.url.startswith('https://'):
+ self.assertNotHasChromeProxyViaHeader(response)
+
if __name__ == '__main__':
IntegrationTest.RunAllTests()
diff --git a/chromium/tools/chrome_proxy/webdriver/common.py b/chromium/tools/chrome_proxy/webdriver/common.py
index 7531935e7fe..9a8992782d0 100644
--- a/chromium/tools/chrome_proxy/webdriver/common.py
+++ b/chromium/tools/chrome_proxy/webdriver/common.py
@@ -25,6 +25,10 @@ sys.path.append(os.path.join(os.path.dirname(__file__), os.pardir, os.pardir,
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
+# Pretty printer for debug output.
+def PrettyPrintJSON(obj):
+ return json.dumps(obj, indent=2)
+
# These network condition values are used in SetNetworkConnection()
NETWORKS = {
'4G': {
@@ -201,12 +205,18 @@ class TestDriver:
_emulation_server: A reference to the emulation server being used
_emulation_server_port: If this is not set to -1, the emulation server is
being used for the test and is available on this port
+ _enable_features: A string set of features to enable
+ _disable_features: A string set of features to disable
"""
def __init__(self, control_network_connection=False):
self._flags = ParseFlags()
self._driver = None
self._chrome_args = set()
+ # By default use the default_integration policy. It is the same as the
+ # default policy except that it disables GFE caching to make sure we are
+ # running the tests against the current server version.
+ self._experiment = 'default_integration'
self._url = ''
self._logger = GetLogger(name='TestDriver')
self._has_logs = False
@@ -215,6 +225,12 @@ class TestDriver:
self._network_connection = None
self._emulation_server = None
self._emulation_server_port = -1
+ self._enable_features = set()
+ self._disable_features = set()
+ # By default enable the NetworkService and DRPWithNetworkService. Individual
+ # tests may override this behavior.
+ self.EnableChromeFeature('NetworkService')
+ self.EnableChromeFeature('DataReductionProxyEnabledWithNetworkService')
def __enter__(self):
return self
@@ -251,6 +267,10 @@ class TestDriver:
a flag given in the code. In that case, check by the flag whether to
override the argument.
"""
+ # Set the Data Reduction Proxy experiment.
+ if self._experiment is not None:
+ self._chrome_args.add('--data-reduction-proxy-experiment=' +
+ self._experiment)
def GetDictKey(argument):
return argument.split('=', 1)[0]
if self._flags.browser_args and len(self._flags.browser_args) > 0:
@@ -262,13 +282,7 @@ class TestDriver:
for override_arg in shlex.split(self._flags.browser_args):
arg_key = GetDictKey(override_arg)
if (arg_key in original_args
- and original_args[arg_key] in self._chrome_args):
- if arg_key == '--enable-features':
- new_features = override_arg[len('--enable-features='):]
- self._chrome_args.remove(original_args[arg_key])
- override_arg = original_args[arg_key]+','+new_features
- self._logger.info('Appended features. %s', new_features)
- else:
+ and original_args[arg_key] in self._chrome_args):
self._chrome_args.remove(original_args[arg_key])
self._logger.info('Removed Chrome flag. %s', original_args[arg_key])
self._chrome_args.add(override_arg)
@@ -289,10 +303,12 @@ class TestDriver:
# Forward the Android port to the host machine.
address = 'tcp:%d' % self._emulation_server_port
_RunAdbCmd(['reverse', address, address])
+
capabilities = {
'loggingPrefs': {'performance': 'INFO'},
}
chrome_options = Options()
+
if self._control_network_connection:
capabilities.update({
'networkConnectionEnabled': True,
@@ -300,11 +316,19 @@ class TestDriver:
})
if not self._flags.android:
chrome_options.add_experimental_option('mobileEmulation',
- {'deviceName': 'Google Nexus 5'})
+ {'deviceName': 'Pixel 2'})
+
+ if len(self._enable_features) > 0:
+ self._chrome_args.add(
+ '--enable-features=%s' % ','.join(self._enable_features))
+ if len(self._disable_features) > 0:
+ self._chrome_args.add(
+ '--disable-features=%s' % ','.join(self._disable_features))
for arg in self._chrome_args:
chrome_options.add_argument(arg)
self._logger.info('Starting Chrome with these flags: %s',
str(self._chrome_args))
+
if self._flags.android:
chrome_options.add_experimental_option('androidPackage',
self._flags.android_package)
@@ -313,8 +337,10 @@ class TestDriver:
chrome_options.binary_location = self._flags.chrome_exec
self._logger.info('Using the Chrome binary at this path: %s',
self._flags.chrome_exec)
+
self._logger.debug('ChromeOptions will be parsed into these capabilities: '
- '%s', json.dumps(chrome_options.to_capabilities()))
+ '%s', PrettyPrintJSON(chrome_options.to_capabilities()))
+
driver = webdriver.Chrome(executable_path=self._flags.chrome_driver,
desired_capabilities=capabilities, chrome_options=chrome_options)
driver.command_executor._commands.update({
@@ -323,9 +349,11 @@ class TestDriver:
'setNetworkConditions':
('POST', '/session/$sessionId/chromium/network_conditions')})
self._driver = driver
+
if self._control_network_connection:
# Set network connection if it was called before LoadURL()
self.SetNetworkConnection(self._network_connection)
+
self.SleepUntilHistogramHasEntry(
'DataReductionProxy.ConfigService.FetchResponseCode',
sleep_intervals=self._flags.chrome_start_time)
@@ -337,6 +365,14 @@ class TestDriver:
self._driver.quit()
self._driver = None
+ def SetExperiment(self, exp):
+ """Sets the Data Reduction Proxy experiment to use.
+
+ Args:
+ exp: a string with the experiment name.
+ """
+ self._experiment = exp
+
def AddChromeArgs(self, args):
"""Adds multiple arguments that will be passed to Chromium at start.
@@ -352,9 +388,36 @@ class TestDriver:
Args:
arg: a string argument to pass to Chrome at start
"""
+ if '--enable-features' in arg:
+ raise Exception('AddChromeArg("--enable-features=Foo" is not supported. '
+ 'Please use EnableChromeFeature("Foo") instead.')
+ if '--disable-features' in arg:
+ raise Exception('AddChromeArg("--disable-features=Foo" is not supported. '
+ 'Please use DisableChromeFeature("Foo") instead.')
+
self._chrome_args.add(arg)
self._logger.debug('Adding Chrome arg: %s', arg)
+ def EnableChromeFeature(self, feature):
+ """Adds a single feature flag to add to `--enable-features`.
+
+ Args:
+ feature: the Chrome feature to enable
+ """
+ self._enable_features.add(feature)
+ if feature in self._disable_features:
+ self._disable_features.remove(feature)
+
+ def DisableChromeFeature(self, feature):
+ """Adds a single feature flag to add to `--disable-features`.
+
+ Args:
+ feature: the Chrome feature to enable
+ """
+ self._disable_features.add(feature)
+ if feature in self._enable_features:
+ self._enable_features.remove(feature)
+
def RemoveChromeArgs(self, args):
"""Removes multiple arguments that will no longer be passed to Chromium at
start.
@@ -446,13 +509,26 @@ class TestDriver:
url: The URL to navigate to.
timeout: The time in seconds to load the page before timing out.
"""
+ # Reduce some flakiness by checking if we should ensure the proxy has fully
+ # initialized first.
+ if not self._driver:
+ self._StartDriver()
+
+ disabled_config_service = False
+ for arg in self._chrome_args:
+ if 'DataReductionProxyConfigService/Disabled' in arg:
+ disabled_config_service = True
+ if (not disabled_config_service and
+ '--enable-spdy-proxy-auth' in self._chrome_args and
+ 'DataReductionProxyEnabledWithNetworkService' in self._enable_features):
+ self._driver.get('data:,')
+ self.SleepUntilHistogramHasEntry(
+ 'DataReductionProxy.ConfigService.FetchResponseCode', sleep_intervals=5)
self._url = url
if (len(urlparse.urlparse(url).netloc) == 0 and
len(urlparse.urlparse(url).scheme) == 0):
self._logger.warn('Invalid URL: "%s". Did you forget to prepend '
'"http://"? See RFC 1808 for more information', url)
- if not self._driver:
- self._StartDriver()
self._driver.set_page_load_timeout(timeout)
self._logger.debug('Set page load timeout to %f seconds', timeout)
self._driver.get(self._url)
@@ -520,6 +596,21 @@ class TestDriver:
Returns:
A dictionary object containing information about the histogram.
"""
+ js_query = 'statsCollectionController.getHistogram("%s")' % histogram
+ string_response = self.ExecuteJavascriptStatement(js_query, timeout)
+ self._logger.debug('Got %s histogram=%s', histogram, string_response)
+ return json.loads(string_response)
+
+ def GetBrowserHistogram(self, histogram, timeout=30):
+ """Gets a Chrome histogram as a dictionary object from browser process.
+
+ Args:
+ histogram: the name of the histogram to fetch
+ timeout: timeout for the underlying Javascript query.
+
+ Returns:
+ A dictionary object containing information about the histogram.
+ """
js_query = 'statsCollectionController.getBrowserHistogram("%s")' % histogram
string_response = self.ExecuteJavascriptStatement(js_query, timeout)
self._logger.debug('Got %s histogram=%s', histogram, string_response)
@@ -561,6 +652,7 @@ class TestDriver:
if self._driver:
self._StopDriver()
# Give a moment for Chrome to close and finish writing the netlog.
+ time.sleep(5)
if not self._net_log:
raise Exception('GetParsedNetLog() cannot be called before UseNetLog()')
temp_file = self._net_log
@@ -582,7 +674,8 @@ class TestDriver:
json_file_content = json_file_content[:end] + ']}'
return json.loads(json_file_content)
- def GetPerformanceLogs(self, method_filter=r'Network\.responseReceived'):
+ def GetPerformanceLogs(self, method_filter=r'Network\.(requestWillBeSent|' +
+ 'responseReceived)'):
"""Returns all logged Performance events from Chrome. Raises an Exception if
no pages have been loaded since the last time this function was called.
@@ -598,7 +691,7 @@ class TestDriver:
all_messages = []
for log in self._driver.execute('getLog', {'type': 'performance'})['value']:
message = json.loads(log['message'])['message']
- self._logger.debug('Got Performance log: %s', log['message'])
+ self._logger.debug('Got Performance log:\n%s', PrettyPrintJSON(message))
if re.match(method_filter, message['method']):
all_messages.append(message)
self._logger.info('Got %d performance logs with filter method=%s',
@@ -613,19 +706,18 @@ class TestDriver:
Args:
histogram_name: The name of the histogram to wait for
- sleep_intervals: The number of polling intervals, each polling cycle takes
- no more than 6 seconds.
+ sleep_intervals: The number of polling intervals, each polling cycle is 1s
Returns:
Whether the histogram exists
"""
- histogram = {}
- while(not histogram and sleep_intervals > 0):
- histogram = self.GetHistogram(histogram_name, 5)
- if (not histogram):
- time.sleep(1)
- sleep_intervals -= 1
+ while (sleep_intervals > 0):
+ if (self.GetHistogram(histogram_name, 3) or
+ self.GetBrowserHistogram(histogram_name, 3)):
+ return True
+ time.sleep(1)
+ sleep_intervals -= 1
- return bool(histogram)
+ return False
def GetHTTPResponses(self, include_favicon=False, skip_domainless_pages=True,
override_has_logs=False):
@@ -648,8 +740,12 @@ class TestDriver:
"""
if override_has_logs:
self._has_logs = True
- def MakeHTTPResponse(log_dict):
- params = log_dict['params']
+
+ all_requests = {} # map from requestId to params
+ all_responses = [] # list of HTTPResponse
+
+ def MakeHTTPResponse(message):
+ params = message['params']
response_dict = params['response']
http_response_dict = {
'response_headers': response_dict['headers'] if 'headers' in
@@ -662,11 +758,22 @@ class TestDriver:
'port': response_dict['remotePort'] if 'remotePort' in response_dict
else -1,
'status': response_dict['status'] if 'status' in response_dict else -1,
- 'request_type': params['type'] if 'type' in params else ''
+ 'request_type': params['type'] if 'type' in params else '',
+ 'redirect_chain': [],
}
+ if params['requestId'] in all_requests:
+ for request in all_requests[params['requestId']][:-1]:
+ http_response_dict['redirect_chain'].append(request['request']['url'])
return HTTPResponse(**http_response_dict)
- all_responses = []
+
for message in self.GetPerformanceLogs():
+ if message['method'] == 'Network.requestWillBeSent':
+ requestId = message['params']['requestId']
+ if requestId not in all_requests:
+ all_requests[requestId] = [message['params']]
+ else:
+ all_requests[requestId].append(message['params'])
+ continue
response = MakeHTTPResponse(message)
self._logger.debug('New HTTPResponse: %s', str(response))
is_favicon = response.url.endswith('favicon.ico')
@@ -701,7 +808,7 @@ class HTTPResponse:
"""
def __init__(self, response_headers, request_headers, url, protocol, port,
- status, request_type):
+ status, request_type, redirect_chain):
self._response_headers = {}
self._request_headers = {}
self._url = url
@@ -709,6 +816,7 @@ class HTTPResponse:
self._port = port
self._status = status
self._request_type = request_type
+ self._redirect_chain = redirect_chain # empty if no redirects
self._flags = ParseFlags()
# Make all header names lower case.
for name in response_headers:
@@ -717,16 +825,16 @@ class HTTPResponse:
self._request_headers[name.lower()] = request_headers[name]
def __str__(self):
- self_dict = {
+ return PrettyPrintJSON({
'response_headers': self._response_headers,
'request_headers': self._request_headers,
'url': self._url,
'protocol': self._protocol,
'port': self._port,
'status': self._status,
- 'request_type': self._request_type
- }
- return json.dumps(self_dict, indent=2)
+ 'request_type': self._request_type,
+ 'redirect_chain': self._redirect_chain,
+ })
@property
def response_headers(self):
@@ -756,9 +864,13 @@ class HTTPResponse:
def request_type(self):
return self._request_type
+ @property
+ def redirect_chain(self):
+ return self._redirect_chain
+
def ResponseHasViaHeader(self):
- return 'via' in self._response_headers and (self._response_headers['via'] ==
- self._flags.via_header_value)
+ return 'via' in self._response_headers and (self._flags.via_header_value in
+ [piece.strip() for piece in self._response_headers['via'].split(',')])
def WasXHR(self):
return self.request_type == 'XHR'
@@ -837,12 +949,20 @@ class IntegrationTest(unittest.TestCase):
"""
infobar_histogram_name = 'Previews.InfoBarAction.%s' % preview_type
android_histogram_name = 'Previews.OmniboxAction.%s' % preview_type
-
- infobar_histogram = test_driver.GetHistogram(infobar_histogram_name, 5)
- android_histogram = test_driver.GetHistogram(android_histogram_name, 5)
-
- count = (infobar_histogram.get('count', 0)
- + android_histogram.get('count', 0))
+ testing_histogram_name = 'Previews.PreviewShown.%s' % preview_type
+
+ infobar_histogram = test_driver.GetBrowserHistogram(
+ infobar_histogram_name, 5)
+ android_histogram = test_driver.GetBrowserHistogram(
+ android_histogram_name, 5)
+ testing_histogram = test_driver.GetBrowserHistogram(
+ testing_histogram_name, 5)
+
+ count = sum([
+ infobar_histogram.get('count', 0),
+ android_histogram.get('count', 0),
+ testing_histogram.get('count', 0),
+ ])
return count > 0
def assertPreviewShownViaHistogram(self, test_driver, preview_type):
diff --git a/chromium/tools/chrome_proxy/webdriver/compression_regression.py b/chromium/tools/chrome_proxy/webdriver/compression_regression.py
deleted file mode 100644
index 6b7b99e0c2b..00000000000
--- a/chromium/tools/chrome_proxy/webdriver/compression_regression.py
+++ /dev/null
@@ -1,389 +0,0 @@
-# Copyright 2017 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import datetime
-import json
-import math
-import subprocess
-import time
-
-import common
-from common import TestDriver
-from common import IntegrationTest
-from decorators import NotAndroid
-from decorators import Slow
-
-# The maximum number of data points that will be saved.
-MAX_DATA_POINTS = 365
-
-# The number of days in the past to compute the average of for regression
-# alerting.
-ALERT_WINDOW = 31
-
-# The amount of tolerable difference a single data point can be away from the
-# average without alerting. This is a percentage from 0.0 to 1.0 inclusive.
-# 3% was chosen because over the course of the first month no change was seen to
-# 8 decimal places. Erring on the more sensitive side to begin with is also
-# better so we get a better feel for the timing and degree of regressions.
-THRESHOLD = 0.03
-
-# The format to use when recording dates in the DATA_FILE
-DATE_FORMAT = '%Y-%m-%d'
-
-# The persistant storage for compression data is kept in Google Storage with
-# this bucket name.
-BUCKET = 'chrome_proxy_compression'
-
-# The data file name in the Google Storage bucket, above. The data file is also
-# saved locally under the same name.
-DATA_FILE = 'compression_data.json'
-
-class CompressionRegression(IntegrationTest):
- """This class is responsible for alerting the Chrome Proxy team to regression
- in the compression metrics of the proxy. At present, this class will simply
- gather data and save it to a Google Storage bucket. Once enough data has been
- gathered to form a reasonable model, alerting will be added to check for
- regression.
-
- Before running the test, this class will fetch the JSON data file from Google
- Storage in a subprocess and store it on the local disk with the same file
- name. The data is then read from that file. After running the test, if the
- data has changed the file will be uploaded back to Google Storage.
-
- The JSON data object and data dict object used widely in this class has the
- following structure:
- {
- "2017-02-29": {
- "html": 0.314,
- "jpg": 0.1337,
- "png": 0.1234,
- "mp4": 0.9876
- }
- }
- where keys are date stamps in the form "YYYY-MM-DD", and each key in the child
- object is the resource type with its compression value.
-
- Also frequently referenced is the compression_average dict object, which
- contains the compression data just now gathered from Chrome in
- getCurrentCompressionMetrics(). That object has the following structure:
- {
- "test/html": 0.314,
- "image/jpg": 0.1337,
- "image/png": 0.1234,
- "video/mp4": 0.9876
- }
- where keys are the content type with its compression value.
-
- Due to the complexity of several methods in this class, a number of local
- unit tests can be found at the bottom of this file.
-
- Please note that while this test uses the IntegrationTest framework, it is
- classified as a regression test.
- """
-
- @Slow
- @NotAndroid
- def testCompression(self):
- """This function is the main test function for regression compression
- checking and facilitates the test with all of the helper functions'
- behavior.
- """
- compression_average = self.getCurrentCompressionMetricsWithRetry()
- self.fetchFromGoogleStorage()
- data = {}
- with open(DATA_FILE, 'r') as data_fp:
- data = json.load(data_fp)
- if self.updateDataObject(compression_average, data):
- with open(DATA_FILE, 'w') as data_fp:
- json.dump(data, data_fp)
- self.uploadToGoogleStorage()
-
- def getCurrentCompressionMetricsWithRetry(self, max_attempts=10):
- """This function allows some number of attempts to be tried to fetch
- compressed responses. Sometimes, the proxy will not have compressed results
- available immediately, especially for video resources.
-
- Args:
- max_attempts: the maximum number of attempts to try to fetch compressed
- resources.
- Returns:
- a dict object mapping resource type to compression
- """
- attempts = 0
- while attempts < max_attempts:
- try:
- return self.getCurrentCompressionMetrics()
- except Exception as e:
- attempts += 1
- time.sleep(2)
- if attempts >= max_attempts:
- raise Exception("Didn't get good response after %d attempts" % attempts)
-
- def getCurrentCompressionMetrics(self):
- """This function uses the ChromeDriver framework to open Chrome and navigate
- to a number of static resources of different types, like jpg, png, mp4, gif,
- html. Multiple resources of a single type are supported. This function will
- check that each resource was fetched via the Chrome Proxy, and then compute
- the compression as a percentage from the Content-Length and OFCL in
- Chrome-Proxy headers where compression = 1 - (cl / ofcl). The function will
- then return the average compression for each of the resource types.
-
- Returns:
- a dict object mapping resource type to compression
- """
- def AddToCompression(compression, key, value):
- if key in compression:
- compression[key].append(value)
- else:
- compression[key] = [value]
- with TestDriver() as t:
- t.AddChromeArg('--enable-spdy-proxy-auth')
- t.AddChromeArg('--data-reduction-proxy-server-experiments-disabled')
- t.LoadURL('http://check.googlezip.net/metrics/local.gif')
- t.LoadURL('http://check.googlezip.net/metrics/local.png')
- t.LoadURL('http://check.googlezip.net/metrics/local.jpg')
- t.LoadURL(
- 'http://check.googlezip.net/cacheable/video/buck_bunny_tiny.html')
- compression = {}
- for response in t.GetHTTPResponses():
- # Check that the response was proxied.
- self.assertHasProxyHeaders(response)
- # Compute compression metrics.
- cl = response.response_headers['content-length']
- ofcl = getChromeProxyOFCL(response)
- content_type = response.response_headers['content-type']
- compression_rate = 1.0 - (float(cl) / float(ofcl))
- if 'html' in response.response_headers['content-type']:
- AddToCompression(compression, 'html', compression_rate)
- else:
- resource = response.url[response.url.rfind('/'):]
- AddToCompression(compression, resource[resource.rfind('.') + 1:],
- compression_rate)
- # Compute the average compression for each resource type.
- compression_average = {}
- for resource_type in compression:
- compression_average[resource_type] = (sum(compression[resource_type]) /
- float(len(compression[resource_type])))
- return compression_average
-
- # Returns the ofcl value in chrome-proxy header.
- def getChromeProxyOFCL(self, response):
- self.assertIn('chrome-proxy', response.response_headers)
- chrome_proxy_header = response.response_headers['chrome-proxy']
- self.assertIn('ofcl=', chrome_proxy_header)
- return chrome_proxy_header.split('ofcl=', 1)[1].split(',', 1)[0]
-
-
- def updateDataObject(self, compression_average, data,
- today=datetime.date.today()):
- """This function handles the updating of the data object when new data is
- available. Given the existing data object, the results of the
- getCurrentCompressionMetrics() func, and a date object, it will check if
- data exists for today. If it does, the method will do nothing and return
- False. Otherwise, it will update the data object with the compression data.
- If needed, it will also find the least recent entry in the data object and
- remove it.
-
- Args:
- compression_average: the compression data from
- getCurrentCompressionMetrics()
- data: all saved results from previous runs
- today: a date object, specifiable here for testing purposes.
- Returns:
- True iff the data object was changed
- """
- datestamp = today.strftime(DATE_FORMAT)
- # Check if this data has already been recorded.
- if datestamp in data:
- return False
- # Append new data, removing the least recent if needed.
- data[datestamp] = compression_average
- if len(data) > MAX_DATA_POINTS:
- min_date = None
- for date_str in data:
- date = datetime.date(*[int(d) for d in date_str.split('-')])
- if min_date == None or date < min_date:
- min_date = date
- del data[min_date.strftime(DATE_FORMAT)]
- return True
-
- def checkForRegression(self, data, compression_average):
- """This function checks whether the current data point in
- compression_average falls outside an allowable tolerance for the last
- ALERT_WINDOW days of data points in data. If so, an expection will be
- rasied.
-
- Args:
- data: all saved results from previous runs
- compression_average: the most recent data point
- """
- # Restructure data to be easily summable.
- data_sum_rt = {}
- for date in sorted(data, reverse=True):
- for resource_type in data[date]:
- if resource_type not in data_sum_rt:
- data_sum_rt[resource_type] = []
- data_sum_rt[resource_type].append(data[date][resource_type])
- # Compute average over ALERT_WINDOW if there is enough data points.
- # Data average will contain average compression ratios (eg: 1 - cl / ofcl).
- data_average = {}
- for resource_type in data_sum_rt:
- if len(data_sum_rt[resource_type]) >= ALERT_WINDOW:
- data_average[resource_type] = sum(
- data_sum_rt[resource_type][:ALERT_WINDOW]) / ALERT_WINDOW
- # Check regression, raising an exception if anything is detected.
- for resource_type in compression_average:
- if resource_type in data_average:
- expected = data_average[resource_type]
- actual = compression_average[resource_type]
- # Going over the max is ok, better compression is better.
- min_allowable = expected - THRESHOLD
- if actual < min_allowable:
- raise Exception('%s compression has regressed to %f' %
- (resource_type, actual))
-
- def uploadToGoogleStorage(self):
- """This function uses the gsutil command to upload the local data file to
- Google Storage.
- """
- gs_location = 'gs://%s/%s' % (BUCKET, DATA_FILE)
- cmd = ['gsutil', 'cp', DATA_FILE, gs_location]
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- stdout, stderr = proc.communicate()
- if proc.returncode:
- raise Exception('Uploading to Google Storage failed! output: %s %s' %
- (stdout, stderr))
-
- def fetchFromGoogleStorage(self):
- """This function uses the gsutil command to fetch the local data file from
- Google Storage.
- """
- gs_location = 'gs://%s/%s' % (BUCKET, DATA_FILE)
- cmd = ['gsutil', 'cp', gs_location, DATA_FILE]
- proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- stdout, stderr = proc.communicate()
- if proc.returncode:
- raise Exception('Fetching to Google Storage failed! output: %s %s' %
- (stdout, stderr))
-
- def test0UpdateDataObject_NoUpdate(self):
- """This unit test asserts that the updateDataObject() function doesn't
- update the data object when today is already contained in the data object.
- """
- data = { '2017-02-06': {'hello': 'world'}}
- new_data = {'Benoit': 'Mandelbrot'}
- test_day = datetime.date(2017, 02, 06)
- changed = self.updateDataObject(new_data, data, today=test_day)
- self.assertFalse(changed, "No data should have been recorded!")
-
- def test0UpdateDataObject_Update(self):
- """This unit test asserts that the updateDataObject() function updates the
- data object when there is new data available, also removing the least recent
- data point.
- """
- start_date = datetime.date(2017, 2, 6)
- data = {}
- for i in range(MAX_DATA_POINTS):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'hello': 'world'}
- new_data = {'Benoit': 'Mandelbrot'}
- test_day = datetime.date(2017, 02, 06) + datetime.timedelta(
- days=(MAX_DATA_POINTS))
- changed = self.updateDataObject(new_data, data, today=test_day)
- self.assertTrue(changed, "Data should have been recorded!")
- self.assertNotIn('2017-02-06', data)
- self.assertIn(test_day.strftime(DATE_FORMAT), data)
-
- def test0CheckForRegressionAverageRecent(self):
- """Make sure the checkForRegression() uses only the most recent data points.
- """
- data = {}
- start_date = datetime.date(2017, 2, 6)
- for i in range(2 * ALERT_WINDOW):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'mp4': 0.1}
- start_date = datetime.date(2017, 2, 6) + datetime.timedelta(days=(2 *
- ALERT_WINDOW))
- for i in range(ALERT_WINDOW):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'mp4': 0.9}
- # Expect no exception since the most recent data should have been used.
- self.checkForRegression(data, {'mp4': 0.9})
-
- def test0CheckForRegressionOnlySufficientData(self):
- """Make sure the checkForRegression() only checks resource types that have
- at least ALERT_WINDOW many data points.
- """
- data = {}
- start_date = datetime.date(2017, 2, 6)
- for i in range(2 * ALERT_WINDOW):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'mp4': 0.1}
- start_date = datetime.date(2017, 2, 6) + datetime.timedelta(days=(2 *
- ALERT_WINDOW))
- for i in range(ALERT_WINDOW):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'mp4': 0.9}
- for i in range(ALERT_WINDOW / 2):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'html': 0.3}
- # Expect no exception since the html should have been ignored for not having
- # enough data points.
- self.checkForRegression(data, {'mp4': 0.9, 'html': 0.1})
-
- def test0CheckForRegressionMismatchResourceTypes(self):
- """Make sure resource types that appear in only one of compression_average,
- data are not used or expected.
- """
- # Check using an extra resource type in the compression_average object.
- data = {}
- start_date = datetime.date(2017, 2, 6)
- for i in range(ALERT_WINDOW):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'mp4': 0.9}
- self.checkForRegression(data, {'mp4': 0.9, 'html': 0.2})
- # Check using an extra resource type in the data object.
- data = {}
- start_date = datetime.date(2017, 2, 6)
- for i in range(ALERT_WINDOW):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'mp4': 0.9, 'html': 0.2}
- self.checkForRegression(data, {'mp4': 0.9})
-
- def test0CheckForRegressionNoAlert(self):
- """Make sure checkForRegression does not alert when a new data point falls
- on the threshold.
- """
- data = {}
- start_date = datetime.date(2017, 2, 6)
- for i in range(ALERT_WINDOW):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'mp4': 0.9}
- self.checkForRegression(data, {'mp4': (0.9 - THRESHOLD)})
-
- def test0CheckForRegressionAlert(self):
- """Make sure checkForRegression does alert when a new data point falls
- outside of the threshold.
- """
- data = {}
- start_date = datetime.date(2017, 2, 6)
- for i in range(ALERT_WINDOW):
- date_obj = start_date + datetime.timedelta(days=i)
- datestamp = date_obj.strftime(DATE_FORMAT)
- data[datestamp] = {'mp4': 0.9}
- self.assertRaises(Exception, self.checkForRegression, data, {'mp4':
- (0.9 - THRESHOLD - 0.01)})
-
-
-if __name__ == '__main__':
- IntegrationTest.RunAllTests()
diff --git a/chromium/tools/chrome_proxy/webdriver/data_use.py b/chromium/tools/chrome_proxy/webdriver/data_use.py
deleted file mode 100644
index 0a004d535e3..00000000000
--- a/chromium/tools/chrome_proxy/webdriver/data_use.py
+++ /dev/null
@@ -1,44 +0,0 @@
-# Copyright 2016 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import os
-
-import common
-from common import TestDriver
-from common import IntegrationTest
-from decorators import NotAndroid
-
-
-class DataUseAscription(IntegrationTest):
-
- # This test uses a desktop extension and cannot be run on Android.
- @NotAndroid
- def testDataUseAscription(self):
- ext_path = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir,
- os.pardir, 'chrome', 'test', 'data',
- 'chromeproxy', 'extension')
- with TestDriver() as t:
- t.AddChromeArg('--enable-spdy-proxy-auth')
- t.AddChromeArg('--load-extension=%s' % ext_path)
-
- # Load the URL and verify the via header appears.
- t.LoadURL('http://check.googlezip.net/test.html')
- responses = t.GetHTTPResponses()
- for response in responses:
- self.assertHasProxyHeaders(response)
-
- # Load the extension page and verify the host appears in data use list.
- t.LoadURL('chrome-extension://pfmgfdlgomnbgkofeojodiodmgpgmkac/'
- 'detailed_data_usage.html')
- xpath = ('//span[@class=\'hostname\' and '
- 'contains(text(),\'check.googlezip.net\')]')
- js_xpath_query = ("document.evaluate(\"%s\", document, null, "
- "XPathResult.ANY_UNORDERED_NODE_TYPE, null )"
- ".singleNodeValue;" % xpath)
- has_expected_host = bool(t.ExecuteJavascriptStatement(js_xpath_query))
- self.assertTrue(has_expected_host,
- "Test host failed to appear in data use page")
-
-if __name__ == '__main__':
- IntegrationTest.RunAllTests()
diff --git a/chromium/tools/chrome_proxy/webdriver/fallback.py b/chromium/tools/chrome_proxy/webdriver/fallback.py
index 240ff5b71d0..c50d266136d 100644
--- a/chromium/tools/chrome_proxy/webdriver/fallback.py
+++ b/chromium/tools/chrome_proxy/webdriver/fallback.py
@@ -5,7 +5,6 @@
import common
from common import TestDriver
from common import IntegrationTest
-from decorators import ChromeVersionBeforeM
class Fallback(IntegrationTest):
@@ -14,9 +13,6 @@ class Fallback(IntegrationTest):
def testSecureProxyProbeFallback(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg(
- '--enable-features=NetworkService,'
- 'DataReductionProxyEnabledWithNetworkService')
# Set the secure proxy check URL to the google.com favicon, which will be
# interpreted as a secure proxy check failure since the response body is
@@ -28,7 +24,7 @@ class Fallback(IntegrationTest):
'http://www.google.com/favicon.ico')
# Start chrome to begin the secure proxy check
- test_driver.LoadURL('http://www.google.com/favicon.ico')
+ test_driver.LoadURL('about:blank')
self.assertTrue(
test_driver.SleepUntilHistogramHasEntry("DataReductionProxy.ProbeURL"))
@@ -36,42 +32,15 @@ class Fallback(IntegrationTest):
test_driver.LoadURL('http://check.googlezip.net/test.html')
responses = test_driver.GetHTTPResponses()
self.assertNotEqual(0, len(responses))
+ # Verify that DataReductionProxy.ProbeURL histogram has one entry in
+ # FAILED_PROXY_DISABLED, which is bucket=1.
+ histogram = test_driver.GetBrowserHistogram('DataReductionProxy.ProbeURL')
+ self.assertEqual(histogram['count'], 1)
+ self.assertEqual(histogram['buckets'][0]['low'], 1)
for response in responses:
self.assertHasProxyHeaders(response)
- self.assertEqual(u'http/2+quic/43', response.protocol)
-
- # Verify that when Chrome receives a non-4xx response through a Data Reduction
- # Proxy that doesn't set a proper via header, Chrome falls back to the next
- # available proxy.
- @ChromeVersionBeforeM(67)
- def testMissingViaHeaderNon4xxFallback(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
-
- # Set the primary Data Reduction Proxy to be the test server, which does
- # not add any Via headers. The fallback Data Reduction Proxy is set to the
- # canonical Data Reduction Proxy target.
- test_driver.AddChromeArg('--data-reduction-proxy-http-proxies='
- 'https://chromeproxy-test.appspot.com;'
- 'http://compress.googlezip.net')
-
- # Load a page that should fall back off of the test server proxy, and onto
- # the canonical proxy that will set the correct Via header.
- test_driver.LoadURL('http://chromeproxy-test.appspot.com/default')
- responses = test_driver.GetHTTPResponses()
- self.assertNotEqual(0, len(responses))
- for response in responses:
- self.assertHasProxyHeaders(response)
- self.assertEqual(u'http/1.1', response.protocol)
-
- # Check that the BypassTypePrimary histogram has a single entry in the
- # MissingViaHeaderOther category (which is enum value 5), to make sure
- # that the bypass was caused by the missing via header logic and not
- # something else.
- histogram = test_driver.GetHistogram(
- "DataReductionProxy.BypassTypePrimary")
- self.assertEqual(1, histogram['count'])
- self.assertIn({'count': 1, 'high': 6, 'low': 5}, histogram['buckets'])
+ # TODO(rajendrant): Fix the correct protocol received.
+ # self.assertEqual(u'http/2+quic/43', response.protocol)
# DataSaver uses a https proxy by default, if that fails it will fall back to
# a http proxy; and if that fails, it will fall back to a direct connection
diff --git a/chromium/tools/chrome_proxy/webdriver/https_previews.py b/chromium/tools/chrome_proxy/webdriver/https_previews.py
index e4cbe832964..5555ed4b07c 100644
--- a/chromium/tools/chrome_proxy/webdriver/https_previews.py
+++ b/chromium/tools/chrome_proxy/webdriver/https_previews.py
@@ -16,6 +16,7 @@ from selenium.common.exceptions import TimeoutException
NAV_THROTTLE_VERSION = "v1_NavThrottle"
URL_LOADER_VERSION = "v2_URLLoader"
+LITEPAGES_REGEXP = r'https://\w+\.litepages\.googlezip\.net/.*'
# These are integration tests for server provided previews and the
# protocol that supports them. This class is intended as an abstract base class
@@ -30,44 +31,35 @@ class HttpsPreviewsBaseClass():
version = self.getVersion()
# These feature flags are common to both versions.
- features = [
- "Previews",
- "LitePageServerPreviews",
- # Just in case NetworkService is on. Has no effect otherwise.
- "DataReductionProxyEnabledWithNetworkService",
- ]
+ t.EnableChromeFeature('Previews')
+ t.EnableChromeFeature('LitePageServerPreviews')
+
+ # RLH and NoScript may disable use of LitePageRedirect Previews.
+ t.DisableChromeFeature('ResourceLoadingHints')
+ t.DisableChromeFeature('NoScriptPreviews')
if version == NAV_THROTTLE_VERSION:
# No additional flags here, but explicitly check it given the else below.
pass
elif version == URL_LOADER_VERSION:
- features += [
- "HTTPSServerPreviewsUsingURLLoader",
- "NetworkService",
- ]
+ t.EnableChromeFeature('HTTPSServerPreviewsUsingURLLoader')
else:
raise Exception('"%s" is not a valid version' % version)
- t.AddChromeArg('--enable-features=' + ','.join(features))
-
t.AddChromeArg('--enable-spdy-proxy-auth')
t.AddChromeArg('--dont-require-litepage-redirect-infobar')
- t.AddChromeArg('--ignore-previews-blocklist')
+ t.AddChromeArg('--ignore-previews-blacklist')
t.AddChromeArg('--force-effective-connection-type=2G')
t.AddChromeArg('--ignore-litepage-redirect-optimization-blacklist')
- t.AddChromeArg('--data-reduction-proxy-experiment='
- 'external_chrome_integration_test')
-
- # Start Chrome and wait for initialization.
- t.LoadURL('data:,')
- t.SleepUntilHistogramHasEntry(
- 'DataReductionProxy.ConfigService.FetchResponseCode')
+ t.SetExperiment('external_chrome_integration_test')
def _AssertShowingLitePage(self, t, expectedText, expectedImages):
"""Asserts that Chrome has loaded a Lite Page from the litepages server.
Args:
t: the TestDriver object.
+ expectedText: text that should appear in the HTML response body.
+ expectedImages: the number of images that should be fetched.
"""
lite_page_responses = 0
image_responses = 0
@@ -76,15 +68,12 @@ class HttpsPreviewsBaseClass():
content_type = ''
if 'content-type' in response.response_headers:
content_type = response.response_headers['content-type']
-
if 'text/html' in content_type:
- self.assertRegexpMatches(response.url,
- r"https://\w+\.litepages\.googlezip\.net/")
+ self.assertRegexpMatches(response.url, LITEPAGES_REGEXP)
self.assertEqual(200, response.status)
lite_page_responses += 1
if 'image/' in content_type:
- self.assertRegexpMatches(response.url,
- r"https://\w+\.litepages\.googlezip\.net/")
+ self.assertRegexpMatches(response.url, LITEPAGES_REGEXP)
self.assertEqual(200, response.status)
image_responses += 1
@@ -96,11 +85,15 @@ class HttpsPreviewsBaseClass():
self.assertPreviewShownViaHistogram(t, 'LitePageRedirect')
- def _AssertShowingOriginalPage(self, t, expectedURL, expectedStatus):
+ def _AssertShowingOriginalPage(self, t, expectedURL, expectedStatus,
+ expectedBypassCount = 1):
"""Asserts that Chrome has not loaded a Lite Page from the litepages server.
Args:
t: the TestDriver object.
+ expectedURL: the URL of the mainframe HTML response.
+ expectedStatus: the HTTP response status for the mainframe HTML response.
+ expectBypass: true if we expect a bypass from the litepages server.
"""
html_responses = 0
@@ -109,8 +102,10 @@ class HttpsPreviewsBaseClass():
self.assertEqual(expectedStatus, response.status)
html_responses += 1
+ bypass_count = t.GetBrowserHistogram(
+ 'Previews.ServerLitePage.ServerResponse', 2)
self.assertEqual(1, html_responses)
-
+ self.assertEqual(expectedBypassCount, bypass_count['count'])
self.assertPreviewNotShownViaHistogram(t, 'LitePageRedirect')
# Verifies that a Lite Page is not served when the server returns a bypass.
@@ -122,6 +117,23 @@ class HttpsPreviewsBaseClass():
t.LoadURL(url)
self._AssertShowingOriginalPage(t, url, 200)
+ # Verifies that a Lite Page is not served when the server returns a bypass.
+ # Additionally, verifies that after receiving the host-blacklisted directive,
+ # previews will not be attempted for future navigations on the same host.
+ @ChromeVersionEqualOrAfterM(74)
+ def testServerReturnsBypassWithHostBlacklisted(self):
+ with TestDriver() as t:
+ self.EnableLitePageServerPreviewsAndInit(t)
+ url = 'https://mobilespeed-test2.appspot.com/static/litepagetests/bypass.html'
+ t.LoadURL(url)
+ self._AssertShowingOriginalPage(t, url, 200)
+ # Ensure the reload doesn't use a cached page.
+ t.LoadURL('chrome://settings/clearBrowserData')
+ # This second navigation should not attempt a preview, so the bypass count
+ # should not have been incremented a second time.
+ t.LoadURL(url)
+ self._AssertShowingOriginalPage(t, url, 200, expectedBypassCount = 1)
+
# Verifies that a Lite Page is not served when the server returns a 404.
@ChromeVersionEqualOrAfterM(74)
def testServerReturns404(self):
@@ -140,7 +152,6 @@ class HttpsPreviewsBaseClass():
self._AssertShowingLitePage(t, 'Hello world', 1)
# Verifies that a Lite Page pageload sends a DRP pingback.
- # TODO(robertogden): Set this to M73 once merged.
@ChromeVersionEqualOrAfterM(74)
def testPingbackSent(self):
with TestDriver() as t:
@@ -156,9 +167,9 @@ class HttpsPreviewsBaseClass():
t.SleepUntilHistogramHasEntry("DataReductionProxy.Pingback.Succeeded")
# Verify one pingback attempt that was successful.
- attempted = t.GetHistogram('DataReductionProxy.Pingback.Attempted')
+ attempted = t.GetBrowserHistogram('DataReductionProxy.Pingback.Attempted')
self.assertEqual(1, attempted['count'])
- succeeded = t.GetHistogram('DataReductionProxy.Pingback.Succeeded')
+ succeeded = t.GetBrowserHistogram('DataReductionProxy.Pingback.Succeeded')
self.assertEqual(1, succeeded['count'])
# Verifies that a Lite Page is served when the main frame response is a
@@ -182,8 +193,8 @@ class HttpsPreviewsBaseClass():
# BadSSL onterstitials are not actually shown in webdriver tests (they
# seem to be clicked through automatically). This histogram is incremented
# after an interstitial has been clicked.
- histogram = t.GetHistogram('interstitial.ssl.visited_site_after_warning',
- 1)
+ histogram = t.GetBrowserHistogram(
+ 'interstitial.ssl.visited_site_after_warning', 1)
self.assertEqual(1, histogram['count'])
# Verifies that a safebrowsing interstitial is shown (instead of a Lite Page)
@@ -198,7 +209,7 @@ class HttpsPreviewsBaseClass():
t.LoadURL('https://testsafebrowsing.appspot.com/s/malware.html')
self.fail('expected timeout')
except TimeoutException:
- histogram = t.GetHistogram('SB2.ResourceTypes2.Unsafe')
+ histogram = t.GetBrowserHistogram('SB2.ResourceTypes2.Unsafe')
self.assertEqual(1, histogram['count'])
@@ -216,9 +227,8 @@ class HttpsPreviewsBaseClass():
# Verify that the request is served by a Lite Page.
lite_page_responses = 0
- lite_page_regexp = re.compile('https://\w+\.litepages\.googlezip\.net/p')
for response in t.GetHTTPResponses():
- if lite_page_regexp.search(response.url) and response.status == 200:
+ if re.match(LITEPAGES_REGEXP, response.url) and response.status == 200:
lite_page_responses += 1
self.assertEqual(1, lite_page_responses)
@@ -230,7 +240,11 @@ class HttpsPreviewsBaseClass():
# Collect IDs of expected reporting requests.
report_request_id = []
for event in events:
- if not "params" in event or not "headers" in event["params"]:
+ if "params" not in event:
+ continue
+ if event.get("params") is None:
+ continue
+ if "headers" not in event.get("params"):
continue
header = event["params"]["headers"]
@@ -263,5 +277,31 @@ class HttpsPreviewsURLLoader(HttpsPreviewsBaseClass, IntegrationTest):
def getVersion(self):
return URL_LOADER_VERSION
+ # Verifies that if a streaming preview is being served but needs to be
+ # aborted, changing location.href will load the original page.
+ #
+ # This test only works for the URLLoader version.
+ @ChromeVersionEqualOrAfterM(75)
+ def testChromeStreamingAbort(self):
+ url = 'https://mobilespeed-test.appspot.com/static/litepagetests/simple.html'
+ with TestDriver() as t:
+ self.EnableLitePageServerPreviewsAndInit(t)
+ t.LoadURL(url)
+ self._AssertShowingLitePage(t, 'Hello world', 1)
+ self.assertNotEqual(url,
+ t.ExecuteJavascriptStatement('window.location.href'))
+
+ # Although this is not a streaming DOM, the critical behavior to be tested
+ # is that once a preview is committed in the renderer, changing
+ # location.href loads the original page. The timing of this call is not
+ # important.
+ t.ExecuteJavascriptStatement('window.location.href += "&abort"')
+
+ t.SleepUntilHistogramHasEntry('Previews.PageEndReason.LitePageRedirect',
+ 30)
+
+ self.assertEqual(url,
+ t.ExecuteJavascriptStatement('window.location.href'))
+
if __name__ == '__main__':
IntegrationTest.RunAllTests()
diff --git a/chromium/tools/chrome_proxy/webdriver/lite_page.py b/chromium/tools/chrome_proxy/webdriver/lite_page.py
index 5c1bf497c6e..d0f8aa5e266 100644
--- a/chromium/tools/chrome_proxy/webdriver/lite_page.py
+++ b/chromium/tools/chrome_proxy/webdriver/lite_page.py
@@ -27,20 +27,11 @@ class LitePage(IntegrationTest):
in common.ParseFlags().browser_args):
self.skipTest('This test cannot be run with other experiments.')
with TestDriver() as test_driver:
+ test_driver.EnableChromeFeature('Previews')
+ test_driver.EnableChromeFeature('DataReductionProxyDecidesTransform')
+ test_driver.SetExperiment('ignore_preview_blacklist')
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features=NetworkQualityEstimator'
- '<NetworkQualityEstimator,'
- 'Previews,DataReductionProxyDecidesTransform,'
- 'NetworkService,'
- 'DataReductionProxyEnabledWithNetworkService')
- test_driver.AddChromeArg(
- '--force-fieldtrial-params=NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/2G,'
- 'DataReductionProxyServerExperiments.IgnoreCountryBlacklist:'
- 'exp/ignore_preview_blacklist')
- test_driver.AddChromeArg(
- '--force-fieldtrials=NetworkQualityEstimator/Enabled/'
- 'DataReductionProxyServerExperiments/IgnoreCountryBlacklist')
+ test_driver.AddChromeArg('--force-effective-connection-type=2G')
test_driver.LoadURL('http://check.googlezip.net/test.html')
@@ -71,84 +62,6 @@ class LitePage(IntegrationTest):
self.assertPreviewShownViaHistogram(test_driver, 'LitePage')
- # Checks that a Lite Page is served and the force_lite_page experiment
- # directive is provided when always-on.
- # Note: this test is only on M-60+ which supports exp=force_lite_page
- @ChromeVersionEqualOrAfterM(60)
- @ChromeVersionBeforeM(65)
- def testLitePageForcedExperiment(self):
- # If it was attempted to run with another experiment, skip this test.
- if common.ParseFlags().browser_args and ('--data-reduction-proxy-experiment'
- in common.ParseFlags().browser_args):
- self.skipTest('This test cannot be run with other experiments.')
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features=NetworkQualityEstimator'
- '<NetworkQualityEstimator,'
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=always-on')
- test_driver.AddChromeArg('--enable-data-reduction-proxy-lite-page')
-
- # Force ECT to be 4G to confirm that we get Lite Page even for fast
- # conneciton.
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/4G')
- test_driver.AddChromeArg('--force-fieldtrials='
- 'NetworkQualityEstimator/Enabled/')
-
- test_driver.LoadURL('http://check.googlezip.net/test.html')
-
- lite_page_responses = 0
- for response in test_driver.GetHTTPResponses():
- # Verify client sends force directive on every request for session.
- self.assertIn('exp=force_lite_page',
- response.request_headers['chrome-proxy'])
- self.assertEqual('4G', response.request_headers['chrome-proxy-ect'])
- # Skip CSI requests when validating Lite Page headers. CSI requests
- # aren't expected to have LoFi headers.
- if '/csi?' in response.url:
- continue
- if response.url.startswith('data:'):
- continue
- if (self.checkLitePageResponse(response)):
- lite_page_responses = lite_page_responses + 1
-
- # Verify that a Lite Page response for the main frame was seen.
- self.assertEqual(1, lite_page_responses)
-
- # Checks that a Lite Page is not served for the Cellular-Only option but
- # not on cellular connection.
- @ChromeVersionEqualOrAfterM(61)
- @ChromeVersionBeforeM(65)
- def testLitePageNotAcceptedForCellularOnlyFlag(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=cellular-only')
- test_driver.AddChromeArg('--enable-data-reduction-proxy-lite-page')
-
- test_driver.LoadURL('http://check.googlezip.net/test.html')
-
- non_lite_page_responses = 0
- for response in test_driver.GetHTTPResponses():
- if response.url.endswith('html'):
- self.assertNotIn('chrome-proxy-accept-transform',
- response.request_headers)
- self.assertNotIn('chrome-proxy-content-transform',
- response.response_headers)
- non_lite_page_responses = non_lite_page_responses + 1
- # Note that the client will still send exp=force_lite_page (if not
- # using the exp paramter to specify other experiments).
- if common.ParseFlags().browser_args:
- if ('--data-reduction-proxy-experiment'
- not in common.ParseFlags().browser_args):
- # Verify force directive present.
- self.assertIn('exp=force_lite_page',
- response.request_headers['chrome-proxy'])
-
- # Verify that a main frame without Lite Page was seen.
- self.assertEqual(1, non_lite_page_responses)
-
# Checks that a Nano Lite Page does not have an error when scrolling to the
# bottom of the page and is able to load all resources. Nano pages don't
# request additional resources when scrolling. This test is only run on
@@ -162,13 +75,12 @@ class LitePage(IntegrationTest):
self.skipTest('This test cannot be run with other experiments.')
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
+ test_driver.EnableChromeFeature('Previews')
+ test_driver.EnableChromeFeature('DataReductionProxyDecidesTransform')
# Need to force 2G speed to get lite-page response.
test_driver.AddChromeArg('--force-effective-connection-type=2G')
# Set exp=client_test_nano to force Nano response.
- test_driver.AddChromeArg(
- '--data-reduction-proxy-experiment=client_test_nano')
+ test_driver.SetExperiment('client_test_nano')
# This page is long and has many media resources.
test_driver.LoadURL('http://check.googlezip.net/metrics/index.html')
@@ -203,8 +115,11 @@ class LitePage(IntegrationTest):
self.assertGreater(1, image_responses)
# Tests that the stale previews UI is shown on a stale Lite page.
+ # The stale timestamp histogram is not logged with the new UI unless the page
+ # info dialog is opened which can't be done in a ChromeDriver test.
@AndroidOnly
@ChromeVersionEqualOrAfterM(65)
+ @ChromeVersionBeforeM(76)
def testStaleLitePageNano(self):
# If it was attempted to run with another experiment, skip this test.
if common.ParseFlags().browser_args and ('--data-reduction-proxy-experiment'
@@ -212,19 +127,20 @@ class LitePage(IntegrationTest):
self.skipTest('This test cannot be run with other experiments.')
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--disable-features=AndroidOmniboxPreviewsBadge')
+ test_driver.EnableChromeFeature('Previews')
+ test_driver.EnableChromeFeature('DataReductionProxyDecidesTransform')
+ test_driver.DisableChromeFeature('AndroidOmniboxPreviewsBadge')
test_driver.AddChromeArg('--force-effective-connection-type=2G')
# Set exp=client_test_nano to force Lite page response.
- test_driver.AddChromeArg(
- '--data-reduction-proxy-experiment=client_test_nano')
+ test_driver.SetExperiment('client_test_nano')
# LoadURL waits for onLoadFinish so the Previews UI will be showing by
# then since it's triggered on commit.
test_driver.LoadURL(
'http://check.googlezip.net/cacheable/test.html?age_seconds=360')
- histogram = test_driver.GetHistogram(
+ test_driver.SleepUntilHistogramHasEntry(
+ 'Previews.StalePreviewTimestampShown')
+ histogram = test_driver.GetBrowserHistogram(
'Previews.StalePreviewTimestampShown')
self.assertEqual(1, histogram['count'])
# Check that there is a single entry in the 'Timestamp Shown' bucket.
@@ -236,7 +152,7 @@ class LitePage(IntegrationTest):
test_driver.LoadURL(
'http://check.googlezip.net/cacheable/test.html?age_seconds=0')
- histogram = test_driver.GetHistogram(
+ histogram = test_driver.GetBrowserHistogram(
'Previews.StalePreviewTimestampShown')
# Check that there is still a single entry in the 'Timestamp Shown'
# bucket.
@@ -244,57 +160,17 @@ class LitePage(IntegrationTest):
{'count': 1, 'high': 1, 'low': 0},
histogram['buckets'][0])
- # Lo-Fi fallback is not supported without the
- # DataReductionProxyDecidesTransform feature. Check that no Lo-Fi response
- # is received if a Lite Page is not served.
- @ChromeVersionBeforeM(62)
- def testLitePageNoFallback(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--force-fieldtrials='
- 'DataCompressionProxyLoFi/Enabled_Preview/')
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'DataCompressionProxyLoFi.Enabled_Preview:'
- 'effective_connection_type/4G')
- test_driver.AddChromeArg('--force-net-effective-connection-type=2g')
-
- test_driver.LoadURL('http://check.googlezip.net/lite-page-fallback')
-
- lite_page_requests = 0
- lo_fi_responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.request_headers:
- continue
-
- if ('chrome-proxy-accept-transform' in response.request_headers):
- cpat_request = response.request_headers[
- 'chrome-proxy-accept-transform']
- if ('lite-page' in cpat_request):
- lite_page_requests = lite_page_requests + 1
- self.assertFalse(self.checkLitePageResponse(response))
-
- if not response.url.endswith('png'):
- continue
-
- # Lo-Fi fallback is not currently supported via the client. Check that
- # no Lo-Fi response is received.
- self.checkLoFiResponse(response, False)
-
- # Verify that a Lite Page was requested.
- self.assertEqual(1, lite_page_requests)
-
# Verifies Lo-Fi fallback via the page-policies server directive.
# Note: this test is for the CPAT protocol change in M-61.
@ChromeVersionEqualOrAfterM(61)
- @ChromeVersionBeforeM(75)
+ @ChromeVersionBeforeM(74)
def testLitePageFallbackViaPagePolicies(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features=NetworkQualityEstimator'
- '<NetworkQualityEstimator,'
- 'Previews,DataReductionProxyDecidesTransform,'
- 'NetworkService,'
- 'DataReductionProxyEnabledWithNetworkService')
+ test_driver.EnableChromeFeature(
+ 'NetworkQualityEstimator<NetworkQualityEstimator')
+ test_driver.EnableChromeFeature('Previews')
+ test_driver.EnableChromeFeature('DataReductionProxyDecidesTransform')
test_driver.AddChromeArg('--force-fieldtrial-params='
'NetworkQualityEstimator.Enabled:'
'force_effective_connection_type/Slow2G')
@@ -323,53 +199,6 @@ class LitePage(IntegrationTest):
self.assertEqual(0, lite_page_responses)
self.assertNotEqual(0, lofi_resource)
- # Checks that the server provides a preview (either Lite Page or fallback
- # to LoFi) for a 2G connection.
- # Note: this test is for the CPAT protocol change in M-61.
- @ChromeVersionEqualOrAfterM(61)
- def testPreviewProvidedForSlowConnection(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features=NetworkQualityEstimator'
- '<NetworkQualityEstimator,'
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/2G')
- test_driver.AddChromeArg(
- '--data-reduction-proxy-experiment=force_lite_page')
- test_driver.AddChromeArg(
- '--force-fieldtrials='
- 'NetworkQualityEstimator/Enabled/'
- 'DataReductionProxyPreviewsBlackListTransition/Enabled/')
-
- test_driver.LoadURL('http://check.googlezip.net/test.html')
-
- lite_page_responses = 0
- page_policies_responses = 0
- checked_chrome_proxy_header = False
- for response in test_driver.GetHTTPResponses():
- if response.request_headers:
- self.assertEqual('2G', response.request_headers['chrome-proxy-ect'])
- checked_chrome_proxy_header = True
- if response.url.endswith('html'):
- if self.checkLitePageResponse(response):
- lite_page_responses = lite_page_responses + 1
- elif 'chrome-proxy' in response.response_headers:
- self.assertIn('page-policies',
- response.response_headers['chrome-proxy'])
- page_policies_responses = page_policies_responses + 1
-
- self.assertTrue(lite_page_responses == 1 or page_policies_responses == 1)
- self.assertTrue(checked_chrome_proxy_header)
-
- if (lite_page_responses == 1):
- self.assertPreviewShownViaHistogram(test_driver, 'LitePage')
- self.assertPreviewNotShownViaHistogram(test_driver, 'LoFi')
- else:
- self.assertPreviewShownViaHistogram(test_driver, 'LoFi')
- self.assertPreviewNotShownViaHistogram(test_driver, 'LitePage')
-
# Checks that the server does not provide a preview (neither Lite Page nor
# fallback to LoFi) for a fast connection.
# Note: this test is for the CPAT protocol change in M-61.
@@ -377,9 +206,11 @@ class LitePage(IntegrationTest):
def testPreviewNotProvidedForFastConnection(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features=NetworkQualityEstimator'
- '<NetworkQualityEstimator,'
- 'Previews,DataReductionProxyDecidesTransform')
+ test_driver.EnableChromeFeature(
+ 'NetworkQualityEstimator<NetworkQualityEstimator')
+ test_driver.EnableChromeFeature('NetworkService')
+ test_driver.EnableChromeFeature('Previews')
+ test_driver.EnableChromeFeature('DataReductionProxyDecidesTransform')
test_driver.AddChromeArg('--force-fieldtrial-params='
'NetworkQualityEstimator.Enabled:'
'force_effective_connection_type/4G')
@@ -422,10 +253,8 @@ class LitePage(IntegrationTest):
def testDataReductionProxyDecidesTransformDefault(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features=NetworkQualityEstimator'
- '<NetworkQualityEstimator,'
- 'NetworkService,'
- 'DataReductionProxyEnabledWithNetworkService')
+ test_driver.EnableChromeFeature(
+ 'NetworkQualityEstimator<NetworkQualityEstimator')
test_driver.AddChromeArg('--force-fieldtrial-params='
'NetworkQualityEstimator.Enabled:'
'force_effective_connection_type/2G')
@@ -458,13 +287,12 @@ class LitePage(IntegrationTest):
def testInteractiveCASPR(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
+ test_driver.EnableChromeFeature('Previews')
+ test_driver.EnableChromeFeature('DataReductionProxyDecidesTransform')
# Need to force 2G speed to get a preview.
test_driver.AddChromeArg('--force-effective-connection-type=2G')
# Set exp=client_test_icaspr to force iCASPR response.
- test_driver.AddChromeArg(
- '--data-reduction-proxy-experiment=ihdp_integration')
+ test_driver.SetExperiment('ihdp_integration')
test_driver.LoadURL('http://check.googlezip.net/previews/ihdp.html')
diff --git a/chromium/tools/chrome_proxy/webdriver/lofi.py b/chromium/tools/chrome_proxy/webdriver/lofi.py
index 2f12c5a28c2..0d0570ebfa0 100644
--- a/chromium/tools/chrome_proxy/webdriver/lofi.py
+++ b/chromium/tools/chrome_proxy/webdriver/lofi.py
@@ -5,504 +5,44 @@
import common
from common import TestDriver
from common import IntegrationTest
-from decorators import ChromeVersionBeforeM
from decorators import ChromeVersionEqualOrAfterM
class LoFi(IntegrationTest):
- # Checks that the compressed image is below a certain threshold.
- # The test page is uncacheable otherwise a cached page may be served that
- # doesn't have the correct via headers.
- @ChromeVersionBeforeM(65)
- def testLoFiOldFlags(self):
+ @ChromeVersionEqualOrAfterM(75)
+ def testServerLoFiWithForcingFlag(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=always-on')
- # Disable server experiments such as tamper detection.
- test_driver.AddChromeArg('--data-reduction-proxy-server-experiments-'
- 'disabled')
+ test_driver.EnableChromeFeature('Previews')
+ test_driver.EnableChromeFeature('DataReductionProxyDecidesTransform')
+ test_driver.AddChromeArg('--force-effective-connection-type=Slow-2G')
+ test_driver.SetExperiment('force_page_policies_empty_image')
test_driver.LoadURL('http://check.googlezip.net/static/index.html')
- lofi_responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- if (self.checkLoFiResponse(response, True)):
- lofi_responses = lofi_responses + 1
-
- # Verify that Lo-Fi responses were seen.
- self.assertNotEqual(0, lofi_responses)
-
- self.assertPreviewShownViaHistogram(test_driver, 'LoFi')
-
- # Checks that LoFi images are served when LoFi slow connections are used and
- # the network quality estimator returns Slow2G.
- @ChromeVersionBeforeM(65)
- def testLoFiSlowConnectionOldFlags(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=slow-connections-'
- 'only')
- # Disable server experiments such as tamper detection.
- test_driver.AddChromeArg('--data-reduction-proxy-server-experiments-'
- 'disabled')
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/Slow2G')
- test_driver.AddChromeArg('--force-fieldtrials=NetworkQualityEstimator/'
- 'Enabled')
-
- test_driver.LoadURL('http://check.googlezip.net/static/index.html')
-
- lofi_responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- if (self.checkLoFiResponse(response, True)):
- lofi_responses = lofi_responses + 1
-
- # Verify that Lo-Fi responses were seen.
- self.assertNotEqual(0, lofi_responses)
-
- self.assertPreviewShownViaHistogram(test_driver, 'LoFi')
-
- # Checks that LoFi images are served when LoFi slow connections are used and
- # the network quality estimator returns Slow2G.
- @ChromeVersionEqualOrAfterM(65)
- @ChromeVersionBeforeM(75)
- def testLoFiOnSlowConnection(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- # Disable server experiments such as tamper detection.
- test_driver.AddChromeArg('--data-reduction-proxy-server-experiments-'
- 'disabled')
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/Slow2G')
- test_driver.AddChromeArg('--force-fieldtrials=NetworkQualityEstimator/'
- 'Enabled')
-
- test_driver.LoadURL('http://check.googlezip.net/static/index.html')
-
- lofi_responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- if (self.checkLoFiResponse(response, True)):
- lofi_responses = lofi_responses + 1
-
- # Verify that Lo-Fi responses were seen.
- self.assertNotEqual(0, lofi_responses)
-
- self.assertPreviewShownViaHistogram(test_driver, 'LoFi')
-
- # Checks that LoFi images are NOT served when the network quality estimator
- # returns fast connection type.
- @ChromeVersionBeforeM(65)
- def testLoFiFastConnectionOldFlags(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=slow-connections-'
- 'only')
- # Disable server experiments such as tamper detection.
- test_driver.AddChromeArg('--data-reduction-proxy-server-experiments-'
- 'disabled')
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/4G')
- test_driver.AddChromeArg('--force-fieldtrials=NetworkQualityEstimator/'
- 'Enabled')
-
- test_driver.LoadURL('http://check.googlezip.net/static/index.html')
-
- lofi_responses = 0
- for response in test_driver.GetHTTPResponses():
+ responses = test_driver.GetHTTPResponses()
+ self.assertNotEqual(len(responses), 0)
+ for response in responses:
if response.url.endswith('html'):
- # Main resource should accept transforms but not be transformed.
- self.assertEqual('lite-page',
- response.request_headers['chrome-proxy-accept-transform'])
- self.assertNotIn('chrome-proxy-content-transform',
- response.response_headers)
- if 'chrome-proxy' in response.response_headers:
- self.assertNotIn('page-policies',
- response.response_headers['chrome-proxy'])
- else:
- # No subresources should accept transforms.
- self.assertNotIn('chrome-proxy-accept-transform',
- response.request_headers)
-
- self.assertPreviewNotShownViaHistogram(test_driver, 'LoFi')
+ self.assertIn('empty-image',
+ response.response_headers['chrome-proxy'])
- # Checks that LoFi images are NOT served when the network quality estimator
- # returns fast connection.
- @ChromeVersionEqualOrAfterM(65)
- @ChromeVersionBeforeM(75)
- def testLoFiFastConnection(self):
+ @ChromeVersionEqualOrAfterM(74)
+ def testNoServerLoFiByDefault(self):
with TestDriver() as test_driver:
test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- # Disable server experiments such as tamper detection.
- test_driver.AddChromeArg('--data-reduction-proxy-server-experiments-'
- 'disabled')
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/4G')
- test_driver.AddChromeArg('--force-fieldtrials=NetworkQualityEstimator/'
- 'Enabled')
+ test_driver.EnableChromeFeature('Previews')
+ test_driver.EnableChromeFeature('DataReductionProxyDecidesTransform')
+ test_driver.AddChromeArg('--force-effective-connection-type=Slow-2G')
test_driver.LoadURL('http://check.googlezip.net/static/index.html')
- lofi_responses = 0
- for response in test_driver.GetHTTPResponses():
+ responses = test_driver.GetHTTPResponses()
+ self.assertNotEqual(len(responses), 0)
+ for response in responses:
if response.url.endswith('html'):
- # Main resource should accept transforms but not be transformed.
- self.assertEqual('lite-page',
- response.request_headers['chrome-proxy-accept-transform'])
- self.assertNotIn('chrome-proxy-content-transform',
- response.response_headers)
- if 'chrome-proxy' in response.response_headers:
- self.assertNotIn('page-policies',
- response.response_headers['chrome-proxy'])
- else:
- # No subresources should accept transforms.
- self.assertNotIn('chrome-proxy-accept-transform',
- response.request_headers)
-
- self.assertPreviewNotShownViaHistogram(test_driver, 'LoFi')
-
- # Checks that LoFi images are not served, but the if-heavy CPAT header is
- # added when LoFi slow connections are used and the network quality estimator
- # returns 4G.
- # If-heavy stopped being added in M61.
- @ChromeVersionBeforeM(61)
- def testLoFiIfHeavyFastConnection(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=slow-connections-'
- 'only')
- # Disable server experiments.
- test_driver.AddChromeArg('--data-reduction-proxy-server-experiments-'
- 'disabled')
-
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/4G')
- test_driver.AddChromeArg('--force-fieldtrials=NetworkQualityEstimator/'
- 'Enabled')
-
- test_driver.LoadURL('http://check.googlezip.net/static/index.html')
-
- non_lofi_responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- self.assertIn('chrome-proxy-accept-transform', response.request_headers)
- actual_cpat_headers = \
- response.request_headers['chrome-proxy-accept-transform'].split(';')
- self.assertIn('empty-image', actual_cpat_headers)
- self.assertIn('if-heavy', actual_cpat_headers)
- if (not self.checkLoFiResponse(response, False)):
- non_lofi_responses = non_lofi_responses + 1
-
- # Verify that non Lo-Fi image responses were seen.
- self.assertNotEqual(0, non_lofi_responses)
-
- # Checks that Lo-Fi placeholder images are not loaded from cache on page
- # reloads when Lo-Fi mode is disabled or data reduction proxy is disabled.
- # First a test page is opened with Lo-Fi and chrome proxy enabled. This allows
- # Chrome to cache the Lo-Fi placeholder image. The browser is restarted with
- # chrome proxy disabled and the same test page is loaded. This second page
- # load should not pick the Lo-Fi placeholder from cache and original image
- # should be loaded. Finally, the browser is restarted with chrome proxy
- # enabled and Lo-Fi disabled and the same test page is loaded. This third page
- # load should not pick the Lo-Fi placeholder from cache and original image
- # should be loaded.
- @ChromeVersionBeforeM(65)
- def testLoFiCacheBypassOldFlags(self):
- # If it was attempted to run with another experiment, skip this test.
- if common.ParseFlags().browser_args and ('--data-reduction-proxy-experiment'
- in common.ParseFlags().browser_args):
- self.skipTest('This test cannot be run with other experiments.')
- with TestDriver() as test_driver:
- # First page load, enable Lo-Fi and chrome proxy. Disable server
- # experiments such as tamper detection. This test should be run with
- # --profile-type=default command line for the same user profile and cache
- # to be used across the two page loads.
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=always-on')
- test_driver.AddChromeArg('--profile-type=default')
- test_driver.AddChromeArg('--data-reduction-proxy-server-experiments-'
- 'disabled')
-
- test_driver.LoadURL('http://check.googlezip.net/cacheable/test.html')
-
- lofi_responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- if (self.checkLoFiResponse(response, True)):
- lofi_responses = lofi_responses + 1
-
- # Verify that Lo-Fi responses were seen.
- self.assertNotEqual(0, lofi_responses)
-
- # Second page load with the chrome proxy off.
- test_driver._StopDriver()
- test_driver.RemoveChromeArg('--enable-spdy-proxy-auth')
- test_driver.LoadURL('http://check.googlezip.net/cacheable/test.html')
-
- responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- responses = responses + 1
- self.assertNotHasChromeProxyViaHeader(response)
- self.checkLoFiResponse(response, False)
-
- # Verify that responses were seen.
- self.assertNotEqual(0, responses)
-
- # Third page load with the chrome proxy on and Lo-Fi off.
- test_driver._StopDriver()
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.RemoveChromeArg('--data-reduction-proxy-lo-fi=always-on')
- test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=disabled')
- test_driver.LoadURL('http://check.googlezip.net/cacheable/test.html')
-
- responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- responses = responses + 1
- self.assertHasProxyHeaders(response)
- self.checkLoFiResponse(response, False)
-
- # Verify that responses were seen.
- self.assertNotEqual(0, responses)
-
- # Checks that Lo-Fi placeholder images are not loaded from cache on page
- # reloads when Lo-Fi mode is disabled or data reduction proxy is disabled.
- # First a test page is opened with Lo-Fi and chrome proxy enabled. This allows
- # Chrome to cache the Lo-Fi placeholder image. The browser is restarted with
- # chrome proxy disabled and the same test page is loaded. This second page
- # load should not pick the Lo-Fi placeholder from cache and original image
- # should be loaded. Finally, the browser is restarted with chrome proxy
- # enabled and Lo-Fi disabled and the same test page is loaded. This third page
- # load should not pick the Lo-Fi placeholder from cache and original image
- # should be loaded.
- @ChromeVersionEqualOrAfterM(65)
- @ChromeVersionBeforeM(75)
- def testLoFiCacheBypass(self):
- # If it was attempted to run with another experiment, skip this test.
- if common.ParseFlags().browser_args and ('--data-reduction-proxy-experiment'
- in common.ParseFlags().browser_args):
- self.skipTest('This test cannot be run with other experiments.')
- with TestDriver() as test_driver:
- # First page load, enable Lo-Fi and chrome proxy. Disable server
- # experiments such as tamper detection. This test should be run with
- # --profile-type=default command line for the same user profile and cache
- # to be used across the two page loads.
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--profile-type=default')
- test_driver.AddChromeArg('--data-reduction-proxy-server-experiments-'
- 'disabled')
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/Slow2G')
- test_driver.AddChromeArg('--force-fieldtrials=NetworkQualityEstimator/'
- 'Enabled')
-
- test_driver.LoadURL('http://check.googlezip.net/cacheable/test.html')
-
- lofi_responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- if (self.checkLoFiResponse(response, True)):
- lofi_responses = lofi_responses + 1
-
- # Verify that Lo-Fi responses were seen.
- self.assertNotEqual(0, lofi_responses)
-
- # Second page load with the chrome proxy off.
- test_driver._StopDriver()
- test_driver.RemoveChromeArg('--enable-spdy-proxy-auth')
- test_driver.LoadURL('http://check.googlezip.net/cacheable/test.html')
-
- responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- responses = responses + 1
- self.assertNotHasChromeProxyViaHeader(response)
- self.checkLoFiResponse(response, False)
-
- # Verify that responses were seen.
- self.assertNotEqual(0, responses)
-
- # Third page load with the chrome proxy on and Lo-Fi off.
- test_driver._StopDriver()
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.RemoveChromeArg('--enable-features='
- 'DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--disable-features='
- 'DataReductionProxyDecidesTransform')
- test_driver.LoadURL('http://check.googlezip.net/cacheable/test.html')
-
- responses = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('png'):
- continue
- if not response.request_headers:
- continue
- responses = responses + 1
- self.assertHasProxyHeaders(response)
- self.checkLoFiResponse(response, False)
-
- # Verify that responses were seen.
- self.assertNotEqual(0, responses)
-
- # Checks that LoFi images are served and the force empty image experiment
- # directive is provided when LoFi is always-on without Lite Pages enabled.
- @ChromeVersionEqualOrAfterM(61)
- @ChromeVersionBeforeM(65)
- def testLoFiForcedExperimentOldFlags(self):
- # If it was attempted to run with another experiment, skip this test.
- if common.ParseFlags().browser_args and ('--data-reduction-proxy-experiment'
- in common.ParseFlags().browser_args):
- self.skipTest('This test cannot be run with other experiments.')
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg('--data-reduction-proxy-lo-fi=always-on')
-
- # Ensure fast network (4G) to ensure force flag ignores ECT.
- test_driver.AddChromeArg('--force-fieldtrial-params='
- 'NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/4G')
- test_driver.AddChromeArg('--force-fieldtrials=NetworkQualityEstimator/'
- 'Enabled')
-
- test_driver.LoadURL('http://check.googlezip.net/static/index.html')
-
- lofi_responses = 0
- for response in test_driver.GetHTTPResponses():
- self.assertIn('exp=force_page_policies_empty_image',
- response.request_headers['chrome-proxy'])
- if response.url.endswith('html'):
- # Verify that the server provides the fallback directive
- self.assertIn('chrome-proxy', response.response_headers)
- self.assertIn('page-policies=empty-image',
- response.response_headers['chrome-proxy'])
- continue
- if response.url.endswith('png'):
- self.checkLoFiResponse(response, True)
- lofi_responses = lofi_responses + 1
-
- # Verify that Lo-Fi responses were seen.
- self.assertNotEqual(0, lofi_responses)
-
- # Checks that Client LoFi resource requests have the Intervention header.
- @ChromeVersionEqualOrAfterM(61)
- @ChromeVersionBeforeM(75)
- def testClientLoFiInterventionHeader(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- test_driver.AddChromeArg('--enable-features='
- 'Previews,DataReductionProxyDecidesTransform')
- test_driver.AddChromeArg(
- '--force-fieldtrial-params=NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/2G,'
- 'PreviewsClientLoFi.Enabled:'
- 'max_allowed_effective_connection_type/4G')
- test_driver.AddChromeArg(
- '--force-fieldtrials=NetworkQualityEstimator/Enabled/'
- 'PreviewsClientLoFi/Enabled')
-
- test_driver.LoadURL('https://check.googlezip.net/static/index.html')
-
- intervention_headers = 0
- for response in test_driver.GetHTTPResponses():
- if not response.url.endswith('html'):
- self.assertIn('intervention', response.request_headers)
- intervention_headers = intervention_headers + 1
-
- self.assertNotEqual(0, intervention_headers)
-
- # Checks that Client LoFi range requests that go through the Data Reduction
- # Proxy are returned correctly.
- @ChromeVersionEqualOrAfterM(62)
- @ChromeVersionBeforeM(75)
- def testClientLoFiRangeRequestThroughDataReductionProxy(self):
- with TestDriver() as test_driver:
- test_driver.AddChromeArg('--enable-spdy-proxy-auth')
- # Enable Previews and Client-side LoFi, but disable server previews in
- # order to force Chrome to use Client-side LoFi for the images on the
- # page.
- test_driver.AddChromeArg('--enable-features=Previews,PreviewsClientLoFi')
- test_driver.AddChromeArg(
- '--disable-features=DataReductionProxyDecidesTransform')
-
- test_driver.AddChromeArg(
- '--force-fieldtrial-params=NetworkQualityEstimator.Enabled:'
- 'force_effective_connection_type/2G,'
- 'PreviewsClientLoFi.Enabled:'
- 'max_allowed_effective_connection_type/4G')
-
- test_driver.AddChromeArg(
- '--force-fieldtrials=NetworkQualityEstimator/Enabled/'
- 'PreviewsClientLoFi/Enabled')
-
- # Fetch a non-SSL page with multiple images on it, such that the images
- # are fetched through the Data Reduction Proxy.
- test_driver.LoadURL('http://check.googlezip.net/static/index.html')
-
- image_response_count = 0
- for response in test_driver.GetHTTPResponses():
- if response.url.endswith('.png'):
- self.assertHasProxyHeaders(response)
- self.assertIn('range', response.request_headers)
- self.assertIn('content-range', response.response_headers)
- self.assertTrue(response.response_headers['content-range'].startswith(
- 'bytes 0-2047/'))
- image_response_count = image_response_count + 1
-
- self.assertNotEqual(0, image_response_count)
-
- self.assertPreviewShownViaHistogram(test_driver, 'LoFi')
+ self.assertNotIn('empty-image',
+ response.response_headers['chrome-proxy'])
if __name__ == '__main__':
IntegrationTest.RunAllTests()
diff --git a/chromium/tools/chrome_proxy/webdriver/proxy_connection.py b/chromium/tools/chrome_proxy/webdriver/proxy_connection.py
index 984bd9bb68c..e46545e87d4 100644
--- a/chromium/tools/chrome_proxy/webdriver/proxy_connection.py
+++ b/chromium/tools/chrome_proxy/webdriver/proxy_connection.py
@@ -14,6 +14,19 @@ from emulation_server import TLSResetHandler
class ProxyConnection(IntegrationTest):
+ def VerifyWarmupHistogram(self, test_driver, is_secure_proxy):
+ is_histogram_found = False
+ for histogram_part in ['Core', 'NonCore']:
+ histogram_name = 'DataReductionProxy.WarmupURLFetcherCallback.' + \
+ 'SuccessfulFetch.%s.%s' % (
+ 'SecureProxy' if is_secure_proxy else 'InsecureProxy',
+ histogram_part)
+ histogram = test_driver.GetBrowserHistogram(histogram_name)
+ if histogram:
+ self.assertEqual(1, histogram['count'])
+ is_histogram_found = True
+ self.assertTrue(is_histogram_found)
+
@ChromeVersionEqualOrAfterM(63)
def testTLSInjectionAfterHandshake(self):
port = common.GetOpenPort()
@@ -26,8 +39,6 @@ class ProxyConnection(IntegrationTest):
'--data-reduction-proxy-http-proxies=https://127.0.0.1:%d' % port)
t.AddChromeArg(
'--force-fieldtrials=DataReductionProxyConfigService/Disabled')
- t.AddChromeArg(
- '--enable-features=NetworkService,DataReductionProxyEnabledWithNetworkService')
t.UseEmulationServer(InvalidTLSHandler, port=port)
t.LoadURL('http://check.googlezip.net/test.html')
@@ -37,10 +48,11 @@ class ProxyConnection(IntegrationTest):
self.assertEqual(2, len(responses))
for response in responses:
self.assertNotHasChromeProxyViaHeader(response)
- self.assertTrue(t.SleepUntilHistogramHasEntry('DataReductionProxy.'
- 'InvalidResponseHeadersReceived.NetError'))
+ self.assertTrue(
+ t.SleepUntilHistogramHasEntry('DataReductionProxy.WarmupURL.NetError'))
+ self.VerifyWarmupHistogram(t, True)
- @ChromeVersionEqualOrAfterM(63)
+ @ChromeVersionEqualOrAfterM(74)
def testTCPReset(self):
port = common.GetOpenPort()
with TestDriver() as t:
@@ -53,8 +65,6 @@ class ProxyConnection(IntegrationTest):
'--data-reduction-proxy-http-proxies=http://127.0.0.1:%d' % port)
t.AddChromeArg(
'--force-fieldtrials=DataReductionProxyConfigService/Disabled')
- t.AddChromeArg(
- '--enable-features=NetworkService,DataReductionProxyEnabledWithNetworkService')
t.UseEmulationServer(TCPResetHandler, port=port)
t.LoadURL('http://check.googlezip.net/test.html')
@@ -64,8 +74,10 @@ class ProxyConnection(IntegrationTest):
self.assertEqual(2, len(responses))
for response in responses:
self.assertNotHasChromeProxyViaHeader(response)
- self.assertTrue(t.SleepUntilHistogramHasEntry('DataReductionProxy.'
- 'InvalidResponseHeadersReceived.NetError'))
+ self.assertTrue(
+ t.SleepUntilHistogramHasEntry('DataReductionProxy.WarmupURL.NetError',
+ sleep_intervals=10))
+ self.VerifyWarmupHistogram(t, False)
@ChromeVersionEqualOrAfterM(63)
def testTLSReset(self):
@@ -80,8 +92,6 @@ class ProxyConnection(IntegrationTest):
'--data-reduction-proxy-http-proxies=https://127.0.0.1:%d' % port)
t.AddChromeArg(
'--force-fieldtrials=DataReductionProxyConfigService/Disabled')
- t.AddChromeArg(
- '--enable-features=NetworkService,DataReductionProxyEnabledWithNetworkService')
t.UseEmulationServer(TLSResetHandler, port=port)
t.LoadURL('http://check.googlezip.net/test.html')
@@ -92,13 +102,13 @@ class ProxyConnection(IntegrationTest):
for response in responses:
self.assertNotHasChromeProxyViaHeader(response)
- @ChromeVersionBetweenInclusiveM(66, 71)
+ @ChromeVersionEqualOrAfterM(74)
def testTCPBlackhole(self):
port = common.GetOpenPort()
with TestDriver() as t:
t.UseNetLog()
t.AddChromeArg('--enable-spdy-proxy-auth')
- t.AddChromeArg('--enable-features='
+ t.EnableChromeFeature(
'DataReductionProxyRobustConnection<DataReductionProxyRobustConnection')
t.AddChromeArg('--force-fieldtrials='
'DataReductionProxyRobustConnection/Enabled')
@@ -113,17 +123,14 @@ class ProxyConnection(IntegrationTest):
'--data-reduction-proxy-http-proxies=http://127.0.0.1:%d' % port)
t.UseEmulationServer(BlackHoleHandler, port=port)
- # Start Chrome and wait for the proxy timeout to fail. At ECT=4G, this
- # will take about 8 seconds.
+ # Start Chrome and wait for the warmup fetcher timeout (30 seconds).
t.LoadURL('data:,')
self.assertTrue(
t.SleepUntilHistogramHasEntry('DataReductionProxy.WarmupURL.NetError',
- sleep_intervals=10))
+ sleep_intervals=40))
# Check the WarmupURL Callback was called.
- histogram = t.GetHistogram('DataReductionProxy.WarmupURLFetcherCallback.'
- 'SuccessfulFetch.InsecureProxy.NonCore')
- self.assertEqual(1, histogram['count'])
+ self.VerifyWarmupHistogram(t, False)
# Verify DRP was not used.
t.LoadURL('http://check.googlezip.net/test.html')
diff --git a/chromium/tools/chrome_proxy/webdriver/quic.py b/chromium/tools/chrome_proxy/webdriver/quic.py
index 53d4528e607..e458d6917c9 100644
--- a/chromium/tools/chrome_proxy/webdriver/quic.py
+++ b/chromium/tools/chrome_proxy/webdriver/quic.py
@@ -7,6 +7,7 @@ import time
import common
from common import TestDriver
from common import IntegrationTest
+from decorators import ChromeVersionEqualOrAfterM
class Quic(IntegrationTest):
@@ -35,6 +36,7 @@ class Quic(IntegrationTest):
# Ensure Chrome uses QUIC DataSaver proxy when QUIC is enabled. This test
# may fail if QUIC is disabled on the server side.
+ @ChromeVersionEqualOrAfterM(76)
def testCheckPageWithQuicProxyTransaction(self):
with TestDriver() as t:
t.AddChromeArg('--enable-spdy-proxy-auth')
@@ -53,6 +55,8 @@ class Quic(IntegrationTest):
self.assertEqual(2, len(responses))
for response in responses:
self.assertHasProxyHeaders(response)
+ t.SleepUntilHistogramHasEntry('PageLoad.Clients.DataReductionProxy.'
+ 'ParseTiming.NavigationToParseStart')
# Verify that histogram DataReductionProxy.Quic.ProxyStatus has at least 1
# sample. This sample must be in bucket 0 (QUIC_PROXY_STATUS_AVAILABLE).
diff --git a/chromium/tools/chrome_proxy/webdriver/safebrowsing.py b/chromium/tools/chrome_proxy/webdriver/safebrowsing.py
index b0f3f5e8ad1..730b6196cc4 100644
--- a/chromium/tools/chrome_proxy/webdriver/safebrowsing.py
+++ b/chromium/tools/chrome_proxy/webdriver/safebrowsing.py
@@ -7,6 +7,7 @@ from common import TestDriver
from common import IntegrationTest
from decorators import AndroidOnly
from decorators import NotAndroid
+from decorators import ChromeVersionBeforeM
from decorators import ChromeVersionEqualOrAfterM
from selenium.common.exceptions import TimeoutException
@@ -14,6 +15,7 @@ from selenium.common.exceptions import TimeoutException
class SafeBrowsing(IntegrationTest):
@AndroidOnly
+ @ChromeVersionBeforeM(73)
def testSafeBrowsingOn(self):
with TestDriver() as t:
t.AddChromeArg('--enable-spdy-proxy-auth')
@@ -42,19 +44,9 @@ class SafeBrowsing(IntegrationTest):
except TimeoutException:
# Verify that on device safebrowsing records unsafe for mainframe
# request at bucket=0
- unsafe_resources = t.GetHistogram('SB2.ResourceTypes2.Unsafe')
+ unsafe_resources = t.GetBrowserHistogram('SB2.ResourceTypes2.Unsafe')
self.assertEqual(1, unsafe_resources['count'])
self.assertEqual(1, unsafe_resources['buckets'][0]['count'])
- @NotAndroid
- def testSafeBrowsingOff(self):
- with TestDriver() as t:
- t.AddChromeArg('--enable-spdy-proxy-auth')
- t.LoadURL('http://testsafebrowsing.appspot.com/s/malware.html')
- responses = t.GetHTTPResponses()
- self.assertEqual(1, len(responses))
- for response in responses:
- self.assertHasProxyHeaders(response)
-
if __name__ == '__main__':
IntegrationTest.RunAllTests()
diff --git a/chromium/tools/chrome_proxy/webdriver/smoke.py b/chromium/tools/chrome_proxy/webdriver/smoke.py
index 2f27d17b493..741caffed01 100644
--- a/chromium/tools/chrome_proxy/webdriver/smoke.py
+++ b/chromium/tools/chrome_proxy/webdriver/smoke.py
@@ -54,36 +54,6 @@ class Smoke(IntegrationTest):
histogram = t.GetHistogram('DataReductionProxy.BypassTypePrimary', 5)
self.assertEqual(histogram, {})
- # Ensure Chrome does not use DataSaver when disabled via feature.
- @ChromeVersionEqualOrAfterM(74)
- def testCheckPageWithDataSaverFeatureDisabled(self):
- with TestDriver() as t:
- t.AddChromeArg('--enable-spdy-proxy-auth')
- t.AddChromeArg('--enable-features=NetworkService')
- t.AddChromeArg(
- '--disable-features=DataReductionProxyEnabledWithNetworkService')
- t.LoadURL('http://check.googlezip.net/test.html')
- responses = t.GetHTTPResponses()
- self.assertNotEqual(0, len(responses))
- num_chrome_proxy_request_headers = 0
- num_chrome_proxy_response_headers = 0
- for response in responses:
- self.assertNotHasChromeProxyViaHeader(response)
- if ('chrome-proxy' in response.request_headers):
- num_chrome_proxy_request_headers += 1
- if ('chrome-proxy' in response.response_headers):
- num_chrome_proxy_response_headers += 1
- self.assertEqual(num_chrome_proxy_request_headers, 0)
- self.assertEqual(num_chrome_proxy_response_headers, 0)
- self.assertEqual(t.GetHistogram(
- 'DataReductionProxy.ConfigService.FetchResponseCode'), {})
- self.assertEqual(t.GetHistogram(
- 'DataReductionProxy.WarmupURL.FetchSuccessful'), {})
- self.assertEqual(t.GetHistogram(
- 'DataReductionProxy.BlockTypePrimary'), {})
- self.assertEqual(t.GetHistogram(
- 'DataReductionProxy.BypassTypePrimary'), {})
-
# Ensure Chrome uses DataSaver in normal mode.
def testCheckPageWithNormalMode(self):
with TestDriver() as t:
@@ -108,10 +78,11 @@ class Smoke(IntegrationTest):
t.LoadURL('http://check.googlezip.net/test.html')
t.LoadURL('http://check.googlezip.net/test.html')
t.SleepUntilHistogramHasEntry("DataReductionProxy.Pingback.Succeeded")
+ t.SleepUntilHistogramHasEntry("DataReductionProxy.Pingback.Attempted")
# Verify one pingback attempt that was successful.
- attempted = t.GetHistogram('DataReductionProxy.Pingback.Attempted')
+ attempted = t.GetBrowserHistogram('DataReductionProxy.Pingback.Attempted')
self.assertEqual(1, attempted['count'])
- succeeded = t.GetHistogram('DataReductionProxy.Pingback.Succeeded')
+ succeeded = t.GetBrowserHistogram('DataReductionProxy.Pingback.Succeeded')
self.assertEqual(1, succeeded['count'])
# Ensure pageload metric pingback with DataSaver has the variations header.
diff --git a/chromium/tools/chrome_proxy/webdriver/variations_combinations.py b/chromium/tools/chrome_proxy/webdriver/variations_combinations.py
index fc6d36d5408..83a693cccd2 100644
--- a/chromium/tools/chrome_proxy/webdriver/variations_combinations.py
+++ b/chromium/tools/chrome_proxy/webdriver/variations_combinations.py
@@ -17,9 +17,6 @@ import fieldtrial_util
test_blacklist = [
# These tests set their own field trials and should be ignored.
- 'lite_page.LitePage.testLitePageFallback',
- 'lofi.LoFi.testLoFiSlowConnection',
- 'lofi.LoFi.testLoFiIfHeavyFastConnection',
'quic.Quic.testCheckPageWithQuicProxy',
'quic.Quic.testCheckPageWithQuicProxyTransaction',
'smoke.Smoke.testCheckPageWithHoldback',
diff --git a/chromium/tools/chrome_proxy/webdriver/video.py b/chromium/tools/chrome_proxy/webdriver/video.py
index 58237ea107f..194344a4f3b 100644
--- a/chromium/tools/chrome_proxy/webdriver/video.py
+++ b/chromium/tools/chrome_proxy/webdriver/video.py
@@ -8,6 +8,7 @@ import common
from common import TestDriver
from common import IntegrationTest
from common import ParseFlags
+from decorators import AndroidOnly
from decorators import Slow
from decorators import ChromeVersionEqualOrAfterM
@@ -33,6 +34,20 @@ class Video(IntegrationTest):
for response in responses:
self.assertHasProxyHeaders(response)
+ def testCheckVideoBypass(self):
+ with TestDriver() as t:
+ t.AddChromeArg('--enable-spdy-proxy-auth')
+ t.LoadURL(
+ 'http://check.googlezip.net/blocksingle/blocksingle_embedded_video.html')
+ saw_video_response = False
+ for response in t.GetHTTPResponses():
+ if 'video' in response.response_headers['content-type']:
+ self.assertNotHasChromeProxyViaHeader(response)
+ saw_video_response = True
+ else:
+ self.assertHasProxyHeaders(response)
+ self.assertTrue(saw_video_response, 'No video request seen in test!')
+
# Videos fetched via an XHR request should not be proxied.
def testNoCompressionOnXHR(self):
with TestDriver() as t:
@@ -80,16 +95,18 @@ class Video(IntegrationTest):
# ofcl should be same as compressed full content length, since no
# compression for XHR.
self.assertEqual(ofcl, compressed_full_content_length)
- # Navigate away to trigger the metrics recording for previous page load.
+ # Wait and navigate away to trigger the metrics recording for previous
+ # page load.
+ time.sleep(1)
t.LoadURL('about:blank')
- original_kb_histogram = t.GetHistogram('PageLoad.Clients.'
+ original_kb_histogram = t.GetBrowserHistogram('PageLoad.Clients.'
'DataReductionProxy.Experimental.Bytes.Network.Original2')
- compression_percent_histogram = t.GetHistogram('PageLoad.Clients.'
+ compression_percent_histogram = t.GetBrowserHistogram('PageLoad.Clients.'
'DataReductionProxy.Experimental.Bytes.Network.CompressionRatio2')
self.assertEqual(1, original_kb_histogram['count'])
self.assertEqual(1, compression_percent_histogram['count'])
# Verify the total page size is 3 KB, and compression ratio.
- self.assertEqual(3, original_kb_histogram['sum'])
+ self.assertLessEqual(3, original_kb_histogram['sum'])
self.assertEqual(compression_percent_histogram['sum'],
compressed_full_content_length/ofcl*100)
self.assertTrue(saw_range_response, 'No range request was seen in test!')
@@ -154,6 +171,7 @@ class Video(IntegrationTest):
# Check that the compressed video can be seeked. Use a slow network to ensure
# the entire video isn't downloaded before we have a chance to seek.
@Slow
+ @AndroidOnly
def testVideoSeeking(self):
with TestDriver(control_network_connection=True) as t:
t.SetNetworkConnection("2G")
diff --git a/chromium/tools/clang/blink_gc_plugin/CheckFieldsVisitor.cpp b/chromium/tools/clang/blink_gc_plugin/CheckFieldsVisitor.cpp
index 9f783f97d73..6e5f1b587b1 100644
--- a/chromium/tools/clang/blink_gc_plugin/CheckFieldsVisitor.cpp
+++ b/chromium/tools/clang/blink_gc_plugin/CheckFieldsVisitor.cpp
@@ -7,6 +7,7 @@
#include <cassert>
#include "RecordInfo.h"
+#include "llvm/Support/ErrorHandling.h"
CheckFieldsVisitor::CheckFieldsVisitor(const BlinkGCPluginOptions& options)
: options_(options), current_(0), stack_allocated_host_(false) {}
@@ -129,5 +130,5 @@ CheckFieldsVisitor::Error CheckFieldsVisitor::InvalidSmartPtr(Edge* ptr) {
return kRefPtrToGCManaged;
if (ptr->IsUniquePtr())
return kUniquePtrToGCManaged;
- assert(false && "Unknown smart pointer kind");
+ llvm_unreachable("Unknown smart pointer kind");
}
diff --git a/chromium/tools/clang/blink_gc_plugin/CheckTraceVisitor.cpp b/chromium/tools/clang/blink_gc_plugin/CheckTraceVisitor.cpp
index 8f6639eae41..eac70986afe 100644
--- a/chromium/tools/clang/blink_gc_plugin/CheckTraceVisitor.cpp
+++ b/chromium/tools/clang/blink_gc_plugin/CheckTraceVisitor.cpp
@@ -103,23 +103,14 @@ namespace {
class FindFieldVisitor : public RecursiveASTVisitor<FindFieldVisitor> {
public:
FindFieldVisitor();
- MemberExpr* member() const;
FieldDecl* field() const;
bool TraverseMemberExpr(MemberExpr* member);
private:
- MemberExpr* member_;
FieldDecl* field_;
};
-FindFieldVisitor::FindFieldVisitor()
- : member_(0),
- field_(0) {
-}
-
-MemberExpr* FindFieldVisitor::member() const {
- return member_;
-}
+FindFieldVisitor::FindFieldVisitor() : field_(0) {}
FieldDecl* FindFieldVisitor::field() const {
return field_;
@@ -127,7 +118,6 @@ FieldDecl* FindFieldVisitor::field() const {
bool FindFieldVisitor::TraverseMemberExpr(MemberExpr* member) {
if (FieldDecl* field = dyn_cast<FieldDecl>(member->getMemberDecl())) {
- member_ = member;
field_ = field;
return false;
}
diff --git a/chromium/tools/clang/blink_gc_plugin/Config.h b/chromium/tools/clang/blink_gc_plugin/Config.h
index ded4d843ad6..f60594a5220 100644
--- a/chromium/tools/clang/blink_gc_plugin/Config.h
+++ b/chromium/tools/clang/blink_gc_plugin/Config.h
@@ -68,10 +68,6 @@ class Config {
return name == "unique_ptr";
}
- static bool IsTraceWrapperMember(const std::string& name) {
- return name == "TraceWrapperMember";
- }
-
static bool IsTraceWrapperV8Reference(const std::string& name) {
return name == "TraceWrapperV8Reference";
}
diff --git a/chromium/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp b/chromium/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp
index 26f30b91857..1fa70aa7693 100644
--- a/chromium/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp
+++ b/chromium/tools/clang/blink_gc_plugin/DiagnosticsReporter.cpp
@@ -4,6 +4,8 @@
#include "DiagnosticsReporter.h"
+#include "llvm/Support/ErrorHandling.h"
+
using namespace clang;
namespace {
@@ -372,7 +374,7 @@ void DiagnosticsReporter::ClassContainsInvalidFields(
} else if (error.second == CheckFieldsVisitor::kIteratorToGCManaged) {
note = diag_iterator_to_gc_managed_collection_note_;
} else {
- assert(false && "Unknown field error");
+ llvm_unreachable("Unknown field error.");
}
NoteField(error.first, note);
}
diff --git a/chromium/tools/clang/blink_gc_plugin/Edge.h b/chromium/tools/clang/blink_gc_plugin/Edge.h
index 25a1e0769d2..c186f4334b3 100644
--- a/chromium/tools/clang/blink_gc_plugin/Edge.h
+++ b/chromium/tools/clang/blink_gc_plugin/Edge.h
@@ -104,7 +104,6 @@ class Edge {
virtual bool IsMember() { return false; }
virtual bool IsWeakMember() { return false; }
virtual bool IsCollection() { return false; }
- virtual bool IsTraceWrapperMember() { return false; }
virtual bool IsTraceWrapperV8Reference() { return false; }
};
@@ -229,12 +228,6 @@ class CrossThreadPersistent : public PtrEdge {
}
};
-class TraceWrapperMember : public Member {
- public:
- explicit TraceWrapperMember(Edge* ptr) : Member(ptr) {}
- bool IsTraceWrapperMember() override { return true; }
-};
-
class TraceWrapperV8Reference : public PtrEdge {
public:
explicit TraceWrapperV8Reference(Edge* ptr) : PtrEdge(ptr) {}
diff --git a/chromium/tools/clang/blink_gc_plugin/RecordInfo.cpp b/chromium/tools/clang/blink_gc_plugin/RecordInfo.cpp
index 9e8f19f1e91..b86bb37aa74 100644
--- a/chromium/tools/clang/blink_gc_plugin/RecordInfo.cpp
+++ b/chromium/tools/clang/blink_gc_plugin/RecordInfo.cpp
@@ -718,13 +718,6 @@ Edge* RecordInfo::CreateEdge(const Type* type) {
return edge;
}
- if (Config::IsTraceWrapperMember(info->name()) &&
- info->GetTemplateArgs(1, &args)) {
- if (Edge* ptr = CreateEdge(args[0]))
- return new TraceWrapperMember(ptr);
- return 0;
- }
-
if (Config::IsTraceWrapperV8Reference(info->name()) &&
info->GetTemplateArgs(1, &args)) {
if (Edge* ptr = CreateEdge(args[0]))
diff --git a/chromium/tools/clang/scripts/build.py b/chromium/tools/clang/scripts/build.py
new file mode 100755
index 00000000000..7849efd0cc1
--- /dev/null
+++ b/chromium/tools/clang/scripts/build.py
@@ -0,0 +1,841 @@
+#!/usr/bin/env python
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""This script is used to build clang binaries. It is used by package.py to
+create the prebuilt binaries downloaded by update.py and used by developers.
+
+The expectation is that update.py downloads prebuilt binaries for everyone, and
+nobody should run this script as part of normal development.
+"""
+
+from __future__ import print_function
+
+import argparse
+import glob
+import json
+import os
+import pipes
+import re
+import shutil
+import subprocess
+import sys
+
+from update import (CDS_URL, CHROMIUM_DIR, CLANG_REVISION, LLVM_BUILD_DIR,
+ FORCE_HEAD_REVISION_FILE, PACKAGE_VERSION, RELEASE_VERSION,
+ STAMP_FILE, CopyFile, CopyDiaDllTo, DownloadAndUnpack,
+ EnsureDirExists, GetWinSDKDir, ReadStampFile, RmTree,
+ WriteStampFile)
+
+
+# Path constants. (All of these should be absolute paths.)
+THIRD_PARTY_DIR = os.path.join(CHROMIUM_DIR, 'third_party')
+LLVM_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm')
+COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'compiler-rt')
+LLVM_BOOTSTRAP_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm-bootstrap')
+LLVM_BOOTSTRAP_INSTALL_DIR = os.path.join(THIRD_PARTY_DIR,
+ 'llvm-bootstrap-install')
+CHROME_TOOLS_SHIM_DIR = os.path.join(LLVM_DIR, 'llvm', 'tools', 'chrometools')
+THREADS_ENABLED_BUILD_DIR = os.path.join(THIRD_PARTY_DIR,
+ 'llvm-threads-enabled')
+COMPILER_RT_BUILD_DIR = os.path.join(LLVM_BUILD_DIR, 'compiler-rt')
+LLVM_BUILD_TOOLS_DIR = os.path.abspath(
+ os.path.join(LLVM_DIR, '..', 'llvm-build-tools'))
+ANDROID_NDK_DIR = os.path.join(
+ CHROMIUM_DIR, 'third_party', 'android_ndk')
+FUCHSIA_SDK_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'fuchsia-sdk',
+ 'sdk')
+
+BUG_REPORT_URL = ('https://crbug.com and run tools/clang/scripts/upload_crash.py'
+ ' (only works inside Google) which will upload a report')
+
+
+def RunCommand(command, msvc_arch=None, env=None, fail_hard=True):
+ """Run command and return success (True) or failure; or if fail_hard is
+ True, exit on failure. If msvc_arch is set, runs the command in a
+ shell with the msvc tools for that architecture."""
+
+ if msvc_arch and sys.platform == 'win32':
+ command = [os.path.join(GetWinSDKDir(), 'bin', 'SetEnv.cmd'),
+ "/" + msvc_arch, '&&'] + command
+
+ # https://docs.python.org/2/library/subprocess.html:
+ # "On Unix with shell=True [...] if args is a sequence, the first item
+ # specifies the command string, and any additional items will be treated as
+ # additional arguments to the shell itself. That is to say, Popen does the
+ # equivalent of:
+ # Popen(['/bin/sh', '-c', args[0], args[1], ...])"
+ #
+ # We want to pass additional arguments to command[0], not to the shell,
+ # so manually join everything into a single string.
+ # Annoyingly, for "svn co url c:\path", pipes.quote() thinks that it should
+ # quote c:\path but svn can't handle quoted paths on Windows. Since on
+ # Windows follow-on args are passed to args[0] instead of the shell, don't
+ # do the single-string transformation there.
+ if sys.platform != 'win32':
+ command = ' '.join([pipes.quote(c) for c in command])
+ print('Running', command)
+ if subprocess.call(command, env=env, shell=True) == 0:
+ return True
+ print('Failed.')
+ if fail_hard:
+ sys.exit(1)
+ return False
+
+
+def CopyDirectoryContents(src, dst):
+ """Copy the files from directory src to dst."""
+ dst = os.path.realpath(dst) # realpath() in case dst ends in /..
+ EnsureDirExists(dst)
+ for f in os.listdir(src):
+ CopyFile(os.path.join(src, f), dst)
+
+
+def CheckoutLLVM(commit, dir):
+ """Checkout the LLVM monorepo at a certain git commit in dir. Any local
+ modifications in dir will be lost."""
+ print("Checking out LLVM monorepo %s into '%s'" % (commit, dir))
+
+ git_dir = os.path.join(dir, '.git')
+ fetch_cmd = ['git', '--git-dir', git_dir, 'fetch']
+ checkout_cmd = ['git', 'checkout', commit]
+
+ # Do a somewhat shallow clone to save on bandwidth for GitHub and for us.
+ # The depth was whosen to be deep enough to contain the version we're
+ # building, and shallow enough to save significantly on bandwidth compared to
+ # a full clone.
+ clone_cmd = ['git', 'clone', '--depth', '10000',
+ 'https://github.com/llvm/llvm-project/', dir]
+
+ # Try updating the current repo.
+ if RunCommand(fetch_cmd, fail_hard=False):
+ os.chdir(dir)
+ if RunCommand(checkout_cmd, fail_hard=False):
+ return
+
+ # Otherwise, do a fresh clone.
+ if os.path.isdir(dir):
+ print("Removing %s." % dir)
+ RmTree(dir)
+ if RunCommand(clone_cmd, fail_hard=False):
+ os.chdir(dir)
+ if RunCommand(checkout_cmd, fail_hard=False):
+ return
+
+ print('CheckoutLLVM failed.')
+ sys.exit(1)
+
+
+def UrlOpen(url):
+ # Normally we'd use urllib, but on our bots it can't connect to the GitHub API
+ # due to using too old TLS (see crbug.com/897796#c56). As a horrible
+ # workaround, shell out to curl instead. It seems curl is recent enough on all
+ # our machines that it can connect. On Windows it's in our gnuwin package.
+ # TODO(crbug.com/965937): Use urllib once our Python is recent enough.
+ return subprocess.check_output(['curl', '--silent', url])
+
+
+def GetLatestLLVMCommit():
+ """Get the latest commit hash in the LLVM monorepo."""
+ ref = json.loads(UrlOpen(('https://api.github.com/repos/'
+ 'llvm/llvm-project/git/refs/heads/master')))
+ assert ref['object']['type'] == 'commit'
+ return ref['object']['sha']
+
+
+def GetSvnRevision(commit):
+ """Get the svn revision corresponding to a git commit in the LLVM repo."""
+ commit = json.loads(UrlOpen(('https://api.github.com/repos/llvm/'
+ 'llvm-project/git/commits/' + commit)))
+ revision = re.search("llvm-svn: ([0-9]+)$", commit['message']).group(1)
+ return revision
+
+
+def DeleteChromeToolsShim():
+ OLD_SHIM_DIR = os.path.join(LLVM_DIR, 'tools', 'zzz-chrometools')
+ shutil.rmtree(OLD_SHIM_DIR, ignore_errors=True)
+ shutil.rmtree(CHROME_TOOLS_SHIM_DIR, ignore_errors=True)
+
+
+def CreateChromeToolsShim():
+ """Hooks the Chrome tools into the LLVM build.
+
+ Several Chrome tools have dependencies on LLVM/Clang libraries. The LLVM build
+ detects implicit tools in the tools subdirectory, so this helper install a
+ shim CMakeLists.txt that forwards to the real directory for the Chrome tools.
+
+ Note that the shim directory name intentionally has no - or _. The implicit
+ tool detection logic munges them in a weird way."""
+ assert not any(i in os.path.basename(CHROME_TOOLS_SHIM_DIR) for i in '-_')
+ os.mkdir(CHROME_TOOLS_SHIM_DIR)
+ with file(os.path.join(CHROME_TOOLS_SHIM_DIR, 'CMakeLists.txt'), 'w') as f:
+ f.write('# Automatically generated by tools/clang/scripts/update.py. ' +
+ 'Do not edit.\n')
+ f.write('# Since tools/clang is located in another directory, use the \n')
+ f.write('# two arg version to specify where build artifacts go. CMake\n')
+ f.write('# disallows reuse of the same binary dir for multiple source\n')
+ f.write('# dirs, so the build artifacts need to go into a subdirectory.\n')
+ f.write('if (CHROMIUM_TOOLS_SRC)\n')
+ f.write(' add_subdirectory(${CHROMIUM_TOOLS_SRC} ' +
+ '${CMAKE_CURRENT_BINARY_DIR}/a)\n')
+ f.write('endif (CHROMIUM_TOOLS_SRC)\n')
+
+
+def AddCMakeToPath(args):
+ """Download CMake and add it to PATH."""
+ if args.use_system_cmake:
+ return
+
+ if sys.platform == 'win32':
+ zip_name = 'cmake-3.12.1-win32-x86.zip'
+ dir_name = ['cmake-3.12.1-win32-x86', 'bin']
+ elif sys.platform == 'darwin':
+ zip_name = 'cmake-3.12.1-Darwin-x86_64.tar.gz'
+ dir_name = ['cmake-3.12.1-Darwin-x86_64', 'CMake.app', 'Contents', 'bin']
+ else:
+ zip_name = 'cmake-3.12.1-Linux-x86_64.tar.gz'
+ dir_name = ['cmake-3.12.1-Linux-x86_64', 'bin']
+
+ cmake_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, *dir_name)
+ if not os.path.exists(cmake_dir):
+ DownloadAndUnpack(CDS_URL + '/tools/' + zip_name, LLVM_BUILD_TOOLS_DIR)
+ os.environ['PATH'] = cmake_dir + os.pathsep + os.environ.get('PATH', '')
+
+
+def AddGnuWinToPath():
+ """Download some GNU win tools and add them to PATH."""
+ if sys.platform != 'win32':
+ return
+
+ gnuwin_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, 'gnuwin')
+ GNUWIN_VERSION = '11'
+ GNUWIN_STAMP = os.path.join(gnuwin_dir, 'stamp')
+ if ReadStampFile(GNUWIN_STAMP) == GNUWIN_VERSION:
+ print('GNU Win tools already up to date.')
+ else:
+ zip_name = 'gnuwin-%s.zip' % GNUWIN_VERSION
+ DownloadAndUnpack(CDS_URL + '/tools/' + zip_name, LLVM_BUILD_TOOLS_DIR)
+ WriteStampFile(GNUWIN_VERSION, GNUWIN_STAMP)
+
+ os.environ['PATH'] = gnuwin_dir + os.pathsep + os.environ.get('PATH', '')
+
+ # find.exe, mv.exe and rm.exe are from MSYS (see crrev.com/389632). MSYS uses
+ # Cygwin under the hood, and initializing Cygwin has a race-condition when
+ # getting group and user data from the Active Directory is slow. To work
+ # around this, use a horrible hack telling it not to do that.
+ # See https://crbug.com/905289
+ etc = os.path.join(gnuwin_dir, '..', '..', 'etc')
+ EnsureDirExists(etc)
+ with open(os.path.join(etc, 'nsswitch.conf'), 'w') as f:
+ f.write('passwd: files\n')
+ f.write('group: files\n')
+
+
+def SetMacXcodePath():
+ """Set DEVELOPER_DIR to the path to hermetic Xcode.app on Mac OS X."""
+ if sys.platform != 'darwin':
+ return
+
+ xcode_path = os.path.join(CHROMIUM_DIR, 'build', 'mac_files', 'Xcode.app')
+ if os.path.exists(xcode_path):
+ os.environ['DEVELOPER_DIR'] = xcode_path
+
+
+def VerifyVersionOfBuiltClangMatchesVERSION():
+ """Checks that `clang --version` outputs RELEASE_VERSION. If this
+ fails, update.RELEASE_VERSION is out-of-date and needs to be updated (possibly
+ in an `if args.llvm_force_head_revision:` block inupdate. main() first)."""
+ clang = os.path.join(LLVM_BUILD_DIR, 'bin', 'clang')
+ if sys.platform == 'win32':
+ clang += '-cl.exe'
+ version_out = subprocess.check_output([clang, '--version'])
+ version_out = re.match(r'clang version ([0-9.]+)', version_out).group(1)
+ if version_out != RELEASE_VERSION:
+ print(('unexpected clang version %s (not %s), '
+ 'update RELEASE_VERSION in update.py')
+ % (version_out, RELEASE_VERSION))
+ sys.exit(1)
+
+
+def gn_arg(v):
+ if v == 'True':
+ return True
+ if v == 'False':
+ return False
+ raise argparse.ArgumentTypeError('Expected one of %r or %r' % (
+ 'True', 'False'))
+
+
+def main():
+ parser = argparse.ArgumentParser(description='Build Clang.')
+ parser.add_argument('--bootstrap', action='store_true',
+ help='first build clang with CC, then with itself.')
+ parser.add_argument('--disable-asserts', action='store_true',
+ help='build with asserts disabled')
+ parser.add_argument('--gcc-toolchain', help='(no longer used)')
+ parser.add_argument('--lto-lld', action='store_true',
+ help='build lld with LTO (only applies on Linux)')
+ parser.add_argument('--llvm-force-head-revision', action='store_true',
+ help='build the latest revision')
+ parser.add_argument('--run-tests', action='store_true',
+ help='run tests after building')
+ parser.add_argument('--skip-build', action='store_true',
+ help='do not build anything')
+ parser.add_argument('--skip-checkout', action='store_true',
+ help='do not create or update any checkouts')
+ parser.add_argument('--extra-tools', nargs='*', default=[],
+ help='select additional chrome tools to build')
+ parser.add_argument('--use-system-cmake', action='store_true',
+ help='use the cmake from PATH instead of downloading '
+ 'and using prebuilt cmake binaries')
+ parser.add_argument('--with-android', type=gn_arg, nargs='?', const=True,
+ help='build the Android ASan runtime (linux only)',
+ default=sys.platform.startswith('linux'))
+ parser.add_argument('--without-android', action='store_false',
+ help='don\'t build Android ASan runtime (linux only)',
+ dest='with_android')
+ parser.add_argument('--without-fuchsia', action='store_false',
+ help='don\'t build Fuchsia clang_rt runtime (linux/mac)',
+ dest='with_fuchsia',
+ default=sys.platform in ('linux2', 'darwin'))
+ args = parser.parse_args()
+
+ if args.lto_lld and not args.bootstrap:
+ print('--lto-lld requires --bootstrap')
+ return 1
+ if args.lto_lld and not sys.platform.startswith('linux'):
+ # TODO(hans): Use it on Windows too.
+ print('--lto-lld is only effective on Linux. Ignoring the option.')
+ args.lto_lld = False
+ if args.with_android and not os.path.exists(ANDROID_NDK_DIR):
+ print('Android NDK not found at ' + ANDROID_NDK_DIR)
+ print('The Android NDK is needed to build a Clang whose -fsanitize=address')
+ print('works on Android. See ')
+ print('https://www.chromium.org/developers/how-tos/android-build-instructions')
+ print('for how to install the NDK, or pass --without-android.')
+ return 1
+
+ if args.llvm_force_head_revision:
+ # Don't build fuchsia runtime on ToT bots at all.
+ args.with_fuchsia = False
+
+ if args.with_fuchsia and not os.path.exists(FUCHSIA_SDK_DIR):
+ print('Fuchsia SDK not found at ' + FUCHSIA_SDK_DIR)
+ print('The Fuchsia SDK is needed to build libclang_rt for Fuchsia.')
+ print('Install the Fuchsia SDK by adding fuchsia to the ')
+ print('target_os section in your .gclient and running hooks, ')
+ print('or pass --without-fuchsia.')
+ print('https://chromium.googlesource.com/chromium/src/+/master/docs/fuchsia_build_instructions.md')
+ print('for general Fuchsia build instructions.')
+ return 1
+
+
+ # The gnuwin package also includes curl, which is needed to interact with the
+ # github API below.
+ # TODO(crbug.com/965937): Use urllib once our Python is recent enough, and
+ # move this down to where we fetch other build tools.
+ AddGnuWinToPath()
+
+ global CLANG_REVISION, PACKAGE_VERSION
+ if args.llvm_force_head_revision:
+ CLANG_REVISION = GetLatestLLVMCommit()
+ PACKAGE_VERSION = '%s-%s-0' % (GetSvnRevision(CLANG_REVISION),
+ CLANG_REVISION[:8])
+
+ # Don't buffer stdout, so that print statements are immediately flushed.
+ sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
+
+ print('Locally building clang %s...' % PACKAGE_VERSION)
+ WriteStampFile('', STAMP_FILE)
+ WriteStampFile('', FORCE_HEAD_REVISION_FILE)
+
+ # DEVELOPER_DIR needs to be set when Xcode isn't in a standard location
+ # and xcode-select wasn't run.
+ SetMacXcodePath()
+
+ AddCMakeToPath(args)
+ DeleteChromeToolsShim()
+
+ if not args.skip_checkout:
+ CheckoutLLVM(CLANG_REVISION, LLVM_DIR);
+
+ if args.skip_build:
+ return 0
+
+ cc, cxx = None, None
+
+ cflags = []
+ cxxflags = []
+ ldflags = []
+
+ targets = 'AArch64;ARM;Mips;PowerPC;SystemZ;WebAssembly;X86'
+
+ projects = 'clang;compiler-rt;lld;chrometools'
+
+ if sys.platform == 'darwin':
+ # clang needs libc++, else -stdlib=libc++ won't find includes
+ # (this is needed for bootstrap builds and for building the fuchsia runtime)
+ projects += ';libcxx'
+
+ base_cmake_args = ['-GNinja',
+ '-DCMAKE_BUILD_TYPE=Release',
+ '-DLLVM_ENABLE_ASSERTIONS=%s' %
+ ('OFF' if args.disable_asserts else 'ON'),
+ '-DLLVM_ENABLE_PROJECTS=' + projects,
+ '-DLLVM_TARGETS_TO_BUILD=' + targets,
+ '-DLLVM_ENABLE_PIC=OFF',
+ '-DLLVM_ENABLE_UNWIND_TABLES=OFF',
+ '-DLLVM_ENABLE_TERMINFO=OFF',
+ '-DCLANG_PLUGIN_SUPPORT=OFF',
+ '-DCLANG_ENABLE_STATIC_ANALYZER=OFF',
+ '-DCLANG_ENABLE_ARCMT=OFF',
+ # TODO(crbug.com/929645): Use newer toolchain to host.
+ '-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON',
+ '-DBUG_REPORT_URL=' + BUG_REPORT_URL,
+ # See PR41956: Don't link libcxx into libfuzzer.
+ '-DCOMPILER_RT_USE_LIBCXX=NO',
+ ]
+
+ if sys.platform == 'win32':
+ base_cmake_args.append('-DLLVM_USE_CRT_RELEASE=MT')
+
+ if sys.platform == 'darwin':
+ # Use the system libc++abi.
+ # TODO(hans): use https://reviews.llvm.org/D62060 instead
+ base_cmake_args.append('-DLIBCXX_CXX_ABI=libcxxabi')
+ base_cmake_args.append('-DLIBCXX_CXX_ABI_SYSTEM=1')
+
+ if sys.platform != 'win32':
+ # libxml2 is required by the Win manifest merging tool used in cross-builds.
+ base_cmake_args.append('-DLLVM_ENABLE_LIBXML2=FORCE_ON')
+
+ if args.bootstrap:
+ print('Building bootstrap compiler')
+ if os.path.exists(LLVM_BOOTSTRAP_DIR):
+ RmTree(LLVM_BOOTSTRAP_DIR)
+ EnsureDirExists(LLVM_BOOTSTRAP_DIR)
+ os.chdir(LLVM_BOOTSTRAP_DIR)
+
+ projects = 'clang'
+ if args.lto_lld:
+ projects += ';lld'
+ if sys.platform == 'darwin':
+ # Need libc++ and compiler-rt for the bootstrap compiler on mac.
+ projects += ';libcxx;compiler-rt'
+
+ bootstrap_targets = 'X86'
+ if sys.platform == 'darwin':
+ # Need ARM and AArch64 for building the ios clang_rt.
+ bootstrap_targets += ';ARM;AArch64'
+ bootstrap_args = base_cmake_args + [
+ '-DLLVM_TARGETS_TO_BUILD=' + bootstrap_targets,
+ '-DLLVM_ENABLE_PROJECTS=' + projects,
+ '-DCMAKE_INSTALL_PREFIX=' + LLVM_BOOTSTRAP_INSTALL_DIR,
+ '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
+ '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
+ # Ignore args.disable_asserts for the bootstrap compiler.
+ '-DLLVM_ENABLE_ASSERTIONS=ON',
+ ]
+ if sys.platform == 'darwin':
+ # On macOS, the bootstrap toolchain needs to have compiler-rt because
+ # dsymutil's link needs libclang_rt.osx.a. Only the x86_64 osx
+ # libraries are needed though, and only libclang_rt (i.e.
+ # COMPILER_RT_BUILD_BUILTINS).
+ bootstrap_args.extend([
+ '-DDARWIN_osx_ARCHS=x86_64',
+ '-DCOMPILER_RT_BUILD_BUILTINS=ON',
+ '-DCOMPILER_RT_BUILD_CRT=OFF',
+ '-DCOMPILER_RT_BUILD_LIBFUZZER=OFF',
+ '-DCOMPILER_RT_BUILD_PROFILE=OFF',
+ '-DCOMPILER_RT_BUILD_SANITIZERS=OFF',
+ '-DCOMPILER_RT_BUILD_XRAY=OFF',
+ '-DCOMPILER_RT_ENABLE_IOS=OFF',
+ '-DCOMPILER_RT_ENABLE_WATCHOS=OFF',
+ '-DCOMPILER_RT_ENABLE_TVOS=OFF',
+ ])
+ if cc is not None: bootstrap_args.append('-DCMAKE_C_COMPILER=' + cc)
+ if cxx is not None: bootstrap_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
+ RunCommand(['cmake'] + bootstrap_args + [os.path.join(LLVM_DIR, 'llvm')],
+ msvc_arch='x64')
+ RunCommand(['ninja'], msvc_arch='x64')
+ if args.run_tests:
+ if sys.platform == 'win32':
+ CopyDiaDllTo(os.path.join(LLVM_BOOTSTRAP_DIR, 'bin'))
+ RunCommand(['ninja', 'check-all'], msvc_arch='x64')
+ RunCommand(['ninja', 'install'], msvc_arch='x64')
+
+ if sys.platform == 'win32':
+ cc = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'clang-cl.exe')
+ cxx = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'clang-cl.exe')
+ # CMake has a hard time with backslashes in compiler paths:
+ # https://stackoverflow.com/questions/13050827
+ cc = cc.replace('\\', '/')
+ cxx = cxx.replace('\\', '/')
+ else:
+ cc = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'clang')
+ cxx = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'clang++')
+
+ print('Bootstrap compiler installed; building final compiler.')
+
+
+ compiler_rt_args = [
+ '-DCOMPILER_RT_BUILD_CRT=OFF',
+ '-DCOMPILER_RT_BUILD_LIBFUZZER=ON',
+ '-DCOMPILER_RT_BUILD_PROFILE=ON',
+ '-DCOMPILER_RT_BUILD_SANITIZERS=ON',
+ '-DCOMPILER_RT_BUILD_XRAY=OFF',
+ ]
+ if sys.platform == 'darwin':
+ compiler_rt_args.extend([
+ '-DCOMPILER_RT_BUILD_BUILTINS=ON',
+ '-DCOMPILER_RT_ENABLE_IOS=ON',
+ '-DCOMPILER_RT_ENABLE_WATCHOS=OFF',
+ '-DCOMPILER_RT_ENABLE_TVOS=OFF',
+ # armv7 is A5 and earlier, armv7s is A6+ (2012 and later, before 64-bit
+ # iPhones). armv7k is Apple Watch, which we don't need.
+ '-DDARWIN_ios_ARCHS=armv7;armv7s;arm64',
+ '-DDARWIN_iossim_ARCHS=i386;x86_64',
+ # We don't need 32-bit intel support for macOS, we only ship 64-bit.
+ '-DDARWIN_osx_ARCHS=x86_64',
+ ])
+ else:
+ compiler_rt_args.append('-DCOMPILER_RT_BUILD_BUILTINS=OFF')
+ if sys.platform.startswith('linux'):
+ # Only build the 64-bit runtime, we don't need the 32-bit one.
+ compiler_rt_args.extend([
+ '-DCMAKE_C_COMPILER_TARGET=x86_64-unknown-linux-gnu',
+ '-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON',
+ ])
+
+ # LLVM uses C++11 starting in llvm 3.5. On Linux, this means libstdc++4.7+ is
+ # needed, on OS X it requires libc++. clang only automatically links to libc++
+ # when targeting OS X 10.9+, so add stdlib=libc++ explicitly so clang can run
+ # on OS X versions as old as 10.7.
+ deployment_target = ''
+
+ if sys.platform == 'darwin' and args.bootstrap:
+ # When building on 10.9, /usr/include usually doesn't exist, and while
+ # Xcode's clang automatically sets a sysroot, self-built clangs don't.
+ cflags = ['-isysroot', subprocess.check_output(
+ ['xcrun', '--show-sdk-path']).rstrip()]
+ cxxflags = ['-stdlib=libc++'] + cflags
+ ldflags += ['-stdlib=libc++']
+ deployment_target = '10.7'
+
+ # If building at head, define a macro that plugins can use for #ifdefing
+ # out code that builds at head, but not at CLANG_REVISION or vice versa.
+ if args.llvm_force_head_revision:
+ cflags += ['-DLLVM_FORCE_HEAD_REVISION']
+ cxxflags += ['-DLLVM_FORCE_HEAD_REVISION']
+
+ # Build PDBs for archival on Windows. Don't use RelWithDebInfo since it
+ # has different optimization defaults than Release.
+ # Also disable stack cookies (/GS-) for performance.
+ if sys.platform == 'win32':
+ cflags += ['/Zi', '/GS-']
+ cxxflags += ['/Zi', '/GS-']
+ ldflags += ['/DEBUG', '/OPT:REF', '/OPT:ICF']
+
+ deployment_env = None
+ if deployment_target:
+ deployment_env = os.environ.copy()
+ deployment_env['MACOSX_DEPLOYMENT_TARGET'] = deployment_target
+
+ # Build lld and code coverage tools. This is done separately from the rest of
+ # the build because these tools require threading support.
+ tools_with_threading = [ 'dsymutil', 'lld', 'llvm-cov', 'llvm-profdata' ]
+ print('Building the following tools with threading support: %s' %
+ str(tools_with_threading))
+
+ if os.path.exists(THREADS_ENABLED_BUILD_DIR):
+ RmTree(THREADS_ENABLED_BUILD_DIR)
+ EnsureDirExists(THREADS_ENABLED_BUILD_DIR)
+ os.chdir(THREADS_ENABLED_BUILD_DIR)
+
+ threads_enabled_cmake_args = base_cmake_args + [
+ '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
+ '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
+ '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags),
+ '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags),
+ '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags)]
+ if cc is not None:
+ threads_enabled_cmake_args.append('-DCMAKE_C_COMPILER=' + cc)
+ if cxx is not None:
+ threads_enabled_cmake_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
+
+ if args.lto_lld:
+ # Build lld with LTO. That speeds up the linker by ~10%.
+ # We only use LTO for Linux now.
+ #
+ # The linker expects all archive members to have symbol tables, so the
+ # archiver needs to be able to create symbol tables for bitcode files.
+ # GNU ar and ranlib don't understand bitcode files, but llvm-ar and
+ # llvm-ranlib do, so use them.
+ ar = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'llvm-ar')
+ ranlib = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'llvm-ranlib')
+ threads_enabled_cmake_args += [
+ '-DCMAKE_AR=' + ar,
+ '-DCMAKE_RANLIB=' + ranlib,
+ '-DLLVM_ENABLE_LTO=thin',
+ '-DLLVM_USE_LINKER=lld']
+
+ RunCommand(['cmake'] + threads_enabled_cmake_args +
+ [os.path.join(LLVM_DIR, 'llvm')],
+ msvc_arch='x64', env=deployment_env)
+ RunCommand(['ninja'] + tools_with_threading, msvc_arch='x64')
+
+ default_tools = ['plugins', 'blink_gc_plugin', 'translation_unit']
+ chrome_tools = list(set(default_tools + args.extra_tools))
+ if cc is not None: base_cmake_args.append('-DCMAKE_C_COMPILER=' + cc)
+ if cxx is not None: base_cmake_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
+ cmake_args = base_cmake_args + compiler_rt_args + [
+ '-DLLVM_ENABLE_THREADS=OFF',
+ '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
+ '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
+ '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags),
+ '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags),
+ '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags),
+ '-DCMAKE_INSTALL_PREFIX=' + LLVM_BUILD_DIR,
+ '-DCHROMIUM_TOOLS_SRC=%s' % os.path.join(CHROMIUM_DIR, 'tools', 'clang'),
+ '-DCHROMIUM_TOOLS=%s' % ';'.join(chrome_tools)]
+ if sys.platform == 'darwin':
+ cmake_args += ['-DCOMPILER_RT_ENABLE_IOS=ON',
+ '-DSANITIZER_MIN_OSX_VERSION=10.7']
+
+ # TODO(crbug.com/41866): Use -DLLVM_EXTERNAL_PROJECTS instead.
+ CreateChromeToolsShim()
+
+ if os.path.exists(LLVM_BUILD_DIR):
+ RmTree(LLVM_BUILD_DIR)
+ EnsureDirExists(LLVM_BUILD_DIR)
+ os.chdir(LLVM_BUILD_DIR)
+ RunCommand(['cmake'] + cmake_args + [os.path.join(LLVM_DIR, 'llvm')],
+ msvc_arch='x64', env=deployment_env)
+ RunCommand(['ninja'], msvc_arch='x64')
+
+ # Copy in the threaded versions of lld and other tools.
+ if sys.platform == 'win32':
+ CopyFile(os.path.join(THREADS_ENABLED_BUILD_DIR, 'bin', 'lld-link.exe'),
+ os.path.join(LLVM_BUILD_DIR, 'bin'))
+ CopyFile(os.path.join(THREADS_ENABLED_BUILD_DIR, 'bin', 'lld.pdb'),
+ os.path.join(LLVM_BUILD_DIR, 'bin'))
+ else:
+ for tool in tools_with_threading:
+ CopyFile(os.path.join(THREADS_ENABLED_BUILD_DIR, 'bin', tool),
+ os.path.join(LLVM_BUILD_DIR, 'bin'))
+
+ if chrome_tools:
+ # If any Chromium tools were built, install those now.
+ RunCommand(['ninja', 'cr-install'], msvc_arch='x64')
+
+ VerifyVersionOfBuiltClangMatchesVERSION()
+
+ if sys.platform == 'win32':
+ platform = 'windows'
+ elif sys.platform == 'darwin':
+ platform = 'darwin'
+ else:
+ assert sys.platform.startswith('linux')
+ platform = 'linux'
+ rt_lib_dst_dir = os.path.join(LLVM_BUILD_DIR, 'lib', 'clang',
+ RELEASE_VERSION, 'lib', platform)
+
+ # Do an out-of-tree build of compiler-rt for 32-bit Win clang_rt.profile.lib.
+ if sys.platform == 'win32':
+ if os.path.isdir(COMPILER_RT_BUILD_DIR):
+ RmTree(COMPILER_RT_BUILD_DIR)
+ os.makedirs(COMPILER_RT_BUILD_DIR)
+ os.chdir(COMPILER_RT_BUILD_DIR)
+ if args.bootstrap:
+ # The bootstrap compiler produces 64-bit binaries by default.
+ cflags += ['-m32']
+ cxxflags += ['-m32']
+ compiler_rt_args = base_cmake_args + [
+ '-DLLVM_ENABLE_THREADS=OFF',
+ '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
+ '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
+ '-DCOMPILER_RT_BUILD_BUILTINS=OFF',
+ '-DCOMPILER_RT_BUILD_CRT=OFF',
+ '-DCOMPILER_RT_BUILD_LIBFUZZER=OFF',
+ '-DCOMPILER_RT_BUILD_PROFILE=ON',
+ '-DCOMPILER_RT_BUILD_SANITIZERS=OFF',
+ '-DCOMPILER_RT_BUILD_XRAY=OFF',
+ ]
+ RunCommand(['cmake'] + compiler_rt_args +
+ [os.path.join(LLVM_DIR, 'llvm')],
+ msvc_arch='x86', env=deployment_env)
+ RunCommand(['ninja', 'compiler-rt'], msvc_arch='x86')
+
+ # Copy select output to the main tree.
+ rt_lib_src_dir = os.path.join(COMPILER_RT_BUILD_DIR, 'lib', 'clang',
+ RELEASE_VERSION, 'lib', platform)
+ # Static and dynamic libraries:
+ CopyDirectoryContents(rt_lib_src_dir, rt_lib_dst_dir)
+
+ if args.with_android:
+ make_toolchain = os.path.join(
+ ANDROID_NDK_DIR, 'build', 'tools', 'make_standalone_toolchain.py')
+ # TODO(thakis): Now that the NDK uses clang, try to build all archs in
+ # one LLVM build instead of making 3 different toolchains and building
+ # 3 times.
+ for target_arch in ['aarch64', 'arm', 'i686']:
+ # Make standalone Android toolchain for target_arch.
+ toolchain_dir = os.path.join(
+ LLVM_BUILD_DIR, 'android-toolchain-' + target_arch)
+ api_level = '21' if target_arch == 'aarch64' else '19'
+ RunCommand([
+ make_toolchain,
+ '--api=' + api_level,
+ '--force',
+ '--install-dir=%s' % toolchain_dir,
+ '--stl=libc++',
+ '--arch=' + {
+ 'aarch64': 'arm64',
+ 'arm': 'arm',
+ 'i686': 'x86',
+ }[target_arch]])
+
+ # NDK r16 "helpfully" installs libc++ as libstdc++ "so the compiler will
+ # pick it up by default". Only these days, the compiler tries to find
+ # libc++ instead. See https://crbug.com/902270.
+ shutil.copy(os.path.join(toolchain_dir, 'sysroot/usr/lib/libstdc++.a'),
+ os.path.join(toolchain_dir, 'sysroot/usr/lib/libc++.a'))
+ shutil.copy(os.path.join(toolchain_dir, 'sysroot/usr/lib/libstdc++.so'),
+ os.path.join(toolchain_dir, 'sysroot/usr/lib/libc++.so'))
+
+ # Build compiler-rt runtimes needed for Android in a separate build tree.
+ build_dir = os.path.join(LLVM_BUILD_DIR, 'android-' + target_arch)
+ if not os.path.exists(build_dir):
+ os.mkdir(os.path.join(build_dir))
+ os.chdir(build_dir)
+ target_triple = target_arch
+ if target_arch == 'arm':
+ target_triple = 'armv7'
+ target_triple += '-linux-android' + api_level
+ cflags = ['--target=%s' % target_triple,
+ '--sysroot=%s/sysroot' % toolchain_dir,
+ '-B%s' % toolchain_dir]
+ android_args = base_cmake_args + [
+ '-DLLVM_ENABLE_THREADS=OFF',
+ '-DCMAKE_C_COMPILER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang'),
+ '-DCMAKE_CXX_COMPILER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang++'),
+ '-DLLVM_CONFIG_PATH=' + os.path.join(LLVM_BUILD_DIR, 'bin/llvm-config'),
+ '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
+ '-DCMAKE_CXX_FLAGS=' + ' '.join(cflags),
+ '-DCMAKE_ASM_FLAGS=' + ' '.join(cflags),
+ "-DCOMPILER_RT_BUILD_BUILTINS=OFF",
+ "-DCOMPILER_RT_BUILD_CRT=OFF",
+ "-DCOMPILER_RT_BUILD_LIBFUZZER=OFF",
+ "-DCOMPILER_RT_BUILD_PROFILE=ON",
+ "-DCOMPILER_RT_BUILD_SANITIZERS=ON",
+ "-DCOMPILER_RT_BUILD_XRAY=OFF",
+ '-DSANITIZER_CXX_ABI=libcxxabi',
+ '-DCMAKE_SHARED_LINKER_FLAGS=-Wl,-u__cxa_demangle',
+ '-DANDROID=1']
+ RunCommand(['cmake'] + android_args + [COMPILER_RT_DIR])
+
+ # We use ASan i686 build for fuzzing.
+ libs_want = ['lib/linux/libclang_rt.asan-{0}-android.so']
+ if target_arch in ['aarch64', 'arm']:
+ libs_want += [
+ 'lib/linux/libclang_rt.ubsan_standalone-{0}-android.so',
+ 'lib/linux/libclang_rt.profile-{0}-android.a',
+ ]
+ if target_arch == 'aarch64':
+ libs_want += ['lib/linux/libclang_rt.hwasan-{0}-android.so']
+ libs_want = [lib.format(target_arch) for lib in libs_want]
+ RunCommand(['ninja'] + libs_want)
+
+ # And copy them into the main build tree.
+ for p in libs_want:
+ shutil.copy(p, rt_lib_dst_dir)
+
+ if args.with_fuchsia:
+ # Fuchsia links against libclang_rt.builtins-<arch>.a instead of libgcc.a.
+ for target_arch in ['aarch64', 'x86_64']:
+ fuchsia_arch_name = {'aarch64': 'arm64', 'x86_64': 'x64'}[target_arch]
+ toolchain_dir = os.path.join(
+ FUCHSIA_SDK_DIR, 'arch', fuchsia_arch_name, 'sysroot')
+ # Build clang_rt runtime for Fuchsia in a separate build tree.
+ build_dir = os.path.join(LLVM_BUILD_DIR, 'fuchsia-' + target_arch)
+ if not os.path.exists(build_dir):
+ os.mkdir(os.path.join(build_dir))
+ os.chdir(build_dir)
+ target_spec = target_arch + '-fuchsia'
+ # TODO(thakis): Might have to pass -B here once sysroot contains
+ # binaries (e.g. gas for arm64?)
+ fuchsia_args = base_cmake_args + [
+ '-DLLVM_ENABLE_THREADS=OFF',
+ '-DCMAKE_C_COMPILER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang'),
+ '-DCMAKE_CXX_COMPILER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang++'),
+ '-DCMAKE_LINKER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang'),
+ '-DCMAKE_AR=' + os.path.join(LLVM_BUILD_DIR, 'bin/llvm-ar'),
+ '-DLLVM_CONFIG_PATH=' + os.path.join(LLVM_BUILD_DIR, 'bin/llvm-config'),
+ '-DCMAKE_SYSTEM_NAME=Fuchsia',
+ '-DCMAKE_C_COMPILER_TARGET=%s-fuchsia' % target_arch,
+ '-DCMAKE_ASM_COMPILER_TARGET=%s-fuchsia' % target_arch,
+ "-DCOMPILER_RT_BUILD_BUILTINS=ON",
+ "-DCOMPILER_RT_BUILD_CRT=OFF",
+ "-DCOMPILER_RT_BUILD_LIBFUZZER=OFF",
+ "-DCOMPILER_RT_BUILD_PROFILE=OFF",
+ "-DCOMPILER_RT_BUILD_SANITIZERS=OFF",
+ "-DCOMPILER_RT_BUILD_XRAY=OFF",
+ '-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON',
+ '-DCMAKE_SYSROOT=%s' % toolchain_dir,
+ # TODO(thakis|scottmg): Use PER_TARGET_RUNTIME_DIR for all platforms.
+ # https://crbug.com/882485.
+ '-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON',
+
+ # These are necessary because otherwise CMake tries to build an
+ # executable to test to see if the compiler is working, but in doing so,
+ # it links against the builtins.a that we're about to build.
+ '-DCMAKE_C_COMPILER_WORKS=ON',
+ '-DCMAKE_ASM_COMPILER_WORKS=ON',
+ ]
+ RunCommand(['cmake'] +
+ fuchsia_args +
+ [os.path.join(COMPILER_RT_DIR, 'lib', 'builtins')])
+ builtins_a = 'libclang_rt.builtins.a'
+ RunCommand(['ninja', builtins_a])
+
+ # And copy it into the main build tree.
+ fuchsia_lib_dst_dir = os.path.join(LLVM_BUILD_DIR, 'lib', 'clang',
+ RELEASE_VERSION, target_spec, 'lib')
+ if not os.path.exists(fuchsia_lib_dst_dir):
+ os.makedirs(fuchsia_lib_dst_dir)
+ CopyFile(os.path.join(build_dir, target_spec, 'lib', builtins_a),
+ fuchsia_lib_dst_dir)
+
+ # Run tests.
+ if args.run_tests or args.llvm_force_head_revision:
+ RunCommand(['ninja', '-C', LLVM_BUILD_DIR, 'cr-check-all'], msvc_arch='x64')
+
+ if args.run_tests:
+ if sys.platform == 'win32':
+ CopyDiaDllTo(os.path.join(LLVM_BUILD_DIR, 'bin'))
+ test_targets = [ 'check-all' ]
+ if sys.platform == 'darwin':
+ # TODO(thakis): Run check-all on Darwin too, https://crbug.com/959361
+ test_targets = [ 'check-llvm', 'check-clang', 'check-lld' ]
+ RunCommand(['ninja', '-C', LLVM_BUILD_DIR] + test_targets, msvc_arch='x64')
+
+ if sys.platform == 'darwin':
+ for dylib in glob.glob(os.path.join(rt_lib_dst_dir, '*.dylib')):
+ # Fix LC_ID_DYLIB for the ASan dynamic libraries to be relative to
+ # @executable_path.
+ # Has to happen after running tests.
+ # TODO(glider): this is transitional. We'll need to fix the dylib
+ # name either in our build system, or in Clang. See also
+ # http://crbug.com/344836.
+ subprocess.call(['install_name_tool', '-id',
+ '@executable_path/' + os.path.basename(dylib), dylib])
+
+ WriteStampFile(PACKAGE_VERSION, STAMP_FILE)
+ WriteStampFile(PACKAGE_VERSION, FORCE_HEAD_REVISION_FILE)
+ print('Clang build was successful.')
+ return 0
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/chromium/tools/clang/scripts/download_lld_mac.py b/chromium/tools/clang/scripts/download_lld_mac.py
index dace92dbd9e..3bb2b68a7ef 100755
--- a/chromium/tools/clang/scripts/download_lld_mac.py
+++ b/chromium/tools/clang/scripts/download_lld_mac.py
@@ -20,7 +20,9 @@ def AlreadyUpToDate():
if not os.path.exists(LLD_LINK_PATH):
return False
lld_rev = subprocess.check_output([LLD_LINK_PATH, '--version'])
- return (re.match(r'LLD.*\(.*trunk (\d+)\)', lld_rev).group(1) ==
+ # Version output example:
+ # LLD 9.0.0 (https://github.com/llvm/llvm-project/ 342571e8d6eb1afb151ae1103431798e3d24054f)
+ return (re.match(r'LLD.*\(.*git.*llvm.* ([0-9a-f]+)\)', lld_rev).group(1) ==
update.CLANG_REVISION)
diff --git a/chromium/tools/clang/scripts/package.py b/chromium/tools/clang/scripts/package.py
index 8310d7caa3b..0af8d1666bc 100755
--- a/chromium/tools/clang/scripts/package.py
+++ b/chromium/tools/clang/scripts/package.py
@@ -15,6 +15,8 @@ import subprocess
import sys
import tarfile
+from update import RELEASE_VERSION
+
# Path constants.
THIS_DIR = os.path.dirname(__file__)
CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..'))
@@ -87,20 +89,11 @@ def RunGsutil(args):
return subprocess.call([sys.executable, GetGsutilPath()] + args)
-def GsutilArchiveExists(archive_name, platform):
- gsutil_args = ['-q', 'stat',
- 'gs://chromium-browser-clang-staging/%s/%s.tgz' %
- (platform, archive_name)]
- return RunGsutil(gsutil_args) == 0
-
-
-def MaybeUpload(args, archive_name, platform):
- gsutil_args = ['cp', '-a', 'public-read',
- '%s.tgz' % archive_name,
- 'gs://chromium-browser-clang-staging/%s/%s.tgz' %
- (platform, archive_name)]
- if args.upload:
- print 'Uploading %s to Google Cloud Storage...' % archive_name
+def MaybeUpload(do_upload, filename, platform, extra_gsutil_args=[]):
+ gsutil_args = ['cp'] + extra_gsutil_args + ['-a', 'public-read', filename,
+ 'gs://chromium-browser-clang-staging/%s/%s' % (platform, filename)]
+ if do_upload:
+ print 'Uploading %s to Google Cloud Storage...' % filename
exit_code = RunGsutil(gsutil_args)
if exit_code != 0:
print "gsutil failed, exit_code: %s" % exit_code
@@ -184,28 +177,15 @@ def main():
platform = 'Linux_x64'
with open('buildlog.txt', 'w') as log:
- Tee('Diff in llvm:\n', log)
- TeeCmd(['svn', 'stat', LLVM_DIR], log, fail_hard=False)
- TeeCmd(['svn', 'diff', LLVM_DIR], log, fail_hard=False)
- Tee('Diff in llvm/tools/clang:\n', log)
- TeeCmd(['svn', 'stat', os.path.join(LLVM_DIR, 'tools', 'clang')],
- log, fail_hard=False)
- TeeCmd(['svn', 'diff', os.path.join(LLVM_DIR, 'tools', 'clang')],
- log, fail_hard=False)
- # TODO(thakis): compiler-rt is in projects/compiler-rt on Windows but
- # llvm/compiler-rt elsewhere. So this diff call is currently only right on
- # Windows.
- Tee('Diff in llvm/compiler-rt:\n', log)
- TeeCmd(['svn', 'stat', os.path.join(LLVM_DIR, 'projects', 'compiler-rt')],
- log, fail_hard=False)
- TeeCmd(['svn', 'diff', os.path.join(LLVM_DIR, 'projects', 'compiler-rt')],
- log, fail_hard=False)
- Tee('Diff in llvm/projects/libcxx:\n', log)
- TeeCmd(['svn', 'stat', os.path.join(LLVM_DIR, 'projects', 'libcxx')],
- log, fail_hard=False)
- TeeCmd(['svn', 'diff', os.path.join(LLVM_DIR, 'projects', 'libcxx')],
- log, fail_hard=False)
-
+ if os.path.exists(LLVM_DIR):
+ Tee('Diff in llvm:\n', log)
+ cwd = os.getcwd()
+ os.chdir(LLVM_DIR)
+ TeeCmd(['git', 'status'], log, fail_hard=False)
+ TeeCmd(['git', 'diff'], log, fail_hard=False)
+ os.chdir(cwd)
+ else:
+ Tee('No previous llvm checkout.\n', log)
Tee('Starting build\n', log)
# Do a clobber build.
@@ -216,8 +196,8 @@ def main():
opt_flags = []
if sys.platform.startswith('linux'):
opt_flags += ['--lto-lld']
- build_cmd = [sys.executable, os.path.join(THIS_DIR, 'update.py'),
- '--bootstrap', '--disable-asserts', '--force-local-build',
+ build_cmd = [sys.executable, os.path.join(THIS_DIR, 'build.py'),
+ '--bootstrap', '--disable-asserts',
'--run-tests'] + opt_flags
TeeCmd(build_cmd, log)
@@ -230,149 +210,152 @@ def main():
# Copy a whitelist of files to the directory we're going to tar up.
# This supports the same patterns that the fnmatch module understands.
+ # '$V' is replaced by RELEASE_VERSION further down.
exe_ext = '.exe' if sys.platform == 'win32' else ''
- want = ['bin/llvm-pdbutil' + exe_ext,
- 'bin/llvm-symbolizer' + exe_ext,
- 'bin/llvm-undname' + exe_ext,
- # Copy built-in headers (lib/clang/3.x.y/include).
- 'lib/clang/*/include/*',
- 'lib/clang/*/share/asan_blacklist.txt',
- 'lib/clang/*/share/cfi_blacklist.txt',
- ]
+ want = [
+ 'bin/llvm-pdbutil' + exe_ext,
+ 'bin/llvm-symbolizer' + exe_ext,
+ 'bin/llvm-undname' + exe_ext,
+ # Copy built-in headers (lib/clang/3.x.y/include).
+ 'lib/clang/$V/include/*',
+ 'lib/clang/$V/share/asan_blacklist.txt',
+ 'lib/clang/$V/share/cfi_blacklist.txt',
+ ]
if sys.platform == 'win32':
- want.append('bin/clang-cl.exe')
- want.append('bin/lld-link.exe')
+ want.extend([
+ 'bin/clang-cl.exe',
+ 'bin/lld-link.exe',
+ ])
else:
- want.append('bin/clang')
+ want.extend([
+ 'bin/clang',
+
+ # Include libclang_rt.builtins.a for Fuchsia targets.
+ 'lib/clang/$V/aarch64-fuchsia/lib/libclang_rt.builtins.a',
+ 'lib/clang/$V/x86_64-fuchsia/lib/libclang_rt.builtins.a',
+ ])
if sys.platform == 'darwin':
want.extend([
- # AddressSanitizer runtime.
- 'lib/clang/*/lib/darwin/libclang_rt.asan_iossim_dynamic.dylib',
- 'lib/clang/*/lib/darwin/libclang_rt.asan_osx_dynamic.dylib',
+ # AddressSanitizer runtime.
+ 'lib/clang/$V/lib/darwin/libclang_rt.asan_iossim_dynamic.dylib',
+ 'lib/clang/$V/lib/darwin/libclang_rt.asan_osx_dynamic.dylib',
- # Fuzzing instrumentation (-fsanitize=fuzzer-no-link).
- 'lib/clang/*/lib/darwin/libclang_rt.fuzzer_no_main_osx.a',
+ # Fuzzing instrumentation (-fsanitize=fuzzer-no-link).
+ 'lib/clang/$V/lib/darwin/libclang_rt.fuzzer_no_main_osx.a',
- # OS X and iOS builtin libraries (iossim is lipo'd into ios) for the
- # _IsOSVersionAtLeast runtime function.
- 'lib/clang/*/lib/darwin/libclang_rt.ios.a',
- 'lib/clang/*/lib/darwin/libclang_rt.osx.a',
+ # OS X and iOS builtin libraries (iossim is lipo'd into ios) for the
+ # _IsOSVersionAtLeast runtime function.
+ 'lib/clang/$V/lib/darwin/libclang_rt.ios.a',
+ 'lib/clang/$V/lib/darwin/libclang_rt.osx.a',
- # Profile runtime (used by profiler and code coverage).
- 'lib/clang/*/lib/darwin/libclang_rt.profile_iossim.a',
- 'lib/clang/*/lib/darwin/libclang_rt.profile_osx.a',
+ # Profile runtime (used by profiler and code coverage).
+ 'lib/clang/$V/lib/darwin/libclang_rt.profile_iossim.a',
+ 'lib/clang/$V/lib/darwin/libclang_rt.profile_osx.a',
])
elif sys.platform.startswith('linux'):
- # Add llvm-ar and lld for LTO.
- want.append('bin/llvm-ar')
- want.append('bin/lld')
want.extend([
- # AddressSanitizer C runtime (pure C won't link with *_cxx).
- 'lib/clang/*/lib/linux/libclang_rt.asan-i386.a',
- 'lib/clang/*/lib/linux/libclang_rt.asan-x86_64.a',
- 'lib/clang/*/lib/linux/libclang_rt.asan-x86_64.a.syms',
-
- # AddressSanitizer C++ runtime.
- 'lib/clang/*/lib/linux/libclang_rt.asan_cxx-i386.a',
- 'lib/clang/*/lib/linux/libclang_rt.asan_cxx-x86_64.a',
- 'lib/clang/*/lib/linux/libclang_rt.asan_cxx-x86_64.a.syms',
-
- # AddressSanitizer Android runtime.
- 'lib/clang/*/lib/linux/libclang_rt.asan-aarch64-android.so',
- 'lib/clang/*/lib/linux/libclang_rt.asan-arm-android.so',
- 'lib/clang/*/lib/linux/libclang_rt.asan-i686-android.so',
-
- # Fuzzing instrumentation (-fsanitize=fuzzer-no-link).
- 'lib/clang/*/lib/linux/libclang_rt.fuzzer_no_main-x86_64.a',
-
- # HWASAN Android runtime.
- 'lib/clang/*/lib/linux/libclang_rt.hwasan-aarch64-android.so',
-
- # MemorySanitizer C runtime (pure C won't link with *_cxx).
- 'lib/clang/*/lib/linux/libclang_rt.msan-x86_64.a',
- 'lib/clang/*/lib/linux/libclang_rt.msan-x86_64.a.syms',
-
- # MemorySanitizer C++ runtime.
- 'lib/clang/*/lib/linux/libclang_rt.msan_cxx-x86_64.a',
- 'lib/clang/*/lib/linux/libclang_rt.msan_cxx-x86_64.a.syms',
-
- # Profile runtime (used by profiler and code coverage).
- 'lib/clang/*/lib/linux/libclang_rt.profile-i386.a',
- 'lib/clang/*/lib/linux/libclang_rt.profile-x86_64.a',
- 'lib/clang/*/lib/linux/libclang_rt.profile-aarch64-android.a',
- 'lib/clang/*/lib/linux/libclang_rt.profile-arm-android.a',
-
- # ThreadSanitizer C runtime (pure C won't link with *_cxx).
- 'lib/clang/*/lib/linux/libclang_rt.tsan-x86_64.a',
- 'lib/clang/*/lib/linux/libclang_rt.tsan-x86_64.a.syms',
-
- # ThreadSanitizer C++ runtime.
- 'lib/clang/*/lib/linux/libclang_rt.tsan_cxx-x86_64.a',
- 'lib/clang/*/lib/linux/libclang_rt.tsan_cxx-x86_64.a.syms',
-
- # UndefinedBehaviorSanitizer C runtime (pure C won't link with *_cxx).
- 'lib/clang/*/lib/linux/libclang_rt.ubsan_standalone-i386.a',
- 'lib/clang/*/lib/linux/libclang_rt.ubsan_standalone-x86_64.a',
- 'lib/clang/*/lib/linux/libclang_rt.ubsan_standalone-x86_64.a.syms',
-
- # UndefinedBehaviorSanitizer C++ runtime.
- 'lib/clang/*/lib/linux/libclang_rt.ubsan_standalone_cxx-i386.a',
- 'lib/clang/*/lib/linux/libclang_rt.ubsan_standalone_cxx-x86_64.a',
- 'lib/clang/*/lib/linux/libclang_rt.ubsan_standalone_cxx-x86_64.a.syms',
-
- # UndefinedBehaviorSanitizer Android runtime, needed for CFI.
- 'lib/clang/*/lib/linux/libclang_rt.ubsan_standalone-aarch64-android.so',
- 'lib/clang/*/lib/linux/libclang_rt.ubsan_standalone-arm-android.so',
-
- # Blacklist for MemorySanitizer (used on Linux only).
- 'lib/clang/*/share/msan_blacklist.txt',
+ 'bin/lld',
+
+ # Add llvm-ar for LTO.
+ 'bin/llvm-ar',
+
+ # AddressSanitizer C runtime (pure C won't link with *_cxx).
+ 'lib/clang/$V/lib/linux/libclang_rt.asan-x86_64.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.asan-x86_64.a.syms',
+
+ # AddressSanitizer C++ runtime.
+ 'lib/clang/$V/lib/linux/libclang_rt.asan_cxx-x86_64.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.asan_cxx-x86_64.a.syms',
+
+ # AddressSanitizer Android runtime.
+ 'lib/clang/$V/lib/linux/libclang_rt.asan-aarch64-android.so',
+ 'lib/clang/$V/lib/linux/libclang_rt.asan-arm-android.so',
+ 'lib/clang/$V/lib/linux/libclang_rt.asan-i686-android.so',
+
+ # Fuzzing instrumentation (-fsanitize=fuzzer-no-link).
+ 'lib/clang/$V/lib/linux/libclang_rt.fuzzer_no_main-x86_64.a',
+
+ # HWASAN Android runtime.
+ 'lib/clang/$V/lib/linux/libclang_rt.hwasan-aarch64-android.so',
+
+ # MemorySanitizer C runtime (pure C won't link with *_cxx).
+ 'lib/clang/$V/lib/linux/libclang_rt.msan-x86_64.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.msan-x86_64.a.syms',
+
+ # MemorySanitizer C++ runtime.
+ 'lib/clang/$V/lib/linux/libclang_rt.msan_cxx-x86_64.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.msan_cxx-x86_64.a.syms',
+
+ # Profile runtime (used by profiler and code coverage).
+ 'lib/clang/$V/lib/linux/libclang_rt.profile-x86_64.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.profile-aarch64-android.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.profile-arm-android.a',
+
+ # ThreadSanitizer C runtime (pure C won't link with *_cxx).
+ 'lib/clang/$V/lib/linux/libclang_rt.tsan-x86_64.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.tsan-x86_64.a.syms',
+
+ # ThreadSanitizer C++ runtime.
+ 'lib/clang/$V/lib/linux/libclang_rt.tsan_cxx-x86_64.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.tsan_cxx-x86_64.a.syms',
+
+ # UndefinedBehaviorSanitizer C runtime (pure C won't link with *_cxx).
+ 'lib/clang/$V/lib/linux/libclang_rt.ubsan_standalone-x86_64.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.ubsan_standalone-x86_64.a.syms',
+
+ # UndefinedBehaviorSanitizer C++ runtime.
+ 'lib/clang/$V/lib/linux/libclang_rt.ubsan_standalone_cxx-x86_64.a',
+ 'lib/clang/$V/lib/linux/libclang_rt.ubsan_standalone_cxx-x86_64.a.syms',
+
+ # UndefinedBehaviorSanitizer Android runtime, needed for CFI.
+ 'lib/clang/$V/lib/linux/libclang_rt.ubsan_standalone-aarch64-android.so',
+ 'lib/clang/$V/lib/linux/libclang_rt.ubsan_standalone-arm-android.so',
+
+ # Blacklist for MemorySanitizer (used on Linux only).
+ 'lib/clang/$V/share/msan_blacklist.txt',
])
elif sys.platform == 'win32':
want.extend([
- # AddressSanitizer C runtime (pure C won't link with *_cxx).
- 'lib/clang/*/lib/windows/clang_rt.asan-i386.lib',
- 'lib/clang/*/lib/windows/clang_rt.asan-x86_64.lib',
-
- # AddressSanitizer C++ runtime.
- 'lib/clang/*/lib/windows/clang_rt.asan_cxx-i386.lib',
- 'lib/clang/*/lib/windows/clang_rt.asan_cxx-x86_64.lib',
-
- # Fuzzing instrumentation (-fsanitize=fuzzer-no-link).
- 'lib/clang/*/lib/windows/clang_rt.fuzzer_no_main-x86_64.lib',
-
- # Thunk for AddressSanitizer needed for static build of a shared lib.
- 'lib/clang/*/lib/windows/clang_rt.asan_dll_thunk-i386.lib',
- 'lib/clang/*/lib/windows/clang_rt.asan_dll_thunk-x86_64.lib',
-
- # AddressSanitizer runtime for component build.
- 'lib/clang/*/lib/windows/clang_rt.asan_dynamic-i386.dll',
- 'lib/clang/*/lib/windows/clang_rt.asan_dynamic-i386.lib',
- 'lib/clang/*/lib/windows/clang_rt.asan_dynamic-x86_64.dll',
- 'lib/clang/*/lib/windows/clang_rt.asan_dynamic-x86_64.lib',
-
- # Thunk for AddressSanitizer for component build of a shared lib.
- 'lib/clang/*/lib/windows/clang_rt.asan_dynamic_runtime_thunk-i386.lib',
- 'lib/clang/*/lib/windows/clang_rt.asan_dynamic_runtime_thunk-x86_64.lib',
-
- # Profile runtime (used by profiler and code coverage).
- 'lib/clang/*/lib/windows/clang_rt.profile-i386.lib',
- 'lib/clang/*/lib/windows/clang_rt.profile-x86_64.lib',
-
- # UndefinedBehaviorSanitizer C runtime (pure C won't link with *_cxx).
- 'lib/clang/*/lib/windows/clang_rt.ubsan_standalone-i386.lib',
- 'lib/clang/*/lib/windows/clang_rt.ubsan_standalone-x86_64.lib',
-
- # UndefinedBehaviorSanitizer C++ runtime.
- 'lib/clang/*/lib/windows/clang_rt.ubsan_standalone_cxx-i386.lib',
- 'lib/clang/*/lib/windows/clang_rt.ubsan_standalone_cxx-x86_64.lib',
+ # AddressSanitizer C runtime (pure C won't link with *_cxx).
+ 'lib/clang/$V/lib/windows/clang_rt.asan-x86_64.lib',
+
+ # AddressSanitizer C++ runtime.
+ 'lib/clang/$V/lib/windows/clang_rt.asan_cxx-x86_64.lib',
+
+ # Fuzzing instrumentation (-fsanitize=fuzzer-no-link).
+ 'lib/clang/$V/lib/windows/clang_rt.fuzzer_no_main-x86_64.lib',
+
+ # Thunk for AddressSanitizer needed for static build of a shared lib.
+ 'lib/clang/$V/lib/windows/clang_rt.asan_dll_thunk-x86_64.lib',
+
+ # AddressSanitizer runtime for component build.
+ 'lib/clang/$V/lib/windows/clang_rt.asan_dynamic-x86_64.dll',
+ 'lib/clang/$V/lib/windows/clang_rt.asan_dynamic-x86_64.lib',
+
+ # Thunk for AddressSanitizer for component build of a shared lib.
+ 'lib/clang/$V/lib/windows/clang_rt.asan_dynamic_runtime_thunk-x86_64.lib',
+
+ # Profile runtime (used by profiler and code coverage).
+ 'lib/clang/$V/lib/windows/clang_rt.profile-i386.lib',
+ 'lib/clang/$V/lib/windows/clang_rt.profile-x86_64.lib',
+
+ # UndefinedBehaviorSanitizer C runtime (pure C won't link with *_cxx).
+ 'lib/clang/$V/lib/windows/clang_rt.ubsan_standalone-x86_64.lib',
+
+ # UndefinedBehaviorSanitizer C++ runtime.
+ 'lib/clang/$V/lib/windows/clang_rt.ubsan_standalone_cxx-x86_64.lib',
])
- if sys.platform in ('linux2', 'darwin'):
- # Include libclang_rt.builtins.a for Fuchsia targets.
- want.extend(['lib/clang/*/aarch64-fuchsia/lib/libclang_rt.builtins.a',
- 'lib/clang/*/x86_64-fuchsia/lib/libclang_rt.builtins.a',
- ])
+ # Check all non-glob wanted files exist on disk.
+ want = [w.replace('$V', RELEASE_VERSION) for w in want]
+ for w in want:
+ if '*' in w: continue
+ if os.path.exists(os.path.join(LLVM_RELEASE_DIR, w)): continue
+ print >>sys.stderr, 'wanted file "%s" but it did not exist' % w
+ return 1
+ # TODO(thakis): Try walking over want and copying the files in there instead
+ # of walking the directory and doing fnmatch() against want.
for root, dirs, files in os.walk(LLVM_RELEASE_DIR):
# root: third_party/llvm-build/Release+Asserts/lib/..., rel_root: lib/...
rel_root = root[len(LLVM_RELEASE_DIR)+1:]
@@ -419,18 +402,20 @@ def main():
shutil.copytree(os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'include', 'c++'),
os.path.join(pdir, 'include', 'c++'))
- # Copy buildlog over.
- shutil.copy('buildlog.txt', pdir)
-
- # Create archive.
- tar_entries = ['bin', 'lib', 'buildlog.txt']
+ # Create main archive.
+ tar_entries = ['bin', 'lib' ]
if sys.platform == 'darwin':
tar_entries += ['include']
with tarfile.open(pdir + '.tgz', 'w:gz') as tar:
for entry in tar_entries:
tar.add(os.path.join(pdir, entry), arcname=entry, filter=PrintTarProgress)
+ MaybeUpload(args.upload, pdir + '.tgz', platform)
- MaybeUpload(args, pdir, platform)
+ # Upload build log next to it.
+ os.rename('buildlog.txt', pdir + '-buildlog.txt')
+ MaybeUpload(args.upload, pdir + '-buildlog.txt', platform,
+ extra_gsutil_args=['-z', 'txt'])
+ os.remove(pdir + '-buildlog.txt')
# Zip up llvm-code-coverage for code coverage.
code_coverage_dir = 'llvm-code-coverage-' + stamp
@@ -442,7 +427,7 @@ def main():
with tarfile.open(code_coverage_dir + '.tgz', 'w:gz') as tar:
tar.add(os.path.join(code_coverage_dir, 'bin'), arcname='bin',
filter=PrintTarProgress)
- MaybeUpload(args, code_coverage_dir, platform)
+ MaybeUpload(args.upload, code_coverage_dir + '.tgz', platform)
# Zip up llvm-objdump and related tools for sanitizer coverage and Supersize.
objdumpdir = 'llvmobjdump-' + stamp
@@ -464,7 +449,7 @@ def main():
filter=PrintTarProgress)
tar.add(llvmobjdump_stamp_file, arcname=llvmobjdump_stamp_file_base,
filter=PrintTarProgress)
- MaybeUpload(args, objdumpdir, platform)
+ MaybeUpload(args.upload, objdumpdir + '.tgz', platform)
# On Mac, lld isn't part of the main zip. Upload it in a separate zip.
if sys.platform == 'darwin':
@@ -480,7 +465,7 @@ def main():
with tarfile.open(llddir + '.tgz', 'w:gz') as tar:
tar.add(os.path.join(llddir, 'bin'), arcname='bin',
filter=PrintTarProgress)
- MaybeUpload(args, llddir, platform)
+ MaybeUpload(args.upload, llddir + '.tgz', platform)
# dsymutil isn't part of the main zip either, and it gets periodically
# deployed to CIPD (manually, not as part of clang rolls) for use in the
@@ -493,7 +478,7 @@ def main():
with tarfile.open(dsymdir + '.tgz', 'w:gz') as tar:
tar.add(os.path.join(dsymdir, 'bin'), arcname='bin',
filter=PrintTarProgress)
- MaybeUpload(args, dsymdir, platform)
+ MaybeUpload(args.upload, dsymdir + '.tgz', platform)
# Zip up the translation_unit tool.
translation_unit_dir = 'translation_unit-' + stamp
@@ -505,7 +490,7 @@ def main():
with tarfile.open(translation_unit_dir + '.tgz', 'w:gz') as tar:
tar.add(os.path.join(translation_unit_dir, 'bin'), arcname='bin',
filter=PrintTarProgress)
- MaybeUpload(args, translation_unit_dir, platform)
+ MaybeUpload(args.upload, translation_unit_dir + '.tgz', platform)
if sys.platform == 'win32' and args.upload:
UploadPDBToSymbolServer()
diff --git a/chromium/tools/clang/scripts/update.py b/chromium/tools/clang/scripts/update.py
index c284aff1e3b..082dc5ec7ac 100755
--- a/chromium/tools/clang/scripts/update.py
+++ b/chromium/tools/clang/scripts/update.py
@@ -3,20 +3,21 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-"""This script is used to download prebuilt clang binaries.
+"""This script is used to download prebuilt clang binaries. It runs as a
+"gclient hook" in Chromium checkouts.
-It is also used by package.py to build the prebuilt clang binaries."""
+It can also be run stand-alone as a convenient way of installing a well-tested
+near-tip-of-tree clang version:
-from __future__ import print_function
+ $ curl -s https://raw.githubusercontent.com/chromium/chromium/master/tools/clang/scripts/update.py | python - --clang-dir=.
+"""
+
+# TODO: Running stand-alone won't work on Windows due to the dia dll copying.
+from __future__ import print_function
import argparse
-import distutils.spawn
-import glob
import os
-import pipes
-import re
import shutil
-import subprocess
import stat
import sys
import tarfile
@@ -35,63 +36,56 @@ import zipfile
# Do NOT CHANGE this if you don't know what you're doing -- see
# https://chromium.googlesource.com/chromium/src/+/master/docs/updating_clang.md
# Reverting problematic clang rolls is safe, though.
-CLANG_REVISION = '357692'
+CLANG_REVISION = '67510fac36d27b2e22c7cd955fc167136b737b93'
+CLANG_SVN_REVISION = '361212'
+CLANG_SUB_REVISION = 4
-use_head_revision = bool(os.environ.get('LLVM_FORCE_HEAD_REVISION', '0')
- in ('1', 'YES'))
-if use_head_revision:
- CLANG_REVISION = 'HEAD'
+PACKAGE_VERSION = '%s-%s-%s' % (CLANG_SVN_REVISION, CLANG_REVISION[:8],
+ CLANG_SUB_REVISION)
+RELEASE_VERSION = '9.0.0'
-# This is incremented when pushing a new build of Clang at the same revision.
-CLANG_SUB_REVISION=1
-PACKAGE_VERSION = "%s-%s" % (CLANG_REVISION, CLANG_SUB_REVISION)
+CDS_URL = os.environ.get('CDS_CLANG_BUCKET_OVERRIDE',
+ 'https://commondatastorage.googleapis.com/chromium-browser-clang')
# Path constants. (All of these should be absolute paths.)
THIS_DIR = os.path.abspath(os.path.dirname(__file__))
CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..'))
-GCLIENT_CONFIG = os.path.join(os.path.dirname(CHROMIUM_DIR), '.gclient')
-THIRD_PARTY_DIR = os.path.join(CHROMIUM_DIR, 'third_party')
-LLVM_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm')
-LLVM_BOOTSTRAP_DIR = os.path.join(THIRD_PARTY_DIR, 'llvm-bootstrap')
-LLVM_BOOTSTRAP_INSTALL_DIR = os.path.join(THIRD_PARTY_DIR,
- 'llvm-bootstrap-install')
-CHROME_TOOLS_SHIM_DIR = os.path.join(LLVM_DIR, 'tools', 'chrometools')
LLVM_BUILD_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'llvm-build',
'Release+Asserts')
-THREADS_ENABLED_BUILD_DIR = os.path.join(LLVM_BUILD_DIR, 'threads_enabled')
-COMPILER_RT_BUILD_DIR = os.path.join(LLVM_BUILD_DIR, 'compiler-rt')
-CLANG_DIR = os.path.join(LLVM_DIR, 'tools', 'clang')
-LLD_DIR = os.path.join(LLVM_DIR, 'tools', 'lld')
-# compiler-rt is built as part of the regular LLVM build on Windows to get
-# the 64-bit runtime, and out-of-tree elsewhere.
-# TODO(thakis): Try to unify this.
-if sys.platform == 'win32':
- COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'projects', 'compiler-rt')
-else:
- COMPILER_RT_DIR = os.path.join(LLVM_DIR, 'compiler-rt')
-LIBCXX_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxx')
-LIBCXXABI_DIR = os.path.join(LLVM_DIR, 'projects', 'libcxxabi')
-LLVM_BUILD_TOOLS_DIR = os.path.abspath(
- os.path.join(LLVM_DIR, '..', 'llvm-build-tools'))
+
STAMP_FILE = os.path.normpath(
- os.path.join(LLVM_DIR, '..', 'llvm-build', 'cr_build_revision'))
-VERSION = '9.0.0'
-ANDROID_NDK_DIR = os.path.join(
- CHROMIUM_DIR, 'third_party', 'android_ndk')
-FUCHSIA_SDK_DIR = os.path.join(CHROMIUM_DIR, 'third_party', 'fuchsia-sdk',
- 'sdk')
+ os.path.join(LLVM_BUILD_DIR, '..', 'cr_build_revision'))
+FORCE_HEAD_REVISION_FILE = os.path.normpath(os.path.join(LLVM_BUILD_DIR, '..',
+ 'force_head_revision'))
-# URL for pre-built binaries.
-CDS_URL = os.environ.get('CDS_CLANG_BUCKET_OVERRIDE',
- 'https://commondatastorage.googleapis.com/chromium-browser-clang')
-LLVM_REPO_URL='https://llvm.org/svn/llvm-project'
-if 'LLVM_REPO_URL' in os.environ:
- LLVM_REPO_URL = os.environ['LLVM_REPO_URL']
+def RmTree(dir):
+ """Delete dir."""
+ def ChmodAndRetry(func, path, _):
+ # Subversion can leave read-only files around.
+ if not os.access(path, os.W_OK):
+ os.chmod(path, stat.S_IWUSR)
+ return func(path)
+ raise
+ shutil.rmtree(dir, onerror=ChmodAndRetry)
+
-BUG_REPORT_URL = ('https://crbug.com and run tools/clang/scripts/upload_crash.py'
- ' (only works inside Google) which will upload a report')
+def ReadStampFile(path):
+ """Return the contents of the stamp file, or '' if it doesn't exist."""
+ try:
+ with open(path, 'r') as f:
+ return f.read().rstrip()
+ except IOError:
+ return ''
+
+
+def WriteStampFile(s, path):
+ """Write s to the stamp file."""
+ EnsureDirExists(os.path.dirname(path))
+ with open(path, 'w') as f:
+ f.write(s)
+ f.write('\n')
def DownloadUrl(url, output_file):
@@ -131,6 +125,7 @@ def DownloadUrl(url, output_file):
raise e
num_retries -= 1
print('Retrying in %d s ...' % retry_wait_s)
+ sys.stdout.flush()
time.sleep(retry_wait_s)
retry_wait_s *= 2
@@ -159,235 +154,28 @@ def DownloadAndUnpack(url, output_dir, path_prefix=None):
t.extractall(path=output_dir, members=members)
-def ReadStampFile(path=STAMP_FILE):
- """Return the contents of the stamp file, or '' if it doesn't exist."""
- try:
- with open(path, 'r') as f:
- return f.read().rstrip()
- except IOError:
- return ''
-
-
-def WriteStampFile(s, path=STAMP_FILE):
- """Write s to the stamp file."""
- EnsureDirExists(os.path.dirname(path))
- with open(path, 'w') as f:
- f.write(s)
- f.write('\n')
-
-
-def GetSvnRevision(svn_repo):
- """Returns current revision of the svn repo at svn_repo."""
- svn_info = subprocess.check_output('svn info ' + svn_repo, shell=True)
- m = re.search(r'Revision: (\d+)', svn_info)
- return m.group(1)
-
-
-def RmTree(dir):
- """Delete dir."""
- def ChmodAndRetry(func, path, _):
- # Subversion can leave read-only files around.
- if not os.access(path, os.W_OK):
- os.chmod(path, stat.S_IWUSR)
- return func(path)
- raise
-
- shutil.rmtree(dir, onerror=ChmodAndRetry)
-
-
-def RmCmakeCache(dir):
- """Delete CMake cache related files from dir."""
- for dirpath, dirs, files in os.walk(dir):
- if 'CMakeCache.txt' in files:
- os.remove(os.path.join(dirpath, 'CMakeCache.txt'))
- if 'CMakeFiles' in dirs:
- RmTree(os.path.join(dirpath, 'CMakeFiles'))
-
-
-def RunCommand(command, msvc_arch=None, env=None, fail_hard=True):
- """Run command and return success (True) or failure; or if fail_hard is
- True, exit on failure. If msvc_arch is set, runs the command in a
- shell with the msvc tools for that architecture."""
+def GetPlatformUrlPrefix(platform):
+ if platform == 'win32' or platform == 'cygwin':
+ return CDS_URL + '/Win/'
+ if platform == 'darwin':
+ return CDS_URL + '/Mac/'
+ assert platform.startswith('linux')
+ return CDS_URL + '/Linux_x64/'
- if msvc_arch and sys.platform == 'win32':
- command = [os.path.join(GetWinSDKDir(), 'bin', 'SetEnv.cmd'),
- "/" + msvc_arch, '&&'] + command
- # https://docs.python.org/2/library/subprocess.html:
- # "On Unix with shell=True [...] if args is a sequence, the first item
- # specifies the command string, and any additional items will be treated as
- # additional arguments to the shell itself. That is to say, Popen does the
- # equivalent of:
- # Popen(['/bin/sh', '-c', args[0], args[1], ...])"
- #
- # We want to pass additional arguments to command[0], not to the shell,
- # so manually join everything into a single string.
- # Annoyingly, for "svn co url c:\path", pipes.quote() thinks that it should
- # quote c:\path but svn can't handle quoted paths on Windows. Since on
- # Windows follow-on args are passed to args[0] instead of the shell, don't
- # do the single-string transformation there.
- if sys.platform != 'win32':
- command = ' '.join([pipes.quote(c) for c in command])
- print('Running', command)
- if subprocess.call(command, env=env, shell=True) == 0:
- return True
- print('Failed.')
- if fail_hard:
+def DownloadAndUnpackClangPackage(platform, output_dir, runtimes_only=False):
+ cds_file = "clang-%s.tgz" % PACKAGE_VERSION
+ cds_full_url = GetPlatformUrlPrefix(platform) + cds_file
+ try:
+ path_prefix = None
+ if runtimes_only:
+ path_prefix = 'lib/clang/' + RELEASE_VERSION + '/lib/'
+ DownloadAndUnpack(cds_full_url, output_dir, path_prefix)
+ except urllib.URLError:
+ print('Failed to download prebuilt clang %s' % cds_file)
+ print('Use --force-local-build if you want to build locally.')
+ print('Exiting.')
sys.exit(1)
- return False
-
-
-def CopyFile(src, dst):
- """Copy a file from src to dst."""
- print("Copying %s to %s" % (src, dst))
- shutil.copy(src, dst)
-
-
-def CopyDirectoryContents(src, dst):
- """Copy the files from directory src to dst."""
- dst = os.path.realpath(dst) # realpath() in case dst ends in /..
- EnsureDirExists(dst)
- for f in os.listdir(src):
- CopyFile(os.path.join(src, f), dst)
-
-
-def Checkout(name, url, dir):
- """Checkout the SVN module at url into dir. Use name for the log message."""
- print("Checking out %s r%s into '%s'" % (name, CLANG_REVISION, dir))
-
- command = ['svn', 'checkout', '--force', url + '@' + CLANG_REVISION, dir]
- if RunCommand(command, fail_hard=False):
- return
-
- if os.path.isdir(dir):
- print("Removing %s." % dir)
- RmTree(dir)
-
- print("Retrying.")
- RunCommand(command)
-
-
-def CheckoutRepos(args):
- if args.skip_checkout:
- return
-
- Checkout('LLVM', LLVM_REPO_URL + '/llvm/trunk', LLVM_DIR)
- Checkout('Clang', LLVM_REPO_URL + '/cfe/trunk', CLANG_DIR)
- if True:
- Checkout('LLD', LLVM_REPO_URL + '/lld/trunk', LLD_DIR)
- elif os.path.exists(LLD_DIR):
- # In case someone sends a tryjob that temporary adds lld to the checkout,
- # make sure it's not around on future builds.
- RmTree(LLD_DIR)
- Checkout('compiler-rt', LLVM_REPO_URL + '/compiler-rt/trunk', COMPILER_RT_DIR)
- if sys.platform == 'darwin':
- # clang needs a libc++ checkout, else -stdlib=libc++ won't find includes
- # (i.e. this is needed for bootstrap builds).
- Checkout('libcxx', LLVM_REPO_URL + '/libcxx/trunk', LIBCXX_DIR)
- # We used to check out libcxxabi on OS X; we no longer need that.
- if os.path.exists(LIBCXXABI_DIR):
- RmTree(LIBCXXABI_DIR)
-
-
-def DeleteChromeToolsShim():
- OLD_SHIM_DIR = os.path.join(LLVM_DIR, 'tools', 'zzz-chrometools')
- shutil.rmtree(OLD_SHIM_DIR, ignore_errors=True)
- shutil.rmtree(CHROME_TOOLS_SHIM_DIR, ignore_errors=True)
-
-
-def CreateChromeToolsShim():
- """Hooks the Chrome tools into the LLVM build.
-
- Several Chrome tools have dependencies on LLVM/Clang libraries. The LLVM build
- detects implicit tools in the tools subdirectory, so this helper install a
- shim CMakeLists.txt that forwards to the real directory for the Chrome tools.
-
- Note that the shim directory name intentionally has no - or _. The implicit
- tool detection logic munges them in a weird way."""
- assert not any(i in os.path.basename(CHROME_TOOLS_SHIM_DIR) for i in '-_')
- os.mkdir(CHROME_TOOLS_SHIM_DIR)
- with file(os.path.join(CHROME_TOOLS_SHIM_DIR, 'CMakeLists.txt'), 'w') as f:
- f.write('# Automatically generated by tools/clang/scripts/update.py. ' +
- 'Do not edit.\n')
- f.write('# Since tools/clang is located in another directory, use the \n')
- f.write('# two arg version to specify where build artifacts go. CMake\n')
- f.write('# disallows reuse of the same binary dir for multiple source\n')
- f.write('# dirs, so the build artifacts need to go into a subdirectory.\n')
- f.write('if (CHROMIUM_TOOLS_SRC)\n')
- f.write(' add_subdirectory(${CHROMIUM_TOOLS_SRC} ' +
- '${CMAKE_CURRENT_BINARY_DIR}/a)\n')
- f.write('endif (CHROMIUM_TOOLS_SRC)\n')
-
-
-def AddSvnToPathOnWin():
- """Download svn.exe and add it to PATH."""
- if sys.platform != 'win32':
- return
- svn_ver = 'svn-1.6.6-win'
- svn_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, svn_ver)
- if not os.path.exists(svn_dir):
- DownloadAndUnpack(CDS_URL + '/tools/%s.zip' % svn_ver, LLVM_BUILD_TOOLS_DIR)
- os.environ['PATH'] = svn_dir + os.pathsep + os.environ.get('PATH', '')
-
-
-def AddCMakeToPath(args):
- """Download CMake and add it to PATH."""
- if args.use_system_cmake:
- return
-
- if sys.platform == 'win32':
- zip_name = 'cmake-3.12.1-win32-x86.zip'
- dir_name = ['cmake-3.12.1-win32-x86', 'bin']
- elif sys.platform == 'darwin':
- zip_name = 'cmake-3.12.1-Darwin-x86_64.tar.gz'
- dir_name = ['cmake-3.12.1-Darwin-x86_64', 'CMake.app', 'Contents', 'bin']
- else:
- zip_name = 'cmake-3.12.1-Linux-x86_64.tar.gz'
- dir_name = ['cmake-3.12.1-Linux-x86_64', 'bin']
-
- cmake_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, *dir_name)
- if not os.path.exists(cmake_dir):
- DownloadAndUnpack(CDS_URL + '/tools/' + zip_name, LLVM_BUILD_TOOLS_DIR)
- os.environ['PATH'] = cmake_dir + os.pathsep + os.environ.get('PATH', '')
-
-
-def AddGnuWinToPath():
- """Download some GNU win tools and add them to PATH."""
- if sys.platform != 'win32':
- return
-
- gnuwin_dir = os.path.join(LLVM_BUILD_TOOLS_DIR, 'gnuwin')
- GNUWIN_VERSION = '9'
- GNUWIN_STAMP = os.path.join(gnuwin_dir, 'stamp')
- if ReadStampFile(GNUWIN_STAMP) == GNUWIN_VERSION:
- print('GNU Win tools already up to date.')
- else:
- zip_name = 'gnuwin-%s.zip' % GNUWIN_VERSION
- DownloadAndUnpack(CDS_URL + '/tools/' + zip_name, LLVM_BUILD_TOOLS_DIR)
- WriteStampFile(GNUWIN_VERSION, GNUWIN_STAMP)
-
- os.environ['PATH'] = gnuwin_dir + os.pathsep + os.environ.get('PATH', '')
-
- # find.exe, mv.exe and rm.exe are from MSYS (see crrev.com/389632). MSYS uses
- # Cygwin under the hood, and initializing Cygwin has a race-condition when
- # getting group and user data from the Active Directory is slow. To work
- # around this, use a horrible hack telling it not to do that.
- # See https://crbug.com/905289
- etc = os.path.join(gnuwin_dir, '..', '..', 'etc')
- EnsureDirExists(etc)
- with open(os.path.join(etc, 'nsswitch.conf'), 'w') as f:
- f.write('passwd: files\n')
- f.write('group: files\n')
-
-
-def SetMacXcodePath():
- """Set DEVELOPER_DIR to the path to hermetic Xcode.app on Mac OS X."""
- if sys.platform != 'darwin':
- return
-
- xcode_path = os.path.join(CHROMIUM_DIR, 'build', 'mac_files', 'Xcode.app')
- if os.path.exists(xcode_path):
- os.environ['DEVELOPER_DIR'] = xcode_path
win_sdk_dir = None
@@ -430,55 +218,21 @@ def GetWinSDKDir():
return win_sdk_dir
+def CopyFile(src, dst):
+ """Copy a file from src to dst."""
+ print("Copying %s to %s" % (src, dst))
+ shutil.copy(src, dst)
+
+
def CopyDiaDllTo(target_dir):
# This script always wants to use the 64-bit msdia*.dll.
GetWinSDKDir()
CopyFile(dia_dll, target_dir)
-def VeryifyVersionOfBuiltClangMatchesVERSION():
- """Checks that `clang --version` outputs VERSION. If this fails, VERSION
- in this file is out-of-date and needs to be updated (possibly in an
- `if use_head_revision:` block in main() first)."""
- clang = os.path.join(LLVM_BUILD_DIR, 'bin', 'clang')
- if sys.platform == 'win32':
- # TODO: Parse `clang-cl /?` output for built clang's version and check that
- # to check the binary we're actually shipping? But clang-cl.exe is just
- # a copy of clang.exe, so this does check the same thing.
- clang += '.exe'
- version_out = subprocess.check_output([clang, '--version'])
- version_out = re.match(r'clang version ([0-9.]+)', version_out).group(1)
- if version_out != VERSION:
- print('unexpected clang version %s (not %s), update VERSION in update.py'
- % (version_out, VERSION))
- sys.exit(1)
-
-
-def GetPlatformUrlPrefix(platform):
- if platform == 'win32' or platform == 'cygwin':
- return CDS_URL + '/Win/'
- if platform == 'darwin':
- return CDS_URL + '/Mac/'
- assert platform.startswith('linux')
- return CDS_URL + '/Linux_x64/'
-
-
-def DownloadAndUnpackClangPackage(platform, runtimes_only=False):
- cds_file = "clang-%s.tgz" % PACKAGE_VERSION
- cds_full_url = GetPlatformUrlPrefix(platform) + cds_file
- try:
- path_prefix = None
- if runtimes_only:
- path_prefix = 'lib/clang/' + VERSION + '/lib/'
- DownloadAndUnpack(cds_full_url, LLVM_BUILD_DIR, path_prefix)
- except urllib.URLError:
- print('Failed to download prebuilt clang %s' % cds_file)
- print('Use --force-local-build if you want to build locally.')
- print('Exiting.')
- sys.exit(1)
-
+def UpdateClang():
+ GCLIENT_CONFIG = os.path.join(os.path.dirname(CHROMIUM_DIR), '.gclient')
-def UpdateClang(args):
# Read target_os from .gclient so we know which non-native runtimes we need.
# TODO(pcc): See if we can download just the runtimes instead of the entire
# clang package, and do that from DEPS instead of here.
@@ -491,563 +245,79 @@ def UpdateClang(args):
pass
expected_stamp = ','.join([PACKAGE_VERSION] + target_os)
- if ReadStampFile() == expected_stamp and not args.force_local_build:
+ if ReadStampFile(STAMP_FILE) == expected_stamp:
return 0
- # Reset the stamp file in case the build is unsuccessful.
- WriteStampFile('')
-
- if not args.force_local_build:
- if os.path.exists(LLVM_BUILD_DIR):
- RmTree(LLVM_BUILD_DIR)
-
- DownloadAndUnpackClangPackage(sys.platform)
- if 'win' in target_os:
- DownloadAndUnpackClangPackage('win32', runtimes_only=True)
- if sys.platform == 'win32':
- CopyDiaDllTo(os.path.join(LLVM_BUILD_DIR, 'bin'))
- WriteStampFile(expected_stamp)
- return 0
-
- if args.with_android and not os.path.exists(ANDROID_NDK_DIR):
- print('Android NDK not found at ' + ANDROID_NDK_DIR)
- print('The Android NDK is needed to build a Clang whose -fsanitize=address')
- print('works on Android. See ')
- print('https://www.chromium.org/developers/how-tos/android-build-instructions')
- print('for how to install the NDK, or pass --without-android.')
- return 1
-
- if args.with_fuchsia and not os.path.exists(FUCHSIA_SDK_DIR):
- print('Fuchsia SDK not found at ' + FUCHSIA_SDK_DIR)
- print('The Fuchsia SDK is needed to build libclang_rt for Fuchsia.')
- print('Install the Fuchsia SDK by adding fuchsia to the ')
- print('target_os section in your .gclient and running hooks, ')
- print('or pass --without-fuchsia.')
- print('https://chromium.googlesource.com/chromium/src/+/master/docs/fuchsia_build_instructions.md')
- print('for general Fuchsia build instructions.')
- return 1
-
- print('Locally building Clang %s...' % PACKAGE_VERSION)
-
- AddCMakeToPath(args)
- AddGnuWinToPath()
-
- DeleteChromeToolsShim()
-
- CheckoutRepos(args)
-
- if args.skip_build:
- return
-
- cc, cxx = None, None
- libstdcpp = None
+ if os.path.exists(LLVM_BUILD_DIR):
+ RmTree(LLVM_BUILD_DIR)
- cflags = []
- cxxflags = []
- ldflags = []
-
- targets = 'AArch64;ARM;Mips;PowerPC;SystemZ;WebAssembly;X86'
- base_cmake_args = ['-GNinja',
- '-DCMAKE_BUILD_TYPE=Release',
- '-DLLVM_ENABLE_ASSERTIONS=%s' %
- ('OFF' if args.disable_asserts else 'ON'),
- '-DLLVM_ENABLE_PIC=OFF',
- '-DLLVM_ENABLE_TERMINFO=OFF',
- '-DLLVM_TARGETS_TO_BUILD=' + targets,
- # Statically link MSVCRT to avoid DLL dependencies.
- '-DLLVM_USE_CRT_RELEASE=MT',
- '-DCLANG_PLUGIN_SUPPORT=OFF',
- '-DCLANG_ENABLE_STATIC_ANALYZER=OFF',
- '-DCLANG_ENABLE_ARCMT=OFF',
- # TODO(crbug.com/929645): Use newer toolchain to host.
- '-DLLVM_TEMPORARILY_ALLOW_OLD_TOOLCHAIN=ON',
- '-DBUG_REPORT_URL=' + BUG_REPORT_URL,
- ]
-
- if sys.platform != 'win32':
- # libxml2 is required by the Win manifest merging tool used in cross-builds.
- base_cmake_args.append('-DLLVM_ENABLE_LIBXML2=FORCE_ON')
-
- if args.bootstrap:
- print('Building bootstrap compiler')
- EnsureDirExists(LLVM_BOOTSTRAP_DIR)
- os.chdir(LLVM_BOOTSTRAP_DIR)
- bootstrap_args = base_cmake_args + [
- '-DLLVM_TARGETS_TO_BUILD=X86;ARM;AArch64',
- '-DCMAKE_INSTALL_PREFIX=' + LLVM_BOOTSTRAP_INSTALL_DIR,
- '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
- '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
- # Ignore args.disable_asserts for the bootstrap compiler.
- '-DLLVM_ENABLE_ASSERTIONS=ON',
- ]
- if cc is not None: bootstrap_args.append('-DCMAKE_C_COMPILER=' + cc)
- if cxx is not None: bootstrap_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
- RmCmakeCache('.')
- RunCommand(['cmake'] + bootstrap_args + [LLVM_DIR], msvc_arch='x64')
- RunCommand(['ninja'], msvc_arch='x64')
- if args.run_tests:
- if sys.platform == 'win32':
- CopyDiaDllTo(os.path.join(LLVM_BOOTSTRAP_DIR, 'bin'))
- RunCommand(['ninja', 'check-all'], msvc_arch='x64')
- RunCommand(['ninja', 'install'], msvc_arch='x64')
-
- if sys.platform == 'win32':
- cc = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'clang-cl.exe')
- cxx = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'clang-cl.exe')
- # CMake has a hard time with backslashes in compiler paths:
- # https://stackoverflow.com/questions/13050827
- cc = cc.replace('\\', '/')
- cxx = cxx.replace('\\', '/')
- else:
- cc = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'clang')
- cxx = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'clang++')
-
- print('Building final compiler')
-
- # LLVM uses C++11 starting in llvm 3.5. On Linux, this means libstdc++4.7+ is
- # needed, on OS X it requires libc++. clang only automatically links to libc++
- # when targeting OS X 10.9+, so add stdlib=libc++ explicitly so clang can run
- # on OS X versions as old as 10.7.
- deployment_target = ''
-
- if sys.platform == 'darwin' and args.bootstrap:
- # When building on 10.9, /usr/include usually doesn't exist, and while
- # Xcode's clang automatically sets a sysroot, self-built clangs don't.
- cflags = ['-isysroot', subprocess.check_output(
- ['xcrun', '--show-sdk-path']).rstrip()]
- cxxflags = ['-stdlib=libc++'] + cflags
- ldflags += ['-stdlib=libc++']
- deployment_target = '10.7'
- # Running libc++ tests takes a long time. Since it was only needed for
- # the install step above, don't build it as part of the main build.
- # This makes running package.py over 10% faster (30 min instead of 34 min)
- RmTree(LIBCXX_DIR)
-
-
- # If building at head, define a macro that plugins can use for #ifdefing
- # out code that builds at head, but not at CLANG_REVISION or vice versa.
- if use_head_revision:
- cflags += ['-DLLVM_FORCE_HEAD_REVISION']
- cxxflags += ['-DLLVM_FORCE_HEAD_REVISION']
-
- # Build PDBs for archival on Windows. Don't use RelWithDebInfo since it
- # has different optimization defaults than Release.
- # Also disable stack cookies (/GS-) for performance.
+ DownloadAndUnpackClangPackage(sys.platform, LLVM_BUILD_DIR)
+ if 'win' in target_os:
+ DownloadAndUnpackClangPackage('win32', LLVM_BUILD_DIR, runtimes_only=True)
if sys.platform == 'win32':
- cflags += ['/Zi', '/GS-']
- cxxflags += ['/Zi', '/GS-']
- ldflags += ['/DEBUG', '/OPT:REF', '/OPT:ICF']
-
- deployment_env = None
- if deployment_target:
- deployment_env = os.environ.copy()
- deployment_env['MACOSX_DEPLOYMENT_TARGET'] = deployment_target
-
- # Build lld and code coverage tools. This is done separately from the rest of
- # the build because these tools require threading support.
- tools_with_threading = [ 'dsymutil', 'lld', 'llvm-cov', 'llvm-profdata' ]
- print('Building the following tools with threading support: %s' %
- str(tools_with_threading))
-
- if os.path.exists(THREADS_ENABLED_BUILD_DIR):
- RmTree(THREADS_ENABLED_BUILD_DIR)
- EnsureDirExists(THREADS_ENABLED_BUILD_DIR)
- os.chdir(THREADS_ENABLED_BUILD_DIR)
+ CopyDiaDllTo(os.path.join(LLVM_BUILD_DIR, 'bin'))
+ WriteStampFile(expected_stamp, STAMP_FILE)
- threads_enabled_cmake_args = base_cmake_args + [
- '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
- '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
- '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags),
- '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags),
- '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags)]
- if cc is not None:
- threads_enabled_cmake_args.append('-DCMAKE_C_COMPILER=' + cc)
- if cxx is not None:
- threads_enabled_cmake_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
-
- if args.lto_lld:
- # Build lld with LTO. That speeds up the linker by ~10%.
- # We only use LTO for Linux now.
- #
- # The linker expects all archive members to have symbol tables, so the
- # archiver needs to be able to create symbol tables for bitcode files.
- # GNU ar and ranlib don't understand bitcode files, but llvm-ar and
- # llvm-ranlib do, so use them.
- ar = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'llvm-ar')
- ranlib = os.path.join(LLVM_BOOTSTRAP_INSTALL_DIR, 'bin', 'llvm-ranlib')
- threads_enabled_cmake_args += [
- '-DCMAKE_AR=' + ar,
- '-DCMAKE_RANLIB=' + ranlib,
- '-DLLVM_ENABLE_LTO=thin',
- '-DLLVM_USE_LINKER=lld']
-
- RmCmakeCache('.')
- RunCommand(['cmake'] + threads_enabled_cmake_args + [LLVM_DIR],
- msvc_arch='x64', env=deployment_env)
- RunCommand(['ninja'] + tools_with_threading, msvc_arch='x64')
-
- # Build clang and other tools.
- CreateChromeToolsShim()
-
- cmake_args = []
- # TODO(thakis): Unconditionally append this to base_cmake_args instead once
- # compiler-rt can build with clang-cl on Windows (http://llvm.org/PR23698)
- cc_args = base_cmake_args if sys.platform != 'win32' else cmake_args
- if cc is not None: cc_args.append('-DCMAKE_C_COMPILER=' + cc)
- if cxx is not None: cc_args.append('-DCMAKE_CXX_COMPILER=' + cxx)
- default_tools = ['plugins', 'blink_gc_plugin', 'translation_unit']
- chrome_tools = list(set(default_tools + args.extra_tools))
- cmake_args += base_cmake_args + [
- '-DLLVM_ENABLE_THREADS=OFF',
- '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
- '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags),
- '-DCMAKE_EXE_LINKER_FLAGS=' + ' '.join(ldflags),
- '-DCMAKE_SHARED_LINKER_FLAGS=' + ' '.join(ldflags),
- '-DCMAKE_MODULE_LINKER_FLAGS=' + ' '.join(ldflags),
- '-DCMAKE_INSTALL_PREFIX=' + LLVM_BUILD_DIR,
- '-DCHROMIUM_TOOLS_SRC=%s' % os.path.join(CHROMIUM_DIR, 'tools', 'clang'),
- '-DCHROMIUM_TOOLS=%s' % ';'.join(chrome_tools)]
-
- EnsureDirExists(LLVM_BUILD_DIR)
- os.chdir(LLVM_BUILD_DIR)
- RmCmakeCache('.')
- RunCommand(['cmake'] + cmake_args + [LLVM_DIR],
- msvc_arch='x64', env=deployment_env)
- RunCommand(['ninja'], msvc_arch='x64')
-
- # Copy in the threaded versions of lld and other tools.
- if sys.platform == 'win32':
- CopyFile(os.path.join(THREADS_ENABLED_BUILD_DIR, 'bin', 'lld-link.exe'),
- os.path.join(LLVM_BUILD_DIR, 'bin'))
- CopyFile(os.path.join(THREADS_ENABLED_BUILD_DIR, 'bin', 'lld.pdb'),
- os.path.join(LLVM_BUILD_DIR, 'bin'))
- else:
- for tool in tools_with_threading:
- CopyFile(os.path.join(THREADS_ENABLED_BUILD_DIR, 'bin', tool),
- os.path.join(LLVM_BUILD_DIR, 'bin'))
-
- if chrome_tools:
- # If any Chromium tools were built, install those now.
- RunCommand(['ninja', 'cr-install'], msvc_arch='x64')
-
- VeryifyVersionOfBuiltClangMatchesVERSION()
-
- # Do an out-of-tree build of compiler-rt.
- # On Windows, this is used to get the 32-bit ASan run-time.
- # TODO(hans): Remove once the regular build above produces this.
- # On Mac and Linux, this is used to get the regular 64-bit run-time.
- # Do a clobbered build due to cmake changes.
- if os.path.isdir(COMPILER_RT_BUILD_DIR):
- RmTree(COMPILER_RT_BUILD_DIR)
- os.makedirs(COMPILER_RT_BUILD_DIR)
- os.chdir(COMPILER_RT_BUILD_DIR)
- # TODO(thakis): Add this once compiler-rt can build with clang-cl (see
- # above).
- #if args.bootstrap and sys.platform == 'win32':
- # The bootstrap compiler produces 64-bit binaries by default.
- #cflags += ['-m32']
- #cxxflags += ['-m32']
- compiler_rt_args = base_cmake_args + [
- '-DLLVM_ENABLE_THREADS=OFF',
- '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
- '-DCMAKE_CXX_FLAGS=' + ' '.join(cxxflags)]
- if sys.platform == 'darwin':
- compiler_rt_args += ['-DCOMPILER_RT_ENABLE_IOS=ON']
- if sys.platform != 'win32':
- compiler_rt_args += ['-DLLVM_CONFIG_PATH=' +
- os.path.join(LLVM_BUILD_DIR, 'bin', 'llvm-config'),
- '-DSANITIZER_MIN_OSX_VERSION="10.7"']
- # compiler-rt is part of the llvm checkout on Windows but a stand-alone
- # directory elsewhere, see the TODO above COMPILER_RT_DIR.
- RmCmakeCache('.')
- RunCommand(['cmake'] + compiler_rt_args +
- [LLVM_DIR if sys.platform == 'win32' else COMPILER_RT_DIR],
- msvc_arch='x86', env=deployment_env)
- RunCommand(['ninja', 'compiler-rt'], msvc_arch='x86')
- if sys.platform != 'win32':
- RunCommand(['ninja', 'fuzzer'])
-
- # Copy select output to the main tree.
- # TODO(hans): Make this (and the .gypi and .isolate files) version number
- # independent.
- if sys.platform == 'win32':
- platform = 'windows'
- elif sys.platform == 'darwin':
- platform = 'darwin'
- else:
- assert sys.platform.startswith('linux')
- platform = 'linux'
- rt_lib_src_dir = os.path.join(COMPILER_RT_BUILD_DIR, 'lib', platform)
- if sys.platform == 'win32':
- # TODO(thakis): This too is due to compiler-rt being part of the checkout
- # on Windows, see TODO above COMPILER_RT_DIR.
- rt_lib_src_dir = os.path.join(COMPILER_RT_BUILD_DIR, 'lib', 'clang',
- VERSION, 'lib', platform)
- rt_lib_dst_dir = os.path.join(LLVM_BUILD_DIR, 'lib', 'clang', VERSION, 'lib',
- platform)
- # Blacklists:
- CopyDirectoryContents(os.path.join(rt_lib_src_dir, '..', '..', 'share'),
- os.path.join(rt_lib_dst_dir, '..', '..', 'share'))
- # Headers:
- if sys.platform != 'win32':
- CopyDirectoryContents(
- os.path.join(COMPILER_RT_BUILD_DIR, 'include/sanitizer'),
- os.path.join(LLVM_BUILD_DIR, 'lib/clang', VERSION, 'include/sanitizer'))
- # Static and dynamic libraries:
- CopyDirectoryContents(rt_lib_src_dir, rt_lib_dst_dir)
- if sys.platform == 'darwin':
- for dylib in glob.glob(os.path.join(rt_lib_dst_dir, '*.dylib')):
- # Fix LC_ID_DYLIB for the ASan dynamic libraries to be relative to
- # @executable_path.
- # TODO(glider): this is transitional. We'll need to fix the dylib
- # name either in our build system, or in Clang. See also
- # http://crbug.com/344836.
- subprocess.call(['install_name_tool', '-id',
- '@executable_path/' + os.path.basename(dylib), dylib])
-
- if args.with_android:
- make_toolchain = os.path.join(
- ANDROID_NDK_DIR, 'build', 'tools', 'make_standalone_toolchain.py')
- for target_arch in ['aarch64', 'arm', 'i686']:
- # Make standalone Android toolchain for target_arch.
- toolchain_dir = os.path.join(
- LLVM_BUILD_DIR, 'android-toolchain-' + target_arch)
- api_level = '21' if target_arch == 'aarch64' else '19'
- RunCommand([
- make_toolchain,
- '--api=' + api_level,
- '--force',
- '--install-dir=%s' % toolchain_dir,
- '--stl=libc++',
- '--arch=' + {
- 'aarch64': 'arm64',
- 'arm': 'arm',
- 'i686': 'x86',
- }[target_arch]])
-
- # NDK r16 "helpfully" installs libc++ as libstdc++ "so the compiler will
- # pick it up by default". Only these days, the compiler tries to find
- # libc++ instead. See https://crbug.com/902270.
- shutil.copy(os.path.join(toolchain_dir, 'sysroot/usr/lib/libstdc++.a'),
- os.path.join(toolchain_dir, 'sysroot/usr/lib/libc++.a'))
- shutil.copy(os.path.join(toolchain_dir, 'sysroot/usr/lib/libstdc++.so'),
- os.path.join(toolchain_dir, 'sysroot/usr/lib/libc++.so'))
-
- # Build compiler-rt runtimes needed for Android in a separate build tree.
- build_dir = os.path.join(LLVM_BUILD_DIR, 'android-' + target_arch)
- if not os.path.exists(build_dir):
- os.mkdir(os.path.join(build_dir))
- os.chdir(build_dir)
- target_triple = target_arch
- if target_arch == 'arm':
- target_triple = 'armv7'
- target_triple += '-linux-android' + api_level
- cflags = ['--target=%s' % target_triple,
- '--sysroot=%s/sysroot' % toolchain_dir,
- '-B%s' % toolchain_dir]
- android_args = base_cmake_args + [
- '-DLLVM_ENABLE_THREADS=OFF',
- '-DCMAKE_C_COMPILER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang'),
- '-DCMAKE_CXX_COMPILER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang++'),
- '-DLLVM_CONFIG_PATH=' + os.path.join(LLVM_BUILD_DIR, 'bin/llvm-config'),
- '-DCMAKE_C_FLAGS=' + ' '.join(cflags),
- '-DCMAKE_CXX_FLAGS=' + ' '.join(cflags),
- '-DCMAKE_ASM_FLAGS=' + ' '.join(cflags),
- '-DSANITIZER_CXX_ABI=libcxxabi',
- '-DCMAKE_SHARED_LINKER_FLAGS=-Wl,-u__cxa_demangle',
- '-DANDROID=1']
- RmCmakeCache('.')
- RunCommand(['cmake'] + android_args + [COMPILER_RT_DIR])
-
- # We use ASan i686 build for fuzzing.
- libs_want = ['lib/linux/libclang_rt.asan-{0}-android.so']
- if target_arch in ['aarch64', 'arm']:
- libs_want += [
- 'lib/linux/libclang_rt.ubsan_standalone-{0}-android.so',
- 'lib/linux/libclang_rt.profile-{0}-android.a',
- ]
- if target_arch == 'aarch64':
- libs_want += ['lib/linux/libclang_rt.hwasan-{0}-android.so']
- libs_want = [lib.format(target_arch) for lib in libs_want]
- RunCommand(['ninja'] + libs_want)
-
- # And copy them into the main build tree.
- for p in libs_want:
- shutil.copy(p, rt_lib_dst_dir)
-
- if args.with_fuchsia:
- # Fuchsia links against libclang_rt.builtins-<arch>.a instead of libgcc.a.
- for target_arch in ['aarch64', 'x86_64']:
- fuchsia_arch_name = {'aarch64': 'arm64', 'x86_64': 'x64'}[target_arch]
- toolchain_dir = os.path.join(
- FUCHSIA_SDK_DIR, 'arch', fuchsia_arch_name, 'sysroot')
- # Build clang_rt runtime for Fuchsia in a separate build tree.
- build_dir = os.path.join(LLVM_BUILD_DIR, 'fuchsia-' + target_arch)
- if not os.path.exists(build_dir):
- os.mkdir(os.path.join(build_dir))
- os.chdir(build_dir)
- target_spec = target_arch + '-fuchsia'
- # TODO(thakis): Might have to pass -B here once sysroot contains
- # binaries (e.g. gas for arm64?)
- fuchsia_args = base_cmake_args + [
- '-DLLVM_ENABLE_THREADS=OFF',
- '-DCMAKE_C_COMPILER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang'),
- '-DCMAKE_CXX_COMPILER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang++'),
- '-DCMAKE_LINKER=' + os.path.join(LLVM_BUILD_DIR, 'bin/clang'),
- '-DCMAKE_AR=' + os.path.join(LLVM_BUILD_DIR, 'bin/llvm-ar'),
- '-DLLVM_CONFIG_PATH=' + os.path.join(LLVM_BUILD_DIR, 'bin/llvm-config'),
- '-DCMAKE_SYSTEM_NAME=Fuchsia',
- '-DCMAKE_C_COMPILER_TARGET=%s-fuchsia' % target_arch,
- '-DCMAKE_ASM_COMPILER_TARGET=%s-fuchsia' % target_arch,
- '-DCOMPILER_RT_DEFAULT_TARGET_ONLY=ON',
- '-DCMAKE_SYSROOT=%s' % toolchain_dir,
- # TODO(thakis|scottmg): Use PER_TARGET_RUNTIME_DIR for all platforms.
- # https://crbug.com/882485.
- '-DLLVM_ENABLE_PER_TARGET_RUNTIME_DIR=ON',
-
- # These are necessary because otherwise CMake tries to build an
- # executable to test to see if the compiler is working, but in doing so,
- # it links against the builtins.a that we're about to build.
- '-DCMAKE_C_COMPILER_WORKS=ON',
- '-DCMAKE_ASM_COMPILER_WORKS=ON',
- ]
- RmCmakeCache('.')
- RunCommand(['cmake'] +
- fuchsia_args +
- [os.path.join(COMPILER_RT_DIR, 'lib', 'builtins')])
- builtins_a = 'libclang_rt.builtins.a'
- RunCommand(['ninja', builtins_a])
-
- # And copy it into the main build tree.
- fuchsia_lib_dst_dir = os.path.join(LLVM_BUILD_DIR, 'lib', 'clang',
- VERSION, target_spec, 'lib')
- if not os.path.exists(fuchsia_lib_dst_dir):
- os.makedirs(fuchsia_lib_dst_dir)
- CopyFile(os.path.join(build_dir, target_spec, 'lib', builtins_a),
- fuchsia_lib_dst_dir)
-
- # Run tests.
- if args.run_tests or use_head_revision:
- os.chdir(LLVM_BUILD_DIR)
- RunCommand(['ninja', 'cr-check-all'], msvc_arch='x64')
- if args.run_tests:
- if sys.platform == 'win32':
- CopyDiaDllTo(os.path.join(LLVM_BUILD_DIR, 'bin'))
- os.chdir(LLVM_BUILD_DIR)
- RunCommand(['ninja', 'check-all'], msvc_arch='x64')
-
- WriteStampFile(PACKAGE_VERSION)
- print('Clang update was successful.')
return 0
-def gn_arg(v):
- if v == 'True':
- return True
- if v == 'False':
- return False
- raise argparse.ArgumentTypeError('Expected one of %r or %r' % (
- 'True', 'False'))
-
-
def main():
- parser = argparse.ArgumentParser(description='Build Clang.')
- parser.add_argument('--bootstrap', action='store_true',
- help='first build clang with CC, then with itself.')
- parser.add_argument('--disable-asserts', action='store_true',
- help='build with asserts disabled')
+ # TODO: Add an argument to download optional packages and remove the various
+ # download_ scripts we currently have for that.
+
+ parser = argparse.ArgumentParser(description='Update clang.')
+ parser.add_argument('--clang-dir',
+ help='Where to extract the clang package.')
parser.add_argument('--force-local-build', action='store_true',
- help="don't try to download prebuild binaries")
- parser.add_argument('--gcc-toolchain', help='set the version for which gcc '
- 'version be used for building; --gcc-toolchain=/opt/foo '
- 'picks /opt/foo/bin/gcc')
- parser.add_argument('--lto-lld', action='store_true',
- help='build lld with LTO')
- parser.add_argument('--llvm-force-head-revision', action='store_true',
- help=('use the revision in the repo when printing '
- 'the revision'))
+ help='(no longer used)')
parser.add_argument('--print-revision', action='store_true',
- help='print current clang revision and exit.')
+ help='Print current clang revision and exit.')
+ parser.add_argument('--llvm-force-head-revision', action='store_true',
+ help='Print locally built revision with --print-revision')
parser.add_argument('--print-clang-version', action='store_true',
- help='print current clang version (e.g. x.y.z) and exit.')
- parser.add_argument('--run-tests', action='store_true',
- help='run tests after building; only for local builds')
- parser.add_argument('--skip-build', action='store_true',
- help='do not build anything')
- parser.add_argument('--skip-checkout', action='store_true',
- help='do not create or update any checkouts')
- parser.add_argument('--extra-tools', nargs='*', default=[],
- help='select additional chrome tools to build')
- parser.add_argument('--use-system-cmake', action='store_true',
- help='use the cmake from PATH instead of downloading '
- 'and using prebuilt cmake binaries')
+ help=('Print current clang release version (e.g. 9.0.0) '
+ 'and exit.'))
parser.add_argument('--verify-version',
- help='verify that clang has the passed-in version')
- parser.add_argument('--with-android', type=gn_arg, nargs='?', const=True,
- help='build the Android ASan runtime (linux only)',
- default=sys.platform.startswith('linux'))
- parser.add_argument('--without-android', action='store_false',
- help='don\'t build Android ASan runtime (linux only)',
- dest='with_android')
- parser.add_argument('--without-fuchsia', action='store_false',
- help='don\'t build Fuchsia clang_rt runtime (linux/mac)',
- dest='with_fuchsia',
- default=sys.platform in ('linux2', 'darwin'))
+ help='Verify that clang has the passed-in version.')
args = parser.parse_args()
- if args.lto_lld and not args.bootstrap:
- print('--lto-lld requires --bootstrap')
+ if args.force_local_build:
+ print(('update.py --force-local-build is no longer used to build clang; '
+ 'use build.py instead.'))
return 1
- if args.lto_lld and not sys.platform.startswith('linux'):
- print('--lto-lld is only effective on Linux. Ignoring the option.')
- args.lto_lld = False
- # Get svn if we're going to use it to check the revision or do a local build.
- if (use_head_revision or args.llvm_force_head_revision or
- args.force_local_build):
- AddSvnToPathOnWin()
-
- if args.verify_version and args.verify_version != VERSION:
- print('VERSION is %s but --verify-version argument was %s, exiting.' % (
- VERSION, args.verify_version))
+ if args.verify_version and args.verify_version != RELEASE_VERSION:
+ print('RELEASE_VERSION is %s but --verify-version argument was %s.' % (
+ RELEASE_VERSION, args.verify_version))
print('clang_version in build/toolchain/toolchain.gni is likely outdated.')
return 1
- # DEVELOPER_DIR needs to be set when Xcode isn't in a standard location
- # and xcode-select wasn't run. This is needed for running clang and ld
- # for the build done by this script, but it's also needed for running
- # macOS system svn, so this needs to happen before calling functions using
- # svn.
- SetMacXcodePath()
-
- global CLANG_REVISION, PACKAGE_VERSION
- if args.print_revision:
- if use_head_revision or args.llvm_force_head_revision:
- print(GetSvnRevision(LLVM_DIR))
- else:
- print(PACKAGE_VERSION)
- return 0
-
if args.print_clang_version:
- sys.stdout.write(VERSION)
+ print(RELEASE_VERSION)
return 0
- # Don't buffer stdout, so that print statements are immediately flushed.
- # Do this only after --print-revision has been handled, else we'll get
- # an error message when this script is run from gn for some reason.
- sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
+ if args.print_revision:
+ if args.llvm_force_head_revision:
+ force_head_revision = ReadStampFile(FORCE_HEAD_REVISION_FILE)
+ if force_head_revision == '':
+ print('No locally built version found!')
+ return 1
+ print(force_head_revision)
+ return 0
+
+ print(PACKAGE_VERSION)
+ return 0
- if use_head_revision:
- # Use a real revision number rather than HEAD to make sure that the stamp
- # file logic works.
- CLANG_REVISION = GetSvnRevision(LLVM_REPO_URL)
- PACKAGE_VERSION = CLANG_REVISION + '-0'
+ if args.llvm_force_head_revision:
+ print('--llvm-force-head-revision can only be used for --print-revision')
+ return 1
- args.force_local_build = True
- # Don't build fuchsia runtime on ToT bots at all.
- args.with_fuchsia = False
+ if args.clang_dir:
+ global LLVM_BUILD_DIR, STAMP_FILE
+ LLVM_BUILD_DIR = os.path.abspath(args.clang_dir)
+ STAMP_FILE = os.path.join(LLVM_BUILD_DIR, 'cr_build_revision')
- return UpdateClang(args)
+ return UpdateClang()
if __name__ == '__main__':
diff --git a/chromium/tools/clang/scripts/upload_revision.py b/chromium/tools/clang/scripts/upload_revision.py
index 8eb4eb3e7e2..33f1ea73b91 100755
--- a/chromium/tools/clang/scripts/upload_revision.py
+++ b/chromium/tools/clang/scripts/upload_revision.py
@@ -3,7 +3,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
-"""This script takes a Clang revision as an argument, it then
+"""This script takes a Clang git revision as an argument, it then
creates a feature branch, puts this revision into update.py, uploads
a CL, triggers Clang Upload try bots, and tells what to do next"""
@@ -16,6 +16,8 @@ import shutil
import subprocess
import sys
+from build import GetSvnRevision
+
# Path constants.
THIS_DIR = os.path.dirname(__file__)
UPDATE_PY_PATH = os.path.join(THIS_DIR, "update.py")
@@ -23,16 +25,20 @@ CHROMIUM_DIR = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..'))
is_win = sys.platform.startswith('win32')
-def PatchRevision(clang_revision, clang_sub_revision):
+def PatchRevision(clang_git_revision, clang_svn_revision, clang_sub_revision):
with open(UPDATE_PY_PATH, 'rb') as f:
content = f.read()
- m = re.search("CLANG_REVISION = '([0-9]+)'", content)
+ m = re.search("CLANG_SVN_REVISION = '([0-9]+)'", content)
clang_old_revision = m.group(1)
- content = re.sub("CLANG_REVISION = '[0-9]+'",
- "CLANG_REVISION = '{}'".format(clang_revision),
+
+ content = re.sub("CLANG_REVISION = '[0-9a-f]+'",
+ "CLANG_REVISION = '{}'".format(clang_git_revision),
+ content, count=1)
+ content = re.sub("CLANG_SVN_REVISION = '[0-9]+'",
+ "CLANG_SVN_REVISION = '{}'".format(clang_svn_revision),
content, count=1)
- content = re.sub("CLANG_SUB_REVISION=[0-9]+",
- "CLANG_SUB_REVISION={}".format(clang_sub_revision),
+ content = re.sub("CLANG_SUB_REVISION = [0-9]+",
+ "CLANG_SUB_REVISION = {}".format(clang_sub_revision),
content, count=1)
with open(UPDATE_PY_PATH, 'wb') as f:
f.write(content)
@@ -45,32 +51,38 @@ def Git(args):
def main():
parser = argparse.ArgumentParser(description='upload new clang revision')
- parser.add_argument('clang_revision', metavar='CLANG_REVISION',
- type=int, nargs=1,
- help='Clang revision to build the toolchain for.')
- parser.add_argument('clang_sub_revision', metavar='CLANG_SUB_REVISION',
+ parser.add_argument('clang_git_revision', nargs=1,
+ help='Clang git revision to build the toolchain for.')
+ parser.add_argument('clang_sub_revision',
type=int, nargs='?', default=1,
help='Clang sub-revision to build the toolchain for.')
args = parser.parse_args()
- clang_revision = args.clang_revision[0]
+ clang_git_revision = args.clang_git_revision[0]
+ clang_svn_revision = GetSvnRevision(clang_git_revision)
clang_sub_revision = args.clang_sub_revision
+
# Needs shell=True on Windows due to git.bat in depot_tools.
git_revision = subprocess.check_output(
["git", "rev-parse", "origin/master"], shell=is_win).strip()
- print "Making a patch for Clang revision r{}-{}".format(
- clang_revision, clang_sub_revision)
+
+ print "Making a patch for Clang {}-{}-{}".format(clang_svn_revision,
+ clang_git_revision[:8],
+ clang_sub_revision)
print "Chrome revision: {}".format(git_revision)
- clang_old_revision = PatchRevision(clang_revision, clang_sub_revision)
- Git(["checkout", "-b", "clang-{}-{}".format(
- clang_revision, clang_sub_revision)])
+ clang_old_revision = PatchRevision(clang_git_revision, clang_svn_revision,
+ clang_sub_revision)
+
+ Git(["checkout", "-b", "clang-{}-{}-{}".format(clang_svn_revision,
+ clang_git_revision[:8],
+ clang_sub_revision)])
Git(["add", UPDATE_PY_PATH])
commit_message = 'Ran `{}`.'.format(' '.join(sys.argv))
Git(["commit", "-m", "Roll clang {}:{}.\n\n{}".format(
- clang_old_revision, clang_revision, commit_message)])
+ clang_old_revision, clang_svn_revision, commit_message)])
Git(["cl", "upload", "-f"])
Git(["cl", "try", "-b", "linux_upload_clang", "-r", git_revision])
diff --git a/chromium/tools/clang/traffic_annotation_extractor/README.md b/chromium/tools/clang/traffic_annotation_extractor/README.md
index 5cf984aff0c..cfbfbee9b51 100644
--- a/chromium/tools/clang/traffic_annotation_extractor/README.md
+++ b/chromium/tools/clang/traffic_annotation_extractor/README.md
@@ -4,14 +4,14 @@ This is a clang tool to extract network traffic annotations. The tool is run by
help on how to use.
## Build on Linux
-`tools/clang/scripts/update.py --bootstrap --force-local-build
+`tools/clang/scripts/build.py --bootstrap
--without-android --extra-tools traffic_annotation_extractor`
## Build on Window
1. Either open a `VS2015 x64 Native Tools Command Prompt`, or open a normal
command prompt and run `depot_tools\win_toolchain\vs_files\
$long_autocompleted_hash\win_sdk\bin\setenv.cmd /x64`
-2. Run `python tools/clang/scripts/update.py --bootstrap --force-local-build
+2. Run `python tools/clang/scripts/build.py --bootstrap
--without-android --extra-tools traffic_annotation_extractor`
## Usage
@@ -57,4 +57,4 @@ Each direct assignment output will have the following format:
- Line 2: File path.
- Line 3: Name of the function in which assignment is done.
- Line 4: Line number of the assignment.
- - Line 5: "==== ASSIGNMENT ENDS ====" \ No newline at end of file
+ - Line 5: "==== ASSIGNMENT ENDS ===="
diff --git a/chromium/tools/clang/translation_unit/TranslationUnitGenerator.cpp b/chromium/tools/clang/translation_unit/TranslationUnitGenerator.cpp
index 579e64747b5..2493b63a992 100644
--- a/chromium/tools/clang/translation_unit/TranslationUnitGenerator.cpp
+++ b/chromium/tools/clang/translation_unit/TranslationUnitGenerator.cpp
@@ -74,7 +74,9 @@ class IncludeFinderPPCallbacks : public clang::PPCallbacks {
const string& relative_path) const;
clang::SourceManager* const source_manager_;
+#if !defined(NDEBUG)
string* const main_source_file_;
+#endif
set<string>* const source_file_paths_;
set<string> system_header_prefixes_;
// The path of the file that was last referenced by an inclusion directive,
@@ -89,9 +91,11 @@ IncludeFinderPPCallbacks::IncludeFinderPPCallbacks(
string* main_source_file,
set<string>* source_file_paths,
const HeaderSearchOptions* header_search_options)
- : source_manager_(source_manager),
- main_source_file_(main_source_file),
- source_file_paths_(source_file_paths) {
+ : source_manager_(source_manager),
+#if !defined(NDEBUG)
+ main_source_file_(main_source_file),
+#endif
+ source_file_paths_(source_file_paths) {
// In practice this list seems to be empty, but add it anyway just in case.
for (const auto& prefix : header_search_options->SystemHeaderPrefixes) {
system_header_prefixes_.insert(prefix.Prefix);
diff --git a/chromium/tools/code_coverage/coverage.py b/chromium/tools/code_coverage/coverage.py
index 16e5f550d1d..8d71110b1c2 100755
--- a/chromium/tools/code_coverage/coverage.py
+++ b/chromium/tools/code_coverage/coverage.py
@@ -14,8 +14,8 @@
* Example usage:
gn gen out/coverage \\
- --args='use_clang_coverage=true is_component_build=false \\
- dcheck_always_on=true'
+ --args="use_clang_coverage=true is_component_build=false\\
+ is_debug=false dcheck_always_on=true"
gclient runhooks
python tools/code_coverage/coverage.py crypto_unittests url_unittests \\
-b out/coverage -o out/report -c 'out/coverage/crypto_unittests' \\
@@ -166,6 +166,7 @@ def _ConfigureLLVMCoverageTools(args):
'both \'%s\' and \'%s\' exist.') % (
LLVM_COV_PATH, LLVM_PROFDATA_PATH)
+
def _GetPathWithLLVMSymbolizerDir():
"""Add llvm-symbolizer directory to path for symbolized stacks."""
path = os.getenv('PATH')
@@ -190,7 +191,6 @@ def _IsIOS():
return _GetTargetOS() == 'ios'
-
def _GeneratePerFileLineByLineCoverageInHtml(binary_paths, profdata_file_path,
filters, ignore_filename_regex):
"""Generates per file line-by-line coverage in html using 'llvm-cov show'.
diff --git a/chromium/tools/code_coverage/html_templates/table.html b/chromium/tools/code_coverage/html_templates/table.html
index 0687383fee0..e6e38e24c13 100644
--- a/chromium/tools/code_coverage/html_templates/table.html
+++ b/chromium/tools/code_coverage/html_templates/table.html
@@ -7,15 +7,18 @@
<thead>
<tr>
<th class="column-entry-bold">{{ table_entry_type }}</th>
- <th class="column-entry-bold" title=
+ <th class="column-entry-bold" onclick="sortTable(SORT_COLUMN.LINE)" title=
"Line coverage is the percentage of code lines which have been executed at least once. Only executable lines within function bodies are considered to be code lines.">
- Line Coverage</th>
- <th class="column-entry-bold" title=
+ Line Coverage
+ </th>
+ <th class="column-entry-bold" onclick="sortTable(SORT_COLUMN.FUNCTION)" title=
"Function coverage is the percentage of functions which have been executed at least once. A function is considered to be executed if any of its instantiations are executed.">
- Function Coverage</th>
- <th class="column-entry-bold" title=
+ Function Coverage
+ </th>
+ <th class="column-entry-bold" onclick="sortTable(SORT_COLUMN.REGION)" title=
"Region coverage is the percentage of code regions which have been executed at least once. A code region may span multiple lines (e.g in a large function body with no control flow). However, it's also possible for a single line to contain multiple code regions (e.g in 'return x || y &amp;&amp; z').">
- Region Coverage</th>
+ Region Coverage
+ </th>
</tr>
</thead>
<tbody>
@@ -51,8 +54,54 @@
</tfoot>
{% endif %}
</table>
-{% if table_entry_type == "Component" %}
+
<script>
+ const SORT_COLUMN = {
+ LINE: 2,
+ FUNCTION: 3,
+ REGION: 4,
+ }
+
+ const SORT_TYPES = {
+ UNSET: -1,
+ PERCENT: 0,
+ AGGREGATE: 1,
+ }
+
+ var SORT_ORDER = {
+ [SORT_COLUMN.LINE]: [SORT_TYPES.UNSET],
+ [SORT_COLUMN.FUNCTION]: [SORT_TYPES.UNSET],
+ [SORT_COLUMN.REGION]: [SORT_TYPES.UNSET],
+ }
+
+ function sortTable(columnNumber) {
+ SORT_ORDER[columnNumber] = ++SORT_ORDER[columnNumber] % 2;
+
+ let columnSortOrder = SORT_ORDER[columnNumber];
+ let tbody = document.getElementsByTagName("tbody")[0];
+
+ [].slice.call(tbody.rows).sort(function(a, b) {
+ let aColumn = a.cells[columnNumber-1].textContent;
+ let bColumn = b.cells[columnNumber-1].textContent;
+
+ let aColumnCompare, bColumnCompare;
+ if (columnSortOrder == SORT_TYPES.PERCENT) {
+ aColumnCompare = parseFloat(/([0-9.]+)%/.exec(aColumn)[1]);
+ bColumnCompare = parseFloat(/([0-9.]+)%/.exec(bColumn)[1]);
+ } else {
+ aColumnCompare = parseInt(/\/(\d+)/.exec(aColumn)[1]);
+ bColumnCompare = parseInt(/\/(\d+)/.exec(bColumn)[1]);
+ }
+
+ return (
+ aColumnCompare < bColumnCompare ? -1:
+ aColumnCompare > bColumnCompare ? 1 : 0);
+ }).forEach(function(value, index) {
+ tbody.appendChild(value);
+ });
+ }
+
+{% if table_entry_type == "Component" %}
function filterInputChanged() {
let filter = document.getElementById("filter");
let filterString = filter.value;
@@ -104,5 +153,5 @@
var filter = document.getElementById("filter");
filter.onchange = filter.onkeyup = filterInputChanged;
-</script>
{% endif %}
+</script>
diff --git a/chromium/tools/code_coverage/run_fuzz_target.py b/chromium/tools/code_coverage/run_fuzz_target.py
index ba5e46a030d..07ccb5ce40c 100755
--- a/chromium/tools/code_coverage/run_fuzz_target.py
+++ b/chromium/tools/code_coverage/run_fuzz_target.py
@@ -182,7 +182,7 @@ def _RunWithTimeout(cmd, timeout):
# SIGINT, suppress it here to prevent interrupting the script itself.
pass
- output, error = runner.communicate()
+ runner.communicate()
logging.info('Finished running the fuzz target.')
@@ -215,13 +215,11 @@ def Main():
},
'num_regressions': 0,
'tests': {
- fuzzer_name: {
- 'expected': 'PASS',
- 'actual': 'PASS',
- 'times': [
- int(end_time - start_time),
- ]
- },
+ fuzzer_name: {
+ 'expected': 'PASS',
+ 'actual': 'PASS',
+ 'times': [int(end_time - start_time),]
+ },
}
}, f)
diff --git a/chromium/tools/code_coverage/update_clang_coverage_tools.py b/chromium/tools/code_coverage/update_clang_coverage_tools.py
index 8da3ef89836..34257b87deb 100755
--- a/chromium/tools/code_coverage/update_clang_coverage_tools.py
+++ b/chromium/tools/code_coverage/update_clang_coverage_tools.py
@@ -28,16 +28,16 @@ def DownloadCoverageToolsIfNeeded():
"""Temporary solution to download llvm-profdata and llvm-cov tools."""
def _GetRevisionFromStampFile(stamp_file_path):
- """Returns a pair of revision number by reading the build stamp file.
+ """Returns revision by reading the build stamp file.
Args:
stamp_file_path: A path the build stamp file created by
tools/clang/scripts/update.py.
Returns:
- A pair of integers represeting the main and sub revision respectively.
+ A string represeting the revision of the tool, such as 361212-67510fac-2.
"""
if not os.path.exists(stamp_file_path):
- return 0, 0
+ return ''
with open(stamp_file_path) as stamp_file:
stamp_file_line = stamp_file.readline()
@@ -46,31 +46,25 @@ def DownloadCoverageToolsIfNeeded():
else:
package_version = stamp_file_line.rstrip()
- clang_revision_str, clang_sub_revision_str = package_version.split('-')
- return int(clang_revision_str), int(clang_sub_revision_str)
+ return package_version
cov_path = os.path.join(clang_update.LLVM_BUILD_DIR, 'llvm-cov')
profdata_path = os.path.join(clang_update.LLVM_BUILD_DIR, 'llvm-profdata')
host_platform = coverage_utils.GetHostPlatform()
- clang_revision, clang_sub_revision = _GetRevisionFromStampFile(
- clang_update.STAMP_FILE)
-
+ clang_revision = _GetRevisionFromStampFile(clang_update.STAMP_FILE)
coverage_revision_stamp_file = os.path.join(
os.path.dirname(clang_update.STAMP_FILE), 'cr_coverage_revision')
- coverage_revision, coverage_sub_revision = _GetRevisionFromStampFile(
- coverage_revision_stamp_file)
+ coverage_revision = _GetRevisionFromStampFile(coverage_revision_stamp_file)
has_coverage_tools = (
- os.path.exists(cov_path)
- and os.path.exists(profdata_path))
+ os.path.exists(cov_path) and os.path.exists(profdata_path))
- if (has_coverage_tools and coverage_revision == clang_revision and
- coverage_sub_revision == clang_sub_revision):
+ if (has_coverage_tools and clang_revision == coverage_revision):
# LLVM coverage tools are up to date, bail out.
return
- package_version = '%d-%d' % (clang_revision, clang_sub_revision)
+ package_version = clang_revision
coverage_tools_file = 'llvm-code-coverage-%s.tgz' % package_version
# The code below follows the code from tools/clang/scripts/update.py.
@@ -84,8 +78,8 @@ def DownloadCoverageToolsIfNeeded():
coverage_tools_url = (clang_update.CDS_URL + '/Win/' + coverage_tools_file)
try:
- clang_update.DownloadAndUnpack(
- coverage_tools_url, clang_update.LLVM_BUILD_DIR)
+ clang_update.DownloadAndUnpack(coverage_tools_url,
+ clang_update.LLVM_BUILD_DIR)
with open(coverage_revision_stamp_file, 'w') as file_handle:
file_handle.write('%s,%s' % (package_version, host_platform))
file_handle.write('\n')
diff --git a/chromium/tools/cros/bootstrap_deps b/chromium/tools/cros/bootstrap_deps
index f8e63101d62..b91f2d7fb3c 100644
--- a/chromium/tools/cros/bootstrap_deps
+++ b/chromium/tools/cros/bootstrap_deps
@@ -10,6 +10,8 @@
deps = {
"src/tools/cros/":
"https://src.chromium.org/chrome/trunk/src/tools/cros/",
+ "src/components/variations/service":
+ "https://src.chromium.org/chrome/trunk/src/variations/service/",
}
# Both contest/test/gpu and tools/perf will pull in telemetry.
diff --git a/chromium/tools/cygprofile/cluster.py b/chromium/tools/cygprofile/cluster.py
index b20372aed82..226c334553f 100644
--- a/chromium/tools/cygprofile/cluster.py
+++ b/chromium/tools/cygprofile/cluster.py
@@ -11,8 +11,11 @@ import collections
import itertools
import logging
-
Neighbor = collections.namedtuple('Neighbor', ('src', 'dst', 'dist'))
+CalleeInfo = collections.namedtuple('CalleeInfo',
+ ('index', 'callee_symbol',
+ 'misses', 'caller_and_count'))
+CallerInfo = collections.namedtuple('CallerInfo', ('caller_symbol', 'count'))
class Clustering(object):
@@ -86,6 +89,12 @@ class Clustering(object):
c.AddSymbolLists(sym_lists)
return c.ClusterToList(size_map)
+ @classmethod
+ def ClusterSymbolCallGraph(cls, call_graph, whitelist):
+ c = cls()
+ c.AddSymbolCallGraph(call_graph, whitelist)
+ return c.ClusterToList()
+
def __init__(self):
self._num_lists = None
self._neighbors = None
@@ -127,6 +136,39 @@ class Clustering(object):
self._neighbors = self._CoalesceNeighbors(
self._ConstructNeighbors(sym_lists))
+ def AddSymbolCallGraph(self, call_graph, whitelist):
+ self._num_lists = len(call_graph)
+ self._neighbors = self._ConstructNeighborsFromGraph(call_graph, whitelist)
+
+ def _ConstructNeighborsFromGraph(self, call_graph, whitelist):
+ neighbors = []
+ pairs = collections.defaultdict()
+ # Each list item is a list of dict.
+ for process_items in call_graph:
+ for callee_info in process_items:
+ callee = callee_info.callee_symbol
+ for caller_info in callee_info.caller_and_count:
+ caller = caller_info.caller_symbol
+ if caller in whitelist or callee == caller:
+ continue
+
+ # Multiply by -1, the biggest the count the smaller the distance
+ # should be.
+ dist = caller_info.count * -1
+ if (caller, callee) in pairs:
+ pairs[(caller, callee)] += dist
+ elif (callee, caller) in pairs:
+ pairs[(callee, caller)] += dist
+ else:
+ pairs[(caller, callee)] = dist
+
+ for (s, t) in pairs:
+ assert s != t and (t, s) not in pairs, ('Unexpected shuffled pair:'
+ ' ({}, {})'.format(s, t))
+ neighbors.append(Neighbor(s, t, pairs[(s, t)]))
+
+ return neighbors
+
def _ConstructNeighbors(self, sym_lists):
neighbors = []
for sym_list in sym_lists:
@@ -219,17 +261,99 @@ class Clustering(object):
assert len(ordered_syms) == len(set(ordered_syms)), 'Duplicated symbols!'
return ordered_syms
-
-def ClusterOffsets(profiles, processor, limit_cluster_size=False):
- """Cluster profile offsets.
+def _GetOffsetSymbolName(processor, dump_offset):
+ dump_offset_to_symbol_info = \
+ processor.GetDumpOffsetToSymboInfolIncludingWhitelist()
+ offset_to_primary = processor.OffsetToPrimaryMap()
+ idx = dump_offset / 2
+ assert dump_offset >= 0 and idx < len(dump_offset_to_symbol_info), (
+ 'Dump offset out of binary range')
+ symbol_info = dump_offset_to_symbol_info[idx]
+ assert symbol_info, ('A return address (offset = 0x{:08x}) does not map '
+ 'to any symbol'.format(dump_offset))
+ assert symbol_info.offset in offset_to_primary, (
+ 'Offset not found in primary map!')
+ return offset_to_primary[symbol_info.offset].name
+
+def _GetSymbolsCallGraph(profiles, processor):
+ """Maps each offset in the call graph to the corresponding symbol name.
Args:
profiles (ProfileManager) Manager of the profile dump files.
processor (SymbolOffsetProcessor) Symbol table processor for the dumps.
Returns:
- A list of clustered symbol offsets.
+ A dict that maps each process type (ex: browser, renderer, etc.) to a list
+ of processes of that type. Each process is a list that contains the
+ call graph information. The call graph is represented by a list where each
+ item is a dict that contains: callee, 3 caller-count pairs, misses.
"""
+ offsets_graph = profiles.GetProcessOffsetGraph();
+ process_symbols_graph = collections.defaultdict(list)
+
+ # |process_type| can be : browser, renderer...etc.
+ for process_type in offsets_graph:
+ for process in offsets_graph[process_type]:
+ process = sorted(process, key=lambda k: long(k['index']))
+ graph_list = []
+ for el in process:
+ index = long(el['index'])
+ callee_symbol = _GetOffsetSymbolName(processor,
+ long(el['callee_offset']))
+ misses = 0
+ caller_and_count = []
+ for bucket in el['caller_and_count']:
+ caller_offset = long(bucket['caller_offset'])
+ count = long(bucket['count'])
+ if caller_offset == 0:
+ misses = count
+ continue
+
+ caller_symbol_name = _GetOffsetSymbolName(processor, caller_offset)
+ caller_info = CallerInfo(caller_symbol=caller_symbol_name,
+ count=count)
+ caller_and_count.append(caller_info)
+
+ callee_info = CalleeInfo(index=index,
+ callee_symbol=callee_symbol,
+ misses=misses,
+ caller_and_count=caller_and_count)
+ graph_list.append(callee_info)
+ process_symbols_graph[process_type].append(graph_list)
+ return process_symbols_graph
+
+def _ClusterOffsetsFromCallGraph(profiles, processor):
+ symbols_call_graph = _GetSymbolsCallGraph(profiles, processor)
+ # Process names from the profile dumps that are treated specially.
+ _RENDERER = 'renderer'
+ _BROWSER = 'browser'
+
+ assert _RENDERER in symbols_call_graph
+ assert _BROWSER in symbols_call_graph
+ whitelist = processor.GetWhitelistSymbols()
+ renderer_clustering = Clustering.ClusterSymbolCallGraph(
+ symbols_call_graph[_RENDERER], whitelist)
+ browser_clustering = Clustering.ClusterSymbolCallGraph(
+ symbols_call_graph[_BROWSER], whitelist)
+ other_lists = []
+ for process in symbols_call_graph:
+ if process not in (_RENDERER, _BROWSER):
+ other_lists.extend(symbols_call_graph[process])
+ if other_lists:
+ other_clustering = Clustering.ClusterSymbolCallGraph(other_lists, whitelist)
+ else:
+ other_clustering = []
+
+ # Start with the renderer cluster to favor rendering performance.
+ final_ordering = [s for s in renderer_clustering]
+ seen = set(final_ordering)
+ final_ordering.extend(s for s in browser_clustering if s not in seen)
+ seen |= set(browser_clustering)
+ final_ordering.extend(s for s in other_clustering if s not in seen)
+
+ return final_ordering
+
+def _ClusterOffsetsLists(profiles, processor, limit_cluster_size=False):
raw_offsets = profiles.GetProcessOffsetLists()
process_symbols = collections.defaultdict(list)
seen_symbols = set()
@@ -273,3 +397,20 @@ def ClusterOffsets(profiles, processor, limit_cluster_size=False):
final_ordering.extend(s for s in other_clustering if s not in seen)
return final_ordering
+
+def ClusterOffsets(profiles, processor, limit_cluster_size=False,
+ call_graph=False):
+ """Cluster profile offsets.
+
+ Args:
+ profiles (ProfileManager) Manager of the profile dump files.
+ processor (SymbolOffsetProcessor) Symbol table processor for the dumps.
+ call_graph (bool) whether the call graph instrumentation was used.
+
+ Returns:
+ A list of clustered symbol offsets.
+"""
+ if not call_graph:
+ return _ClusterOffsetsLists(profiles, processor, limit_cluster_size)
+ else:
+ return _ClusterOffsetsFromCallGraph(profiles, processor)
diff --git a/chromium/tools/cygprofile/cluster_unittest.py b/chromium/tools/cygprofile/cluster_unittest.py
index 249811ca0e3..6b7813da28d 100755
--- a/chromium/tools/cygprofile/cluster_unittest.py
+++ b/chromium/tools/cygprofile/cluster_unittest.py
@@ -6,6 +6,7 @@
"""Tests for cluster.py."""
import unittest
+import json
import cluster
import process_profiles
@@ -103,7 +104,6 @@ class ClusteringTestCase(unittest.TestCase):
list('badf'), list('baef')])
self.assertEqual(list('fedcba'), c.ClusterToList(size_map))
-
def testClusterOffsets(self):
processor = TestSymbolOffsetProcessor([
SimpleTestSymbol('linker_script_start_of_text', 0, 0),
@@ -124,12 +124,239 @@ class ClusteringTestCase(unittest.TestCase):
ProfileFile(51, 1, 'gpu-process'): [6000, 7000],
ProfileFile(70, 0, ''): [1000, 2000, 6000, 8000, 9000],
ProfileFile(70, 1, ''): [9000, 5000, 3000]})
- syms = cluster.ClusterOffsets(mgr, processor, False)
+ syms = cluster.ClusterOffsets(mgr, processor, limit_cluster_size=False)
self.assertListEqual(list('236148957'), syms)
- syms = cluster.ClusterOffsets(mgr, processor, True)
+ syms = cluster.ClusterOffsets(mgr, processor, limit_cluster_size=True)
self.assertListEqual(list('236489517'), syms)
+ def testClusteringDistancesForCallGraph(self):
+ c = cluster.Clustering()
+ callerA = cluster.CallerInfo(caller_symbol='a', count=1)
+ callerB = cluster.CallerInfo(caller_symbol='b', count=2)
+ callerC = cluster.CallerInfo(caller_symbol='c', count=3)
+ callerD = cluster.CallerInfo(caller_symbol='d', count=100)
+ callerE = cluster.CallerInfo(caller_symbol='e', count=200)
+
+ calleeA = cluster.CalleeInfo(index=4, callee_symbol='a', misses=0,
+ caller_and_count=[])
+ calleeB = cluster.CalleeInfo(index=8, callee_symbol='b', misses=1,
+ caller_and_count=[callerA])
+ calleeC = cluster.CalleeInfo(index=12, callee_symbol='c', misses=1,
+ caller_and_count=[callerA, callerE])
+ calleeD = cluster.CalleeInfo(index=20, callee_symbol='d', misses=1,
+ caller_and_count=[callerB, callerC, callerE])
+ calleeF = cluster.CalleeInfo(index=28, callee_symbol='f', misses=10,
+ caller_and_count=[callerD])
+ process1 = [calleeA, calleeB, calleeC, calleeD]
+ process2 = [calleeA, calleeB, calleeC, calleeD, calleeF]
+ call_graph = [process1, process2]
+ whitelist = ['e', 'g', 'h', 'k', 'l']
+ c.AddSymbolCallGraph(call_graph, whitelist)
+ distances = {}
+ for n in c._neighbors:
+ self.assertFalse((n.src, n.dst) in distances)
+ distances[(n.src, n.dst)] = n.dist
+ self.assertEqual(5, len(distances))
+ self.assertEquals(-2, distances[('a', 'b')])
+ self.assertEquals(-2, distances[('a', 'c')])
+ self.assertEquals(-4, distances[('b', 'd')])
+ self.assertEquals(-6, distances[('c', 'd')])
+ self.assertEquals(-100, distances[('d', 'f')])
+ self.assertEquals(list('abcdf'), c.ClusterToList())
+
+ def testClusterOffsetsFromCallGraph(self):
+ process1 = ('{"call_graph": [ {'
+ '"callee_offset": "1000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "0",'
+ '"count": "2"'
+ '} ],'
+ '"index": "61496"'
+ '}, {'
+ '"callee_offset": "7000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "1000",'
+ '"count": "2"'
+ '}, {'
+ '"caller_offset": "7500",'
+ '"count": "100"'
+ '} ],'
+ '"index": "61500"'
+ '}, {'
+ '"callee_offset": "6000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "1000",'
+ '"count": "4"'
+ '}, {'
+ '"caller_offset": "7000",'
+ '"count": "3"'
+ '}, {'
+ '"caller_offset": "7500",'
+ '"count": "2"'
+ '}, {'
+ '"caller_offset": "0",'
+ '"count": "3"'
+ '} ],'
+ '"index": "47860"'
+ '}, {'
+ '"callee_offset": "3000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "6000",'
+ '"count": "11"'
+ '} ],'
+ '"index": "47900"'
+ '} ],'
+ '"total_calls_count": "127"'
+ '}')
+
+ process2 = ('{"call_graph": [ {'
+ '"callee_offset": "1000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "0",'
+ '"count": "2"'
+ '} ],'
+ '"index": "61496"'
+ '}, {'
+ '"callee_offset": "5000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "1000",'
+ '"count": "20"'
+ '}, {'
+ '"caller_offset": "5000",'
+ '"count": "100"'
+ '}, {'
+ '"caller_offset": "3000",'
+ '"count": "40"'
+ '} ],'
+ '"index": "61500"'
+ '}, {'
+ '"callee_offset": "3000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "5000",'
+ '"count": "10"'
+ '}, {'
+ '"caller_offset": "0",'
+ '"count": "10"'
+ '} ],'
+ '"index": "47860"'
+ '} ],'
+ '"total_calls_count": "182"'
+ '}')
+
+ process3 = ('{"call_graph": [ {'
+ '"callee_offset": "8000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "0",'
+ '"count": "5"'
+ '} ],'
+ '"index": "61496"'
+ '}, {'
+ '"callee_offset": "2000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "8000",'
+ '"count": "100"'
+ '} ],'
+ '"index": "61500"'
+ '}, {'
+ '"callee_offset": "4000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "8000",'
+ '"count": "20"'
+ '} ],'
+ '"index": "61504"'
+ '}, {'
+ '"callee_offset": "9000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "8000",'
+ '"count": "50"'
+ '} ],'
+ '"index": "61512"'
+ '}, {'
+ '"callee_offset": "7000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "2000",'
+ '"count": "15"'
+ '}, {'
+ '"caller_offset": "4000",'
+ '"count": "20"'
+ '}, {'
+ '"caller_offset": "9000",'
+ '"count": "80"'
+ '}, {'
+ '"caller_offset": "0",'
+ '"count": "400"'
+ '} ],'
+ '"index": "61516"'
+ '} ],'
+ '"total_calls_count": "690"'
+ '}')
+
+ process4 = ('{"call_graph": [ {'
+ '"callee_offset": "8000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "0",'
+ '"count": "10"'
+ '} ],'
+ '"index": "61496"'
+ '}, {'
+ '"callee_offset": "2000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "8000",'
+ '"count": "100"'
+ '} ],'
+ '"index": "61500"'
+ '}, {'
+ '"callee_offset": "6000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "7000",'
+ '"count": "10"'
+ '} , {'
+ '"caller_offset": "7500",'
+ '"count": "2"'
+ '} ],'
+ '"index": "61504"'
+ '}, {'
+ '"callee_offset": "7000",'
+ '"caller_and_count": [ {'
+ '"caller_offset": "8000",'
+ '"count": "300"'
+ '}, {'
+ '"caller_offset": "7500",'
+ '"count": "100"'
+ '}, {'
+ '"caller_offset": "2000",'
+ '"count": "15"'
+ '}, {'
+ '"caller_offset": "0",'
+ '"count": "50"'
+ '} ],'
+ '"index": "61516"'
+ '} ],'
+ '"total_calls_count": "587"'
+ '}')
+
+ processor = TestSymbolOffsetProcessor([
+ SimpleTestSymbol('linker_script_start_of_text', 0, 0),
+ SimpleTestSymbol('1', 1000, 999),
+ SimpleTestSymbol('2', 2000, 999),
+ SimpleTestSymbol('3', 3000, 999),
+ SimpleTestSymbol('4', 4000, 16),
+ SimpleTestSymbol('5', 5000, 16),
+ SimpleTestSymbol('6', 6000, 999),
+ SimpleTestSymbol('7', 7000, 16),
+ SimpleTestSymbol('8', 7100, 0), # whitelist
+ SimpleTestSymbol('9', 8000, 999),
+ SimpleTestSymbol('10', 9000, 16)])
+ mgr = TestProfileManager({
+ ProfileFile(40, 0, 'renderer'): json.loads(process1),
+ ProfileFile(50, 1, 'renderer'): json.loads(process2),
+ ProfileFile(51, 0, 'browser'): json.loads(process3),
+ ProfileFile(51, 1, 'gpu-process'): json.loads(process4)})
+ syms = cluster.ClusterOffsets(mgr, processor, limit_cluster_size=False,
+ call_graph=True)
+ self.assertListEqual(['7', '6', '1', '5', '3', '9', '2', '10', '4'], syms)
+
if __name__ == "__main__":
diff --git a/chromium/tools/cygprofile/orderfile_generator_backend.py b/chromium/tools/cygprofile/orderfile_generator_backend.py
index be93a1cf753..2c791b58535 100755
--- a/chromium/tools/cygprofile/orderfile_generator_backend.py
+++ b/chromium/tools/cygprofile/orderfile_generator_backend.py
@@ -273,14 +273,17 @@ class ClankCompiler(object):
'{}.so'.format(self._libname))
self.chrome_apk = os.path.join(self._out_dir, 'Release', 'apks', self._apk)
- def Build(self, instrumented, target):
+ def Build(self, instrumented, use_call_graph, target):
"""Builds the provided ninja target with or without order_profiling on.
Args:
instrumented: (bool) Whether we want to build an instrumented binary.
+ use_call_graph: (bool) Whether to use the call graph instrumentation.
target: (str) The name of the ninja target to build.
"""
self._step_recorder.BeginStep('Compile %s' % target)
+ assert not use_call_graph or instrumented, ('You can not enable call graph '
+ 'without instrumentation!')
# Set the "Release Official" flavor, the parts affecting performance.
args = [
@@ -291,6 +294,7 @@ class ClankCompiler(object):
'target_os="android"',
'use_goma=' + str(self._use_goma).lower(),
'use_order_profiling=' + str(instrumented).lower(),
+ 'use_call_graph=' + str(use_call_graph).lower(),
]
args += _ARCH_GN_ARGS[self._arch]
if self._goma_dir:
@@ -313,27 +317,29 @@ class ClankCompiler(object):
['ninja', '-C', os.path.join(self._out_dir, 'Release'),
'-j' + str(self._jobs), '-l' + str(self._max_load), target])
- def CompileChromeApk(self, instrumented, force_relink=False):
+ def CompileChromeApk(self, instrumented, use_call_graph, force_relink=False):
"""Builds a Chrome.apk either with or without order_profiling on.
Args:
instrumented: (bool) Whether to build an instrumented apk.
+ use_call_graph: (bool) Whether to use the call graph instrumentation.
force_relink: Whether libchromeview.so should be re-created.
"""
if force_relink:
self._step_recorder.RunCommand(['rm', '-rf', self.lib_chrome_so])
- self.Build(instrumented, self._apk_target)
+ self.Build(instrumented, use_call_graph, self._apk_target)
- def CompileLibchrome(self, instrumented, force_relink=False):
+ def CompileLibchrome(self, instrumented, use_call_graph, force_relink=False):
"""Builds a libchrome.so either with or without order_profiling on.
Args:
instrumented: (bool) Whether to build an instrumented apk.
+ use_call_graph: (bool) Whether to use the call graph instrumentation.
force_relink: (bool) Whether libchrome.so should be re-created.
"""
if force_relink:
self._step_recorder.RunCommand(['rm', '-rf', self.lib_chrome_so])
- self.Build(instrumented, self._libchrome_target)
+ self.Build(instrumented, use_call_graph, self._libchrome_target)
class OrderfileUpdater(object):
@@ -557,8 +563,8 @@ class OrderfileGenerator(object):
preferred_device = None
for device in devices:
if device.build_version_sdk >= version_codes.NOUGAT:
- preferred_device = device
- break
+ preferred_device = device
+ break
self._monochrome = preferred_device is not None
@@ -567,11 +573,15 @@ class OrderfileGenerator(object):
def __init__(self, options, orderfile_updater_class):
self._options = options
-
self._instrumented_out_dir = os.path.join(
self._BUILD_ROOT, self._options.arch + '_instrumented_out')
+ if self._options.use_call_graph:
+ self._instrumented_out_dir += '_call_graph'
+
self._uninstrumented_out_dir = os.path.join(
self._BUILD_ROOT, self._options.arch + '_uninstrumented_out')
+ self._no_orderfile_out_dir = os.path.join(
+ self._BUILD_ROOT, self._options.arch + '_no_orderfile_out')
self._PrepareOrderfilePaths()
@@ -675,7 +685,8 @@ class OrderfileGenerator(object):
profiles = process_profiles.ProfileManager(files)
processor = process_profiles.SymbolOffsetProcessor(
self._compiler.lib_chrome_so)
- ordered_symbols = cluster.ClusterOffsets(profiles, processor)
+ ordered_symbols = cluster.ClusterOffsets(profiles, processor,
+ call_graph=self._options.use_call_graph)
if not ordered_symbols:
raise Exception('Failed to get ordered symbols')
for sym in ordered_symbols:
@@ -807,6 +818,161 @@ class OrderfileGenerator(object):
self._orderfile_updater.UploadToCloudStorage(
file_name, use_debug_location=False)
+ def _NativeCodeMemoryBenchmark(self, apk):
+ """Runs system_health.memory_mobile to assess native code memory footprint.
+
+ Args:
+ apk: (str) Path to the apk.
+
+ Returns:
+ results: ([int]) Values of native code memory footprint in bytes from the
+ benchmark results.
+ """
+ self._step_recorder.BeginStep("Running orderfile.memory_mobile")
+ try:
+ out_dir = tempfile.mkdtemp()
+ self._profiler._RunCommand(['tools/perf/run_benchmark',
+ '--device={}'.format(
+ self._profiler._device.serial),
+ '--browser=exact',
+ '--output-format=chartjson',
+ '--output-dir={}'.format(out_dir),
+ '--reset-results',
+ '--browser-executable={}'.format(apk),
+ 'orderfile.memory_mobile'])
+
+ out_file_path = os.path.join(out_dir, 'results-chart.json')
+ if not os.path.exists(out_file_path):
+ raise Exception('Results file not found!')
+
+ with open(out_file_path, 'r') as f:
+ json_results = json.load(f)
+
+ if not json_results:
+ raise Exception('Results file is empty')
+
+ if not 'charts' in json_results:
+ raise Exception('charts can not be found in results!')
+
+ charts = json_results['charts']
+ results = dict()
+ for story in charts:
+ if not story.endswith("NativeCodeResidentMemory_avg"):
+ continue
+
+ results[story] = dict()
+ for substory in charts[story]:
+ if substory == 'summary':
+ continue
+ if not 'values' in charts[story][substory]:
+ raise Exception(
+ 'Values can not be found in charts:%s:%s' % (story, substory))
+
+ results[story][substory] = charts[story][substory]['values']
+ return results
+
+ except Exception as e:
+ return 'Error: ' + str(e)
+
+ finally:
+ shutil.rmtree(out_dir)
+
+
+ def _PerformanceBenchmark(self, apk):
+ """Runs Speedometer2.0 to assess performance.
+
+ Args:
+ apk: (str) Path to the apk.
+
+ Returns:
+ results: ([float]) Speedometer2.0 results samples in milliseconds.
+ """
+ self._step_recorder.BeginStep("Running Speedometer2.0.")
+ try:
+ out_dir = tempfile.mkdtemp()
+ self._profiler._RunCommand(['tools/perf/run_benchmark',
+ '--device={}'.format(
+ self._profiler._device.serial),
+ '--browser=exact',
+ '--output-format=histograms',
+ '--output-dir={}'.format(out_dir),
+ '--reset-results',
+ '--browser-executable={}'.format(apk),
+ 'speedometer2'])
+
+ out_file_path = os.path.join(out_dir, 'histograms.json')
+ if not os.path.exists(out_file_path):
+ raise Exception('Results file not found!')
+
+ with open(out_file_path, 'r') as f:
+ results = json.load(f)
+
+ if not results:
+ raise Exception('Results file is empty.')
+
+ for el in results:
+ if 'name' in el and el['name'] == 'Total' and 'sampleValues' in el:
+ return el['sampleValues']
+
+ raise Exception('Unexpected results format.')
+
+ except Exception as e:
+ return 'Error: ' + str(e)
+
+ finally:
+ shutil.rmtree(out_dir)
+
+
+ def RunBenchmark(self, out_directory, no_orderfile=False):
+ """Builds chrome apk and runs performance and memory benchmarks.
+
+ Builds a non-instrumented version of chrome.
+ Installs chrome apk on the device.
+ Runs Speedometer2.0 benchmark to assess performance.
+ Runs system_health.memory_mobile to evaluate memory footprint.
+
+ Args:
+ out_directory: (str) Path to out directory for this build.
+ no_orderfile: (bool) True if chrome to be built without orderfile.
+
+ Returns:
+ benchmark_results: (dict) Results extracted from benchmarks.
+ """
+ try:
+ _UnstashOutputDirectory(out_directory)
+ self._compiler = ClankCompiler(
+ out_directory, self._step_recorder,
+ self._options.arch, self._options.jobs, self._options.max_load,
+ self._options.use_goma, self._options.goma_dir,
+ self._options.system_health_orderfile, self._monochrome,
+ self._options.public, self._GetPathToOrderfile())
+
+ if no_orderfile:
+ orderfile_path = self._GetPathToOrderfile()
+ backup_orderfile = orderfile_path + '.backup'
+ shutil.move(orderfile_path, backup_orderfile)
+ open(orderfile_path, 'w').close()
+
+ # Build APK to be installed on the device.
+ self._compiler.CompileChromeApk(instrumented=False,
+ use_call_graph=False,
+ force_relink=True)
+ benchmark_results = dict()
+ benchmark_results['Speedometer2.0'] = self._PerformanceBenchmark(
+ self._compiler.chrome_apk)
+ benchmark_results['orderfile.memory_mobile'] = (
+ self._NativeCodeMemoryBenchmark(self._compiler.chrome_apk))
+
+ except Exception as e:
+ benchmark_results['Error'] = str(e)
+
+ finally:
+ if no_orderfile and os.path.exists(backup_orderfile):
+ shutil.move(backup_orderfile, orderfile_path)
+ _StashOutputDirectory(out_directory)
+
+ return benchmark_results
+
def Generate(self):
"""Generates and maybe upload an order."""
profile_uploaded = False
@@ -836,7 +1002,9 @@ class OrderfileGenerator(object):
# If there are pregenerated profiles, the instrumented build should
# not be changed to avoid invalidating the pregenerated profile
# offsets.
- self._compiler.CompileChromeApk(True)
+ self._compiler.CompileChromeApk(instrumented=True,
+ use_call_graph=
+ self._options.use_call_graph)
self._GenerateAndProcessProfile()
self._MaybeArchiveOrderfile(self._GetUnpatchedOrderfileFilename())
profile_uploaded = True
@@ -871,20 +1039,29 @@ class OrderfileGenerator(object):
self._options.system_health_orderfile, self._monochrome,
self._options.public, self._GetPathToOrderfile())
- self._compiler.CompileLibchrome(False)
+ self._compiler.CompileLibchrome(instrumented=False,
+ use_call_graph=False)
self._PatchOrderfile()
# Because identical code folding is a bit different with and without
# the orderfile build, we need to re-patch the orderfile with code
# folding as close to the final version as possible.
- self._compiler.CompileLibchrome(False, force_relink=True)
+ self._compiler.CompileLibchrome(instrumented=False,
+ use_call_graph=False, force_relink=True)
self._PatchOrderfile()
- self._compiler.CompileLibchrome(False, force_relink=True)
+ self._compiler.CompileLibchrome(instrumented=False,
+ use_call_graph=False, force_relink=True)
self._VerifySymbolOrder()
self._MaybeArchiveOrderfile(self._GetPathToOrderfile())
finally:
_StashOutputDirectory(self._uninstrumented_out_dir)
orderfile_uploaded = True
+ if self._options.benchmark:
+ self._output_data['orderfile_benchmark_results'] = self.RunBenchmark(
+ self._uninstrumented_out_dir)
+ self._output_data['no_orderfile_benchmark_results'] = self.RunBenchmark(
+ self._no_orderfile_out_dir, no_orderfile=True)
+
if self._options.new_commit_flow:
self._orderfile_updater._GitStash()
else:
@@ -924,6 +1101,8 @@ class OrderfileGenerator(object):
def CreateArgumentParser():
"""Creates and returns the argument parser."""
parser = argparse.ArgumentParser()
+ parser.add_argument('--no-benchmark', action='store_false', dest='benchmark',
+ default=True, help='Disables running benchmarks.')
parser.add_argument(
'--buildbot', action='store_true',
help='If true, the script expects to be run on a buildbot')
@@ -1012,7 +1191,8 @@ def CreateArgumentParser():
'checkout; performs no other action'))
parser.add_argument('--new-commit-flow', action='store_true',
help='Use the new two-step commit flow.')
-
+ parser.add_argument('--use-call-graph', action='store_true', default=False,
+ help='Use call graph instrumentation.')
profile_android_startup.AddProfileCollectionArguments(parser)
return parser
diff --git a/chromium/tools/cygprofile/process_profiles.py b/chromium/tools/cygprofile/process_profiles.py
index 368ea72bdef..45e0f0df080 100755
--- a/chromium/tools/cygprofile/process_profiles.py
+++ b/chromium/tools/cygprofile/process_profiles.py
@@ -11,6 +11,7 @@ import logging
import operator
import os
import sys
+import json
_SRC_PATH = os.path.abspath(os.path.join(
os.path.dirname(__file__), os.pardir, os.pardir))
@@ -59,6 +60,8 @@ class SymbolOffsetProcessor(object):
self._offset_to_primary = None
self._offset_to_symbols = None
self._offset_to_symbol_info = None
+ # |_whitelist| will contain symbols whose size is 0.
+ self._whitelist = None
def SymbolInfos(self):
"""The symbols associated with this processor's binary.
@@ -243,6 +246,45 @@ class SymbolOffsetProcessor(object):
'to any symbol'.format(dump_offset))
update(i, symbol_info.offset)
+ def GetWhitelistSymbols(self):
+ """Returns list(string) containing names of the symbols whose size is zero.
+ """
+ if self._whitelist is None:
+ self.GetDumpOffsetToSymboInfolIncludingWhitelist()
+ return self._whitelist
+
+ def GetDumpOffsetToSymboInfolIncludingWhitelist(self):
+ """Computes an array mapping each word in .text to a symbol.
+
+ This list includes symbols with size 0. It considers all offsets till the
+ next symbol to map to the symbol of size 0.
+
+ Returns:
+ [symbol_extractor.SymbolInfo or None] For every 4 bytes of the .text
+ section, maps it to a symbol, or None.
+ """
+ if self._whitelist is None:
+ self._whitelist = set()
+ symbols = self.SymbolInfos()
+ start_syms = [s for s in symbols
+ if s.name == cygprofile_utils.START_OF_TEXT_SYMBOL]
+ assert len(start_syms) == 1, 'Can\'t find unique start of text symbol'
+ start_of_text = start_syms[0].offset
+ self.GetDumpOffsetToSymbolInfo()
+ max_idx = len(self._offset_to_symbol_info)
+ for sym in symbols:
+ if sym.size != 0 or sym.offset == start_of_text:
+ continue
+ self._whitelist.add(sym.name)
+ idx = (sym.offset - start_of_text)/ 2
+ assert self._offset_to_symbol_info[idx] == sym, (
+ 'Unexpected unset offset')
+ idx += 1
+ while idx < max_idx and self._offset_to_symbol_info[idx] is None:
+ self._offset_to_symbol_info[idx] = sym
+ idx += 1
+ return self._offset_to_symbol_info
+
def GetDumpOffsetToSymbolInfo(self):
"""Computes an array mapping each word in .text to a symbol.
@@ -273,6 +315,13 @@ class SymbolOffsetProcessor(object):
# code). In this case, keep the one that started first.
if other_symbol is None or other_symbol.offset > sym.offset:
self._offset_to_symbol_info[i] = sym
+
+ if sym.name != cygprofile_utils.START_OF_TEXT_SYMBOL and sym.size == 0:
+ idx = offset / 2
+ assert (self._offset_to_symbol_info[idx] is None or
+ self._offset_to_symbol_info[idx].size == 0), (
+ 'Unexpected symbols overlapping')
+ self._offset_to_symbol_info[idx] = sym
return self._offset_to_symbol_info
@@ -429,6 +478,32 @@ class ProfileManager(object):
offsets_by_process[self._ProcessName(f)].append(self._ReadOffsets(f))
return offsets_by_process
+ def _SanityCheckAllCallsCapturedByTheInstrumentation(self, process_info):
+ total_calls_count = long(process_info['total_calls_count'])
+ call_graph = process_info['call_graph']
+ count = 0
+ for el in call_graph:
+ for bucket in el['caller_and_count']:
+ count += long(bucket['count'])
+
+ assert total_calls_count == count, ('Instrumentation missed calls!. '
+ '{} != {}').format(total_calls_count,
+ count)
+
+ def GetProcessOffsetGraph(self):
+ """Returns a dict that maps each process type to a list of processes's
+ call graph data.
+ """
+ graph_by_process = collections.defaultdict(list)
+ for f in self._filenames:
+ process_info = self._ReadJSON(f)
+ assert ('total_calls_count' in process_info
+ and 'call_graph' in process_info), ('Unexpected JSON format for '
+ '%s.' % f)
+ self._SanityCheckAllCallsCapturedByTheInstrumentation(process_info)
+ graph_by_process[self._ProcessName(f)].append(process_info['call_graph'])
+ return graph_by_process
+
def GetRunGroupOffsets(self, phase=None):
"""Merges files from each run group and returns offset list for each.
@@ -479,6 +554,11 @@ class ProfileManager(object):
def _ReadOffsets(self, filename):
return [int(x.strip()) for x in open(filename)]
+ def _ReadJSON(self, filename):
+ with open(filename) as f:
+ file_content = json.load(f)
+ return file_content
+
def _ComputeRunGroups(self):
self._run_groups = []
for f in self._filenames:
diff --git a/chromium/tools/cygprofile/test_utils.py b/chromium/tools/cygprofile/test_utils.py
index 6aacbc9f56e..a9451a4de93 100644
--- a/chromium/tools/cygprofile/test_utils.py
+++ b/chromium/tools/cygprofile/test_utils.py
@@ -29,6 +29,9 @@ class TestProfileManager(process_profiles.ProfileManager):
def _ReadOffsets(self, filename):
return self._filecontents_mapping[filename]
+ def _ReadJSON(self, filename):
+ return self._filecontents_mapping[filename]
+
def ProfileFile(timestamp_sec, phase, process_name=None):
global _FILE_COUNTER
diff --git a/chromium/tools/fuchsia/local-sdk.py b/chromium/tools/fuchsia/local-sdk.py
index 3ad6db9debd..505e4e1a3d8 100755
--- a/chromium/tools/fuchsia/local-sdk.py
+++ b/chromium/tools/fuchsia/local-sdk.py
@@ -5,6 +5,7 @@
# found in the LICENSE file.
import hashlib
+import json
import os
import shutil
import subprocess
@@ -33,10 +34,11 @@ def EnsureEmptyDir(path):
def BuildForArch(arch):
build_dir = 'out/release-' + arch
- Run('scripts/fx', '--dir', build_dir, 'set', 'sdk_image.' + arch,
- '--with=//topaz/packages/sdk:topaz', '--args=is_debug=false',
- '--args=build_sdk_archives=true')
- Run('scripts/fx', 'build', 'topaz/public/sdk:topaz')
+ Run('scripts/fx', '--dir', build_dir, 'set', 'terminal.' + arch,
+ '--with=//topaz/packages/sdk:topaz', '--with-base=//sdk/bundles:tools',
+ '--args=is_debug=false', '--args=build_sdk_archives=true')
+ Run('scripts/fx', 'build', 'topaz/public/sdk:fuchsia_dart', 'sdk',
+ 'sdk:images_archive')
def main(args):
@@ -60,8 +62,14 @@ def main(args):
BuildForArch(arch)
tempdir = tempfile.mkdtemp()
- sdk_tar = os.path.join(fuchsia_root, 'out', 'release-' + arch, 'sdk',
- 'archive', 'topaz.tar.gz')
+ sdk_tars = [
+ os.path.join(fuchsia_root, 'out', 'release-' + arch, 'sdk', 'archive',
+ 'images.tar.gz'),
+ os.path.join(fuchsia_root, 'out', 'release-' + arch, 'sdk', 'archive',
+ 'core.tar.gz'),
+ os.path.join(fuchsia_root, 'out', 'release-' + arch, 'sdk', 'archive',
+ 'fuchsia_dart.tar.gz'),
+ ]
# Nuke the SDK from DEPS, put our just-built one there, and set a fake .hash
# file. This means that on next gclient runhooks, we'll restore to the
@@ -69,7 +77,29 @@ def main(args):
output_dir = os.path.join(REPOSITORY_ROOT, 'third_party', 'fuchsia-sdk',
'sdk')
EnsureEmptyDir(output_dir)
- tarfile.open(sdk_tar, mode='r:gz').extractall(path=output_dir)
+
+ # Extract tars merging manifests
+ manifest_path = os.path.join(output_dir, 'meta', 'manifest.json')
+ merged_manifest = None
+ parts = set()
+ for sdk_tar in sdk_tars:
+ tarfile.open(sdk_tar, mode='r:gz').extractall(path=output_dir)
+
+ # Merge the manifest ensuring that we don't have duplicate entries.
+ if os.path.isfile(manifest_path):
+ manifest = json.load(open(manifest_path))
+ os.remove(manifest_path)
+ if not merged_manifest:
+ merged_manifest = manifest
+ else:
+ for part in manifest['parts']:
+ if part['meta'] not in parts:
+ parts.add(part['meta'])
+ merged_manifest['parts'].append(part)
+
+ # Write merged manifest file.
+ with open(manifest_path, 'w') as manifest_file:
+ json.dump(merged_manifest, manifest_file)
print 'Hashing sysroot...'
# Hash the sysroot to catch updates to the headers, but don't hash the whole
diff --git a/chromium/tools/gdb/gdb_chrome.py b/chromium/tools/gdb/gdb_chrome.py
index a16fc61818f..78673584893 100644
--- a/chromium/tools/gdb/gdb_chrome.py
+++ b/chromium/tools/gdb/gdb_chrome.py
@@ -25,6 +25,7 @@ import datetime
import gdb
import gdb.printing
import os
+import re
import sys
sys.path.insert(
@@ -438,6 +439,81 @@ gdb.printing.register_pretty_printer(gdb, pp_set, replace=_DEBUGGING)
"""Implementations of inlined libc++ std container functions."""
+def gdb_running_under_rr():
+ try:
+ # rr defines the when command to return the current event number.
+ gdb.execute('when')
+
+ # If there was no error executing the command, we are running under rr.
+ return True
+ except gdb.error:
+ return False
+
+
+def find_nearest_frame_matching(frame, predicate):
+ while frame and not predicate(frame):
+ frame = frame.older()
+ return frame
+
+
+class ReverseCallback(gdb.Command):
+ """Find when the currently running callback was created."""
+
+ def __init__(self):
+ super(ReverseCallback, self).__init__("reverse-callback", gdb.COMMAND_USER)
+
+ def invoke(self, arg, from_tty):
+ if not gdb_running_under_rr():
+ raise gdb.error('reverse-callback requires debugging under rr: ' +
+ 'https://rr-project.org/')
+
+ # Find the stack frame which extracts the bind state from the task.
+ bind_state_frame = find_nearest_frame_matching(
+ gdb.selected_frame(),
+ lambda frame : frame.function() and
+ re.match('^base::internal::Invoker<base::internal::BindState<.*>' +
+ '::RunOnce\(base::internal::BindStateBase\*\)$',
+ frame.function().name))
+ if bind_state_frame is None:
+ raise Exception(
+ 'base::internal::Invoker frame not found; are you in a callback?')
+ bind_state_frame.select()
+
+ # Disable all existing breakpoints.
+ was_enabled = []
+ for breakpoint in gdb.breakpoints():
+ was_enabled.append(breakpoint.enabled)
+ breakpoint.enabled = False
+
+ # Break on the initialization of the BindState.
+ storage_address = gdb.parse_and_eval('storage')
+ watchpoint = gdb.Breakpoint('*' + str(storage_address), gdb.BP_WATCHPOINT)
+
+ # Find the construction.
+ gdb.execute('reverse-continue')
+
+ # Restore breakpoints
+ watchpoint.delete()
+ for breakpoint, enabled in zip(gdb.breakpoints(), was_enabled):
+ breakpoint.enabled = enabled
+
+ # Find the stack frame which created the BindState.
+ def in_bindstate(frame):
+ return frame.function() and frame.function().name.startswith(
+ 'base::internal::BindState<')
+
+ creation_frame = find_nearest_frame_matching(
+ find_nearest_frame_matching(gdb.selected_frame(), in_bindstate),
+ lambda frame: not in_bindstate(frame))
+
+ # The callback creates the bindstate, step up once more to get the creator
+ # of the callback.
+ creation_frame.older().select()
+
+
+ReverseCallback()
+
+
@class_methods.Class('std::__1::vector', template_types=['T'])
class LibcppVector(object):
diff --git a/chromium/tools/gdb/gdbinit b/chromium/tools/gdb/gdbinit
index bf9f632d316..4f8c7fc956b 100644
--- a/chromium/tools/gdb/gdbinit
+++ b/chromium/tools/gdb/gdbinit
@@ -71,13 +71,31 @@ def newobj_handler(event):
src_dir, _ = git.communicate()
if git.returncode:
return
- src_dir = str(src_dir).rstrip()
+ if isinstance(src_dir, str):
+ src_dir = src_dir.rstrip()
+ else:
+ src_dir = src_dir.decode('utf-8').rstrip()
load_libcxx_pretty_printers(src_dir)
load_gdb_chrome(src_dir)
+lsb_release = subprocess.Popen(['lsb_release', '-sc'],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+codename = lsb_release.communicate()[0]
+if codename.rstrip() == b'rodete' and 'gg' not in gdb.VERSION:
+ sys.stderr.write(
+ '\033[93mDetected gLinux without using google-gdb. google-gdb is '
+ 'recommended because it is more up-to-date than the system gdb, which '
+ 'has known issues (https://crbug.com/957374). To switch to google-gdb, '
+ 'run "sudo apt install google-gdb" which will *uninstall* gdb and '
+ '*install* google-gdb. This is a drop-in replacement with the same '
+ 'command line usage, so you can still run eg. '
+ '"gdb out/Debug/chrome".\033[0m\n'
+ )
+
# Event hook for newly loaded objfiles.
# https://sourceware.org/gdb/onlinedocs/gdb/Events-In-Python.html
gdb.events.new_objfile.connect(newobj_handler)
diff --git a/chromium/tools/grit/BUILD.gn b/chromium/tools/grit/BUILD.gn
index edcff6213b3..b50bdd5224c 100644
--- a/chromium/tools/grit/BUILD.gn
+++ b/chromium/tools/grit/BUILD.gn
@@ -25,3 +25,14 @@ action("grit_sources") {
rebase_path(depfile, root_build_dir),
]
}
+
+group("grit_python_unittests") {
+ testonly = true
+
+ data = [
+ "//testing/scripts/common.py",
+ "//testing/scripts/run_isolated_script_test.py",
+ "//testing/xvfb.py",
+ "//tools/grit/",
+ ]
+}
diff --git a/chromium/tools/grit/grit/extern/FP.py b/chromium/tools/grit/grit/extern/FP.py
index 69892cab3de..0932f755e01 100644
--- a/chromium/tools/grit/grit/extern/FP.py
+++ b/chromium/tools/grit/grit/extern/FP.py
@@ -22,8 +22,8 @@ def _UnsignedFingerPrintImpl(str, encoding='utf-8'):
"""Generate a 64-bit fingerprint by taking the first half of the md5
of the string.
"""
- hex128 = _new_md5(str).hexdigest()
- int64 = long(hex128[:16], 16)
+ hex128 = _new_md5(str.encode(encoding)).hexdigest()
+ int64 = int(hex128[:16], 16)
return int64
@@ -40,8 +40,8 @@ def UnsignedFingerPrint(str, encoding='utf-8'):
def FingerPrint(str, encoding='utf-8'):
fp = UnsignedFingerPrint(str, encoding=encoding)
# interpret fingerprint as signed longs
- if fp & 0x8000000000000000L:
- fp = - ((~fp & 0xFFFFFFFFFFFFFFFFL) + 1)
+ if fp & 0x8000000000000000:
+ fp = -((~fp & 0xFFFFFFFFFFFFFFFF) + 1)
return fp
diff --git a/chromium/tools/grit/grit/extern/tclib.py b/chromium/tools/grit/grit/extern/tclib.py
index d7294731ee7..bbefd7fff56 100644
--- a/chromium/tools/grit/grit/extern/tclib.py
+++ b/chromium/tools/grit/grit/extern/tclib.py
@@ -10,8 +10,6 @@
# for creating Windows .rc and .h files. These are the only parts needed by
# the Chrome build process.
-import exceptions
-
from grit.extern import FP
# This module assumes that within a bundle no two messages can have the
@@ -41,12 +39,14 @@ def GenerateMessageId(message, meaning=''):
else:
fp = fp2 + (fp << 1)
# To avoid negative ids we strip the high-order bit
- return str(fp & 0x7fffffffffffffffL)
+ return str(fp & 0x7fffffffffffffff)
# -------------------------------------------------------------------------
# The MessageTranslationError class is used to signal tclib-specific errors.
-class MessageTranslationError(exceptions.Exception):
+
+class MessageTranslationError(Exception):
+
def __init__(self, args = ''):
self.args = args
@@ -122,16 +122,16 @@ class BaseMessage(object):
# Append a placeholder to the message
def AppendPlaceholder(self, placeholder):
if not isinstance(placeholder, Placeholder):
- raise MessageTranslationError, ("Invalid message placeholder %s in "
- "message %s" % (placeholder, self.GetId()))
+ raise MessageTranslationError("Invalid message placeholder %s in "
+ "message %s" % (placeholder, self.GetId()))
# Are there other placeholders with the same presentation?
# If so, they need to be the same.
for other in self.GetPlaceholders():
if placeholder.GetPresentation() == other.GetPresentation():
if not placeholder.EqualTo(other):
- raise MessageTranslationError, \
- "Conflicting declarations of %s within message" % \
- placeholder.GetPresentation()
+ raise MessageTranslationError(
+ "Conflicting declarations of %s within message" %
+ placeholder.GetPresentation())
# update placeholder list
dup = 0
for item in self.__content:
@@ -204,9 +204,9 @@ class BaseMessage(object):
if source_msg:
ph = source_msg.GetPlaceholder(item.GetPresentation())
if not ph:
- raise MessageTranslationError, \
- "Placeholder %s doesn't exist in message: %s" % \
- (item.GetPresentation(), source_msg);
+ raise MessageTranslationError(
+ "Placeholder %s doesn't exist in message: %s" %
+ (item.GetPresentation(), source_msg))
original_content += ph.GetOriginal()
else:
original_content += item.GetOriginal()
@@ -442,7 +442,7 @@ class Message(BaseMessage):
is_hidden : 0 or 1 - if the message should be hidden, 0 otherwise
"""
if is_hidden not in [0, 1]:
- raise MessageTranslationError, "is_hidden must be 0 or 1, got %s"
+ raise MessageTranslationError("is_hidden must be 0 or 1, got %s")
self.__is_hidden = is_hidden
def IsHidden(self):
diff --git a/chromium/tools/grit/grit/format/js_map_format.py b/chromium/tools/grit/grit/format/js_map_format.py
deleted file mode 100644
index c789fb42eb7..00000000000
--- a/chromium/tools/grit/grit/format/js_map_format.py
+++ /dev/null
@@ -1,43 +0,0 @@
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Formats as a .js file using a map: <english text> -> <localized text>.
-"""
-
-import re
-
-from grit import util
-
-
-"""The required preamble for JS files."""
-_HEADER = '// This file is automatically generated by GRIT. Do not edit.\n'
-
-
-def Format(root, lang='en', output_dir='.'):
- from grit.node import empty, message
- yield _HEADER
- for item in root.ActiveDescendants():
- with item:
- if isinstance(item, message.MessageNode):
- yield _FormatMessage(item, lang)
- elif isinstance(item, empty.MessagesNode):
- yield '\n'
-
-
-def _FormatMessage(item, lang):
- """Format a single message."""
-
- en_message = item.ws_at_start + item.Translate('en') + item.ws_at_end
- # Remove position numbers from placeholders.
- en_message = re.sub(r'%\d\$([a-z])', r'%\1', en_message)
- # Escape double quotes.
- en_message = re.sub(r'\\', r'\\\\', en_message)
- en_message = re.sub(r'"', r'\"', en_message)
-
- loc_message = item.ws_at_start + item.Translate(lang) + item.ws_at_end
- # Escape double quotes.
- loc_message = re.sub(r'\\', r'\\\\', loc_message)
- loc_message = re.sub(r'"', r'\"', loc_message)
-
- return '\nlocalizedStrings["%s"] = "%s";' % (en_message, loc_message)
diff --git a/chromium/tools/grit/grit/format/js_map_format_unittest.py b/chromium/tools/grit/grit/format/js_map_format_unittest.py
deleted file mode 100755
index cac0b2e953a..00000000000
--- a/chromium/tools/grit/grit/format/js_map_format_unittest.py
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/env python
-# Copyright (c) 2012 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-"""Unittest for js_map_format.py.
-"""
-
-import os
-import sys
-if __name__ == '__main__':
- sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
-
-import unittest
-import StringIO
-
-from grit import util
-from grit.tool import build
-
-
-class JsMapFormatUnittest(unittest.TestCase):
-
- def testMessages(self):
- root = util.ParseGrdForUnittest(u"""
- <messages>
- <message name="IDS_SIMPLE_MESSAGE">
- Simple message.
- </message>
- <message name="IDS_QUOTES">
- element\u2019s \u201c<ph name="NAME">%s<ex>name</ex></ph>\u201d attribute
- </message>
- <message name="IDS_PLACEHOLDERS">
- <ph name="ERROR_COUNT">%1$d<ex>1</ex></ph> error, <ph name="WARNING_COUNT">%2$d<ex>1</ex></ph> warning
- </message>
- <message name="IDS_STARTS_WITH_SPACE">
- ''' (<ph name="COUNT">%d<ex>2</ex></ph>)
- </message>
- <message name="IDS_DOUBLE_QUOTES">
- A "double quoted" message.
- </message>
- <message name="IDS_BACKSLASH">
- \\
- </message>
- </messages>
- """)
-
- buf = StringIO.StringIO()
- build.RcBuilder.ProcessNode(root, DummyOutput('js_map_format', 'en'), buf)
- output = util.StripBlankLinesAndComments(buf.getvalue())
- self.assertEqual(u"""\
-localizedStrings["Simple message."] = "Simple message.";
-localizedStrings["element\u2019s \u201c%s\u201d attribute"] = "element\u2019s \u201c%s\u201d attribute";
-localizedStrings["%d error, %d warning"] = "%1$d error, %2$d warning";
-localizedStrings[" (%d)"] = " (%d)";
-localizedStrings["A \\\"double quoted\\\" message."] = "A \\\"double quoted\\\" message.";
-localizedStrings["\\\\"] = "\\\\";""", output)
-
- def testTranslations(self):
- root = util.ParseGrdForUnittest("""
- <messages>
- <message name="ID_HELLO">Hello!</message>
- <message name="ID_HELLO_USER">Hello <ph name="USERNAME">%s<ex>
- Joi</ex></ph></message>
- </messages>
- """)
-
- buf = StringIO.StringIO()
- build.RcBuilder.ProcessNode(root, DummyOutput('js_map_format', 'fr'), buf)
- output = util.StripBlankLinesAndComments(buf.getvalue())
- self.assertEqual(u"""\
-localizedStrings["Hello!"] = "H\xe9P\xe9ll\xf4P\xf4!";
-localizedStrings["Hello %s"] = "H\xe9P\xe9ll\xf4P\xf4 %s";\
-""", output)
-
-
-class DummyOutput(object):
-
- def __init__(self, type, language):
- self.type = type
- self.language = language
-
- def GetType(self):
- return self.type
-
- def GetLanguage(self):
- return self.language
-
- def GetOutputFilename(self):
- return 'hello.gif'
-
-if __name__ == '__main__':
- unittest.main()
diff --git a/chromium/tools/grit/grit/format/policy_templates_json_unittest.py b/chromium/tools/grit/grit/format/policy_templates_json_unittest.py
index 0c9b157f7f1..a738654aff3 100755
--- a/chromium/tools/grit/grit/format/policy_templates_json_unittest.py
+++ b/chromium/tools/grit/grit/format/policy_templates_json_unittest.py
@@ -27,20 +27,38 @@ class PolicyTemplatesJsonUnittest(unittest.TestCase):
def testPolicyTranslation(self):
# Create test policy_templates.json data.
caption = "The main policy"
- caption_translation = "Die Hauptrichtilinie"
+ caption_translation = "Die Hauptrichtlinie"
message = \
"Red cabbage stays red cabbage and wedding dress stays wedding dress"
message_translation = \
"Blaukraut bleibt Blaukraut und Brautkleid bleibt Brautkleid"
+ schema_key_description = "Number of users"
+ schema_key_description_translation = "Anzahl der Nutzer"
+
policy_json = """
{
"policy_definitions": [
{
'name': 'MainPolicy',
'type': 'main',
- 'schema': { 'type': 'boolean' },
+ 'schema': {
+ 'properties': {
+ 'default_launch_container': {
+ 'enum': [
+ 'tab',
+ 'window',
+ ],
+ 'type': 'string',
+ },
+ 'users_number': {
+ 'description': '''%s''',
+ 'type': 'integer',
+ },
+ },
+ 'type': 'object',
+ },
'supported_on': ['chrome_os:29-'],
'features': {
'can_be_recommended': True,
@@ -59,19 +77,24 @@ class PolicyTemplatesJsonUnittest(unittest.TestCase):
'text': '''%s'''
}
}
- }""" % (caption, message)
+ }""" % (schema_key_description, caption, message)
# Create translations. The translation IDs are hashed from the English text.
caption_id = grit.extern.tclib.GenerateMessageId(caption);
message_id = grit.extern.tclib.GenerateMessageId(message);
+ schema_key_description_id = grit.extern.tclib.GenerateMessageId(
+ schema_key_description)
policy_xtb = """
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="de">
<translation id="%s">%s</translation>
<translation id="%s">%s</translation>
+<translation id="%s">%s</translation>
</translationbundle>""" % (caption_id, caption_translation,
- message_id, message_translation)
+ message_id, message_translation,
+ schema_key_description_id,
+ schema_key_description_translation)
# Write both to a temp file.
tmp_dir_name = tempfile.gettempdir()
@@ -132,7 +155,22 @@ class PolicyTemplatesJsonUnittest(unittest.TestCase):
'type': 'main',
'example_value': True,
'supported_on': ['chrome_os:29-'],
- 'schema': {'type': 'boolean'},
+ 'schema': {
+ 'properties': {
+ 'default_launch_container': {
+ 'enum': [
+ 'tab',
+ 'window',
+ ],
+ 'type': 'string',
+ },
+ 'users_number': {
+ 'description': '''%s''',
+ 'type': 'integer',
+ },
+ },
+ 'type': 'object',
+ },
},
],
'messages': {
@@ -141,7 +179,8 @@ class PolicyTemplatesJsonUnittest(unittest.TestCase):
},
},
-}""" % (caption_translation, message_translation)
+}""" % (caption_translation, schema_key_description_translation,
+ message_translation)
self.assertEqual(expected, output)
diff --git a/chromium/tools/grit/grit/format/resource_map.py b/chromium/tools/grit/grit/format/resource_map.py
index c34e4a2609a..c9a73c46ced 100644
--- a/chromium/tools/grit/grit/format/resource_map.py
+++ b/chromium/tools/grit/grit/format/resource_map.py
@@ -19,12 +19,6 @@ def GetFormatter(type):
return partial(_FormatSource, _GetItemPath)
if type == 'resource_map_source':
return partial(_FormatSource, _GetItemName)
- if type == 'gzipped_resource_map_header':
- return partial(_FormatHeader, include_gzipped=True)
- if type == 'gzipped_resource_file_map_source':
- return partial(_FormatSource, _GetItemPath, include_gzipped=True)
- if type == 'gzipped_resource_map_source':
- return partial(_FormatSource, _GetItemName, include_gzipped=True)
def GetMapName(root):
@@ -50,7 +44,7 @@ def GetMapName(root):
return 'k' + filename
-def _FormatHeader(root, lang='en', output_dir='.', include_gzipped=False):
+def _FormatHeader(root, lang='en', output_dir='.'):
'''Create the header file for the resource mapping. This file just declares
an array of name/value pairs.'''
return '''\
@@ -58,24 +52,20 @@ def _FormatHeader(root, lang='en', output_dir='.', include_gzipped=False):
#include <stddef.h>
-#ifndef %(macro_prefix)sGRIT_RESOURCE_MAP_STRUCT_
-#define %(macro_prefix)sGRIT_RESOURCE_MAP_STRUCT_
-struct %(struct_prefix)sGritResourceMap {
+#ifndef GRIT_RESOURCE_MAP_STRUCT_
+#define GRIT_RESOURCE_MAP_STRUCT_
+struct GritResourceMap {
const char* const name;
- int value;%(maybe_gzipped_bool)s
+ int value;
};
-#endif // %(macro_prefix)sGRIT_RESOURCE_MAP_STRUCT_
+#endif // GRIT_RESOURCE_MAP_STRUCT_
-extern const %(struct_prefix)sGritResourceMap %(map_name)s[];
+extern const GritResourceMap %(map_name)s[];
extern const size_t %(map_name)sSize;
-''' % { 'map_name': GetMapName(root),
- 'maybe_gzipped_bool': '\n bool gzipped;' if include_gzipped else '',
- 'struct_prefix': 'Gzipped' if include_gzipped else '',
- 'macro_prefix': 'GZIPPED_' if include_gzipped else '',
- }
+''' % { 'map_name': GetMapName(root) }
-def _FormatSourceHeader(root, output_dir, include_gzipped):
+def _FormatSourceHeader(root, output_dir):
'''Create the header of the C++ source file for the resource mapping.'''
rc_header_file = None
map_header_file = None
@@ -84,12 +74,12 @@ def _FormatSourceHeader(root, output_dir, include_gzipped):
if 'rc_header' == type:
rc_header_file = util.MakeRelativePath(output_dir,
output.GetOutputFilename())
- elif 'resource_map_header' == type or 'gzipped_resource_map_header' == type:
+ elif 'resource_map_header' == type:
map_header_file = util.MakeRelativePath(output_dir,
output.GetOutputFilename())
if not rc_header_file or not map_header_file:
raise Exception('resource_map_source output type requires '
- 'a *resource_map_header and rc_header outputs')
+ 'a resource_map_header and rc_header outputs')
return '''\
// This file is automatically generated by GRIT. Do not edit.
@@ -101,11 +91,10 @@ def _FormatSourceHeader(root, output_dir, include_gzipped):
#include "%(rc_header_file)s"
-const %(struct_prefix)sGritResourceMap %(map_name)s[] = {
+const GritResourceMap %(map_name)s[] = {
''' % { 'map_header_file': map_header_file,
'rc_header_file': rc_header_file,
'map_name': GetMapName(root),
- 'struct_prefix': 'Gzipped' if include_gzipped else '',
}
@@ -118,10 +107,10 @@ const size_t %(map_name)sSize = base::size(%(map_name)s);
''' % { 'map_name': GetMapName(root) }
-def _FormatSource(get_key, root, lang, output_dir, include_gzipped=False):
+def _FormatSource(get_key, root, lang, output_dir):
from grit.node import include, structure, message
id_map = root.GetIdMap()
- yield _FormatSourceHeader(root, output_dir, include_gzipped)
+ yield _FormatSourceHeader(root, output_dir)
seen = set()
for item in root.ActiveDescendants():
if not item.IsResourceMapSource():
@@ -131,11 +120,7 @@ def _FormatSource(get_key, root, lang, output_dir, include_gzipped=False):
if tid not in id_map or key in seen:
continue
seen.add(key)
- if include_gzipped:
- gzipped = item.attrs.get('compress', '') == 'gzip'
- yield ' {"%s", %s, %s},\n' % (key, tid, 'true' if gzipped else 'false')
- else:
- yield ' {"%s", %s},\n' % (key, tid)
+ yield ' {"%s", %s},\n' % (key, tid)
yield _FormatSourceFooter(root)
@@ -165,7 +150,8 @@ def _GetItemPath(item):
real_path = item.ToRealPath(item.GetInputPath())
if (item.attrs.get('use_base_dir', 'true') != 'true' and
_IsSubpath(os.path.curdir, real_path)):
- path = os.path.join('@out_folder@', os.path.relpath(real_path))
+ path = os.path.join(
+ '@out_folder@', os.path.relpath(real_path)).replace("\\", "/")
assert '$' not in path, 'all variables should have been expanded'
return path
diff --git a/chromium/tools/grit/grit/format/resource_map_unittest.py b/chromium/tools/grit/grit/format/resource_map_unittest.py
index e1e456e957b..cd290a71fbb 100755
--- a/chromium/tools/grit/grit/format/resource_map_unittest.py
+++ b/chromium/tools/grit/grit/format/resource_map_unittest.py
@@ -88,14 +88,14 @@ const GritResourceMap kTheRcHeader[] = {
};
const size_t kTheRcHeaderSize = base::size(kTheRcHeader);''', output)
- def testGzippedMapFileSourceWithGeneratedFile(self):
+ def testFormatResourceMapWithGeneratedFile(self):
os.environ["root_gen_dir"] = "gen"
grd = util.ParseGrdForUnittest('''\
<outputs>
<output type="rc_header" filename="the_rc_header.h" />
- <output type="gzipped_resource_map_header"
- filename="gzipped_resource_map_header.h" />
+ <output type="resource_map_header"
+ filename="resource_map_header.h" />
</outputs>
<release seq="3">
<includes first_id="10000">
@@ -107,68 +107,19 @@ const size_t kTheRcHeaderSize = base::size(kTheRcHeader);''', output)
</includes>
</release>''', run_gatherers=True)
- formatter = resource_map.GetFormatter('gzipped_resource_file_map_source')
+ formatter = resource_map.GetFormatter('resource_file_map_source')
output = util.StripBlankLinesAndComments(''.join(formatter(grd, 'en', '.')))
- gen_path = os.path.join('@out_folder@', 'gen', 'foo', 'bar', 'baz.js')
expected = '''\
-#include "gzipped_resource_map_header.h"
+#include "resource_map_header.h"
#include <stddef.h>
#include "base/stl_util.h"
#include "the_rc_header.h"
-const GzippedGritResourceMap kTheRcHeader[] = {
- {"''' + gen_path + '''", IDR_FOO_BAR_BAZ_JS, true},
+const GritResourceMap kTheRcHeader[] = {
+ {"@out_folder@/gen/foo/bar/baz.js", IDR_FOO_BAR_BAZ_JS},
};
const size_t kTheRcHeaderSize = base::size(kTheRcHeader);'''
self.assertEqual(expected, output)
- def testGzippedMapHeaderAndFileSource(self):
- grd = util.ParseGrdForUnittest('''\
- <outputs>
- <output type="rc_header" filename="the_rc_header.h" />
- <output type="gzipped_resource_map_header"
- filename="gzipped_resource_map_header.h" />
- </outputs>
- <release seq="3">
- <structures first_id="300">
- <structure type="menu" name="IDC_KLONKMENU" compress="gzip"
- file="grit\\testdata\\klonk.rc" encoding="utf-16" />
- </structures>
- <includes first_id="10000">
- <include type="foo" file="abc" name="IDS_FIRSTPRESENT"
- compress="" />
- <if expr="False">
- <include type="foo" file="def" name="IDS_MISSING"
- compress="garbage" />
- </if>
- </includes>
- </release>''', run_gatherers=True)
- formatter = resource_map.GetFormatter('gzipped_resource_map_header')
- output = util.StripBlankLinesAndComments(''.join(formatter(grd, 'en', '.')))
- self.assertEqual('''\
-#include <stddef.h>
-#ifndef GZIPPED_GRIT_RESOURCE_MAP_STRUCT_
-#define GZIPPED_GRIT_RESOURCE_MAP_STRUCT_
-struct GzippedGritResourceMap {
- const char* const name;
- int value;
- bool gzipped;
-};
-#endif // GZIPPED_GRIT_RESOURCE_MAP_STRUCT_
-extern const GzippedGritResourceMap kTheRcHeader[];
-extern const size_t kTheRcHeaderSize;''', output)
- formatter = resource_map.GetFormatter('gzipped_resource_file_map_source')
- output = util.StripBlankLinesAndComments(''.join(formatter(grd, 'en', '.')))
- self.assertEqual('''\
-#include "gzipped_resource_map_header.h"
-#include <stddef.h>
-#include "base/stl_util.h"
-#include "the_rc_header.h"
-const GzippedGritResourceMap kTheRcHeader[] = {
- {"grit/testdata/klonk.rc", IDC_KLONKMENU, true},
- {"abc", IDS_FIRSTPRESENT, false},
-};
-const size_t kTheRcHeaderSize = base::size(kTheRcHeader);''', output)
-
def testFormatResourceMapWithOutputAllEqualsFalseForStructures(self):
grd = util.ParseGrdForUnittest('''
<outputs>
diff --git a/chromium/tools/grit/grit/gather/chrome_scaled_image.py b/chromium/tools/grit/grit/gather/chrome_scaled_image.py
index b7bcf2d3bfb..91116ab8e0d 100644
--- a/chromium/tools/grit/grit/gather/chrome_scaled_image.py
+++ b/chromium/tools/grit/grit/gather/chrome_scaled_image.py
@@ -103,9 +103,6 @@ class ChromeScaledImage(interface.GathererBase):
if try_default_layout and 'default' not in layouts:
layouts.append('default')
- # TODO(tdanderson): Search in descending order of all image scales
- # instead of immediately falling back to 100.
- # See crbug.com/503643.
scales = [req_scale]
try_low_res = self.grd_node.FindBooleanAttribute(
'fallback_to_low_resolution', default=False, skip_self=False)
diff --git a/chromium/tools/grit/grit/gather/chrome_scaled_image_unittest.py b/chromium/tools/grit/grit/gather/chrome_scaled_image_unittest.py
index d0e665fbd82..6a6b3a4eb49 100755
--- a/chromium/tools/grit/grit/gather/chrome_scaled_image_unittest.py
+++ b/chromium/tools/grit/grit/gather/chrome_scaled_image_unittest.py
@@ -5,6 +5,11 @@
'''Unit tests for ChromeScaledImage.'''
+import os
+import sys
+if __name__ == '__main__':
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '../..')))
import re
import struct
@@ -38,7 +43,8 @@ _PNG_FOOTER = (
def _MakePNG(chunks):
pack_int32 = struct.Struct('>i').pack
- chunks = [pack_int32(len(payload)) + type + payload + pack_int32(zlib.crc32(type + payload))
+ chunks = [pack_int32(len(payload)) + type + payload +
+ pack_int32(zlib.crc32(type + payload))
for type, payload in chunks]
return _PNG_HEADER + ''.join(chunks) + _PNG_FOOTER
@@ -54,7 +60,7 @@ def _GetFilesInRc(rcname, tmp_dir, contents):
'''
data = util.ReadFile(rcname, util.BINARY).decode('utf-16')
contents = dict((tmp_dir.GetPath(k), v) for k, v in contents.items())
- return set(contents[m.group(1)]
+ return set(contents[os.path.normpath(m.group(1))]
for m in re.finditer(ur'(?m)^\w+\s+BINDATA\s+"([^"]+)"$', data))
@@ -79,7 +85,8 @@ def _If(expr, *body):
return '<if expr="%s">\n%s\n</if>' % (expr, '\n'.join(body))
-def _RunBuildTest(self, structures, inputs, expected_outputs, skip_rc=False, layout_fallback=''):
+def _RunBuildTest(self, structures, inputs, expected_outputs, skip_rc=False,
+ layout_fallback=''):
outputs = '\n'.join('<output filename="out/%s%s" type="%s" context="%s"%s />'
% (context, ext, type, context, layout_fallback)
for ext, type in _OUTFILETYPES
@@ -98,7 +105,8 @@ def _RunBuildTest(self, structures, inputs, expected_outputs, skip_rc=False, lay
''' % (outputs, structures),
}
for pngpath, pngdata in inputs.items():
- infiles['in/' + pngpath] = pngdata
+ normpath = os.path.normpath('in/' + pngpath)
+ infiles[normpath] = pngdata
class Options(object):
pass
with util.TempDir(infiles) as tmp_dir:
@@ -191,3 +199,6 @@ class ChromeScaledImageUnittest(unittest.TestCase):
'tactile_123_percent': set([t123a]),
},
layout_fallback=' fallback_to_default_layout="false"')
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/chromium/tools/grit/grit/gather/policy_json.py b/chromium/tools/grit/grit/gather/policy_json.py
index d0a7d672300..6d72a413e28 100644
--- a/chromium/tools/grit/grit/gather/policy_json.py
+++ b/chromium/tools/grit/grit/gather/policy_json.py
@@ -42,8 +42,8 @@ class PolicyJson(skeleton_gatherer.SkeletonGatherer):
for node2 in node1.childNodes:
example_text.append(node2.toxml())
else:
- raise Exception('Unexpected element inside a placeholder: ' +
- node2.toxml())
+ raise Exception('Unexpected element inside a placeholder: ' +
+ node2.toxml())
if example_text == []:
# In such cases the original text is okay for an example.
example_text = text
@@ -154,6 +154,33 @@ class PolicyJson(skeleton_gatherer.SkeletonGatherer):
else:
raise Exception('Unexpected type %s' % item_type)
+ def _AddSchemaKeys(self, obj, depth):
+ obj_type = type(obj)
+ if obj_type == dict:
+ self._AddNontranslateableChunk('{\n')
+ for key in sorted(obj.keys()):
+ self._AddIndentedNontranslateableChunk(depth + 1, "'%s': " % key)
+ if key == 'description' and type(obj[key]) == str:
+ self._AddNontranslateableChunk("'''")
+ self._ParseMessage(obj[key], 'Description of schema property')
+ self._AddNontranslateableChunk("''',\n")
+ elif type(obj[key]) in (bool, int, str):
+ self._AddSchemaKeys(obj[key], 0)
+ else:
+ self._AddSchemaKeys(obj[key], depth + 1)
+ self._AddIndentedNontranslateableChunk(depth, '},\n')
+ elif obj_type == list:
+ self._AddNontranslateableChunk('[\n')
+ for item in obj:
+ self._AddSchemaKeys(item, depth + 1)
+ self._AddIndentedNontranslateableChunk(depth, '],\n')
+ elif obj_type == str:
+ self._AddIndentedNontranslateableChunk(depth, "'%s',\n" % obj)
+ elif obj_type in (bool, int):
+ self._AddIndentedNontranslateableChunk(depth, "%s,\n" % obj)
+ else:
+ raise Exception('Invalid schema object: %s' % obj)
+
def _AddPolicyKey(self, item, item_type, parent_item, key, depth):
'''Given a policy/enumeration item and a key, adds that key and its value
into the output.
@@ -176,6 +203,8 @@ class PolicyJson(skeleton_gatherer.SkeletonGatherer):
item[key],
self._GetDescription(item, item_type, parent_item, key))
self._AddNontranslateableChunk("''',\n")
+ elif key in ('schema', 'validation_schema', 'description_schema'):
+ self._AddSchemaKeys(item[key], depth)
else:
str_val = item[key]
if type(str_val) == types.StringType:
diff --git a/chromium/tools/grit/grit/gather/policy_json_unittest.py b/chromium/tools/grit/grit/gather/policy_json_unittest.py
index 34f4a42bf52..3d19e272390 100755
--- a/chromium/tools/grit/grit/gather/policy_json_unittest.py
+++ b/chromium/tools/grit/grit/gather/policy_json_unittest.py
@@ -81,6 +81,85 @@ class PolicyJsonUnittest(unittest.TestCase):
expected = self.GetExpectedOutput(original)
self.failUnless(expected == eval(gatherer.Translate('en')))
+ def testSchema(self):
+ original = ("{"
+ " 'policy_definitions': ["
+ " {"
+ " 'name': 'Policy1',"
+ " 'schema': {"
+ " 'type': 'object',"
+ " 'properties': {"
+ " 'outer': {"
+ " 'description': 'outer description',"
+ " 'type': 'object',"
+ " 'inner': {"
+ " 'description': 'inner description',"
+ " 'type': 'integer', 'minimum': 0, 'maximum': 100"
+ " },"
+ " 'inner2': {"
+ " 'description': 'inner2 description',"
+ " 'type': 'integer',"
+ " 'enum': [ 1, 2, 3 ],"
+ " 'sensitiveValue': True"
+ " },"
+ " },"
+ " },"
+ " },"
+ " 'caption': 'nothing special',"
+ " },"
+ " ],"
+ " 'messages': {}"
+ "}")
+ gatherer = policy_json.PolicyJson(StringIO.StringIO(original))
+ gatherer.Parse()
+ self.failUnless(len(gatherer.GetCliques()) == 4)
+ expected = self.GetExpectedOutput(original)
+ self.failUnless(expected == eval(gatherer.Translate('en')))
+
+ def testValidationSchema(self):
+ original = ("{"
+ " 'policy_definitions': ["
+ " {"
+ " 'name': 'Policy1',"
+ " 'validation_schema': {"
+ " 'type': 'object',"
+ " 'properties': {"
+ " 'description': 'properties description',"
+ " 'type': 'object',"
+ " },"
+ " },"
+ " },"
+ " ],"
+ " 'messages': {}"
+ "}")
+ gatherer = policy_json.PolicyJson(StringIO.StringIO(original))
+ gatherer.Parse()
+ self.failUnless(len(gatherer.GetCliques()) == 1)
+ expected = self.GetExpectedOutput(original)
+ self.failUnless(expected == eval(gatherer.Translate('en')))
+
+ def testDescriptionSchema(self):
+ original = ("{"
+ " 'policy_definitions': ["
+ " {"
+ " 'name': 'Policy1',"
+ " 'description_schema': {"
+ " 'type': 'object',"
+ " 'properties': {"
+ " 'description': 'properties description',"
+ " 'type': 'object',"
+ " },"
+ " },"
+ " },"
+ " ],"
+ " 'messages': {}"
+ "}")
+ gatherer = policy_json.PolicyJson(StringIO.StringIO(original))
+ gatherer.Parse()
+ self.failUnless(len(gatherer.GetCliques()) == 1)
+ expected = self.GetExpectedOutput(original)
+ self.failUnless(expected == eval(gatherer.Translate('en')))
+
# Keeping for backwards compatibility.
def testSubPolicyOldFormat(self):
original = (
diff --git a/chromium/tools/grit/grit/node/include.py b/chromium/tools/grit/grit/node/include.py
index 667ee617d91..daf5e72e16e 100644
--- a/chromium/tools/grit/grit/node/include.py
+++ b/chromium/tools/grit/grit/node/include.py
@@ -76,7 +76,12 @@ class IncludeNode(base.Node):
# We have no control over code that calles ToRealPath later, so convert
# the path to be relative against our basedir.
if self.attrs.get('use_base_dir', 'true') != 'true':
- return os.path.relpath(self.attrs['file'], self.GetRoot().GetBaseDir())
+ # Normalize the directory path to use the appropriate OS separator.
+ # GetBaseDir() may return paths\like\this or paths/like/this, since it is
+ # read from the base_dir attribute in the grd file.
+ norm_base_dir = os.path.normpath(
+ self.GetRoot().GetBaseDir().replace('\\', '/'))
+ return os.path.relpath(self.attrs['file'], norm_base_dir)
return self.attrs['file']
diff --git a/chromium/tools/grit/grit/node/include_unittest.py b/chromium/tools/grit/grit/node/include_unittest.py
index cef8c092789..b4dcb8a79e3 100755
--- a/chromium/tools/grit/grit/node/include_unittest.py
+++ b/chromium/tools/grit/grit/node/include_unittest.py
@@ -65,9 +65,11 @@ class IncludeNodeUnittest(unittest.TestCase):
includes.AddChild(include_node)
root.EndParsing()
+ last_dir = os.path.basename(os.getcwd())
+ expected_path = util.normpath(os.path.join(
+ u'..', last_dir, u'flugel/kugel.pdf'))
self.assertEqual(root.ToRealPath(include_node.GetInputPath()),
- util.normpath(
- os.path.join(ur'../', ur'flugel/kugel.pdf')))
+ expected_path)
def testCompressGzip(self):
root = util.ParseGrdForUnittest('''
diff --git a/chromium/tools/grit/grit/node/misc_unittest.py b/chromium/tools/grit/grit/node/misc_unittest.py
index 9ee8ed5767b..30df9fec14e 100755
--- a/chromium/tools/grit/grit/node/misc_unittest.py
+++ b/chromium/tools/grit/grit/node/misc_unittest.py
@@ -25,10 +25,13 @@ from grit.node import misc
@contextlib.contextmanager
+# Returns the name of the new temporary file containing |content|, which must be
+# deleted by the caller.
def _MakeTempPredeterminedIdsFile(content):
- with tempfile.NamedTemporaryFile() as f:
+ with tempfile.NamedTemporaryFile(delete=False) as f:
f.write(content)
f.flush()
+ f.close()
yield f.name
@@ -83,11 +86,13 @@ class GritNodeUnittest(unittest.TestCase):
</release>
</grit>''' % chrome_html_path
- grd = grd_reader.Parse(StringIO.StringIO(xml), util.PathFromRoot('grit/testdata'))
+ grd = grd_reader.Parse(StringIO.StringIO(xml),
+ util.PathFromRoot('grit/testdata'))
expected = ['chrome_html.html', 'default_100_percent/a.png',
'default_100_percent/b.png', 'included_sample.html',
'special_100_percent/a.png']
- actual = [os.path.relpath(path, util.PathFromRoot('grit/testdata')) for path in grd.GetInputFiles()]
+ actual = [os.path.relpath(path, util.PathFromRoot('grit/testdata')) for
+ path in grd.GetInputFiles()]
# Convert path separator for Windows paths.
actual = [path.replace('\\', '/') for path in actual]
self.assertEquals(expected, actual)
@@ -112,7 +117,8 @@ class GritNodeUnittest(unittest.TestCase):
grd = grd_reader.Parse(StringIO.StringIO(xml), util.PathFromRoot('grit/testdata'))
expected = ['chrome_html.html', 'included_sample.html']
- actual = [os.path.relpath(path, util.PathFromRoot('grit/testdata')) for path in grd.GetInputFiles()]
+ actual = [os.path.relpath(path, util.PathFromRoot('grit/testdata')) for
+ path in grd.GetInputFiles()]
# Convert path separator for Windows paths.
actual = [path.replace('\\', '/') for path in actual]
self.assertEquals(expected, actual)
@@ -177,6 +183,7 @@ class GritNodeUnittest(unittest.TestCase):
self.assertEqual(('#define IDS_B 102\n'
'#define IDS_GREETING 10000\n'
'#define IDS_A 101\n'), ''.join(output))
+ os.remove(ids_file)
def testPredeterminedIdsOverlap(self):
with _MakeTempPredeterminedIdsFile('ID_LOGO 10000') as ids_file:
@@ -193,6 +200,7 @@ class GritNodeUnittest(unittest.TestCase):
Bongo!
</message>
</messages>''', predetermined_ids_file=ids_file)
+ os.remove(ids_file)
class IfNodeUnittest(unittest.TestCase):
diff --git a/chromium/tools/grit/grit/tclib.py b/chromium/tools/grit/grit/tclib.py
index 4101824d1f4..da8ad32d7da 100644
--- a/chromium/tools/grit/grit/tclib.py
+++ b/chromium/tools/grit/grit/tclib.py
@@ -141,10 +141,8 @@ class BaseMessage(object):
return self.id
def GenerateId(self):
- # Must use a UTF-8 encoded version of the presentable content, along with
- # the meaning attribute, to match the TC.
- return grit.extern.tclib.GenerateMessageId(
- self.GetPresentableContent().encode('utf-8'), self.meaning)
+ return grit.extern.tclib.GenerateMessageId(self.GetPresentableContent(),
+ self.meaning)
def GetPlaceholders(self):
return self.placeholders
diff --git a/chromium/tools/grit/grit/test_suite_all.py b/chromium/tools/grit/grit/test_suite_all.py
index bc5e4e32f9e..246d4f0f2f5 100755
--- a/chromium/tools/grit/grit/test_suite_all.py
+++ b/chromium/tools/grit/grit/test_suite_all.py
@@ -5,16 +5,15 @@
'''Unit test suite that collects all test cases for GRIT.'''
+import argparse
+import json
import os
import sys
-if __name__ == '__main__':
- sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
-
import unittest
-# TODO(joi) Use unittest.defaultTestLoader to automatically load tests
-# from modules. Iterating over the directory and importing could then
+# TODO(https://crbug.com/965793) Use unittest.defaultTestLoader to automatically
+# load tests from modules. Iterating over the directory and importing could then
# automate this all the way, if desired.
@@ -37,7 +36,6 @@ class TestSuiteAll(unittest.TestSuite):
import grit.format.data_pack_unittest
import grit.format.gzip_string_unittest
import grit.format.html_inline_unittest
- import grit.format.js_map_format_unittest
import grit.format.policy_templates_json_unittest
import grit.format.rc_header_unittest
import grit.format.rc_unittest
@@ -81,7 +79,6 @@ class TestSuiteAll(unittest.TestSuite):
grit.format.data_pack_unittest.FormatDataPackUnittest,
grit.format.gzip_string_unittest.FormatGzipStringUnittest,
grit.format.html_inline_unittest.HtmlInlineUnittest,
- grit.format.js_map_format_unittest.JsMapFormatUnittest,
grit.format.policy_templates_json_unittest.PolicyTemplatesJsonUnittest,
grit.format.rc_header_unittest.RcHeaderFormatterUnittest,
grit.format.rc_unittest.FormatRcUnittest,
@@ -117,7 +114,26 @@ class TestSuiteAll(unittest.TestSuite):
for test_class in test_classes:
self.addTest(unittest.makeSuite(test_class))
+def main(args):
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__),
+ '..')))
+ parser = argparse.ArgumentParser(
+ description='Run the full suite of grit unit tests')
+ parser.add_argument(
+ '--write-full-results-to',
+ help='File path that should be used to record the list of test failures')
+ parsed_args = parser.parse_args(args)
-if __name__ == '__main__':
test_result = unittest.TextTestRunner(verbosity=2).run(TestSuiteAll())
- sys.exit(len(test_result.errors) + len(test_result.failures))
+ if (parsed_args.write_full_results_to):
+ failures_and_errors = [str(f[0]) for f in test_result.failures]
+ failures_and_errors.extend(str(e[0]) for e in test_result.errors)
+
+ data = { 'valid': True, 'failures': failures_and_errors }
+ with open(parsed_args.write_full_results_to, 'w') as f:
+ json.dump(data, f)
+
+ return (len(test_result.errors) + len(test_result.failures))
+
+if __name__ == '__main__':
+ sys.exit(main(sys.argv[1:]))
diff --git a/chromium/tools/grit/grit/tool/build.py b/chromium/tools/grit/grit/tool/build.py
index 46ea4ba341e..7157dbb5a2d 100644
--- a/chromium/tools/grit/grit/tool/build.py
+++ b/chromium/tools/grit/grit/tool/build.py
@@ -30,10 +30,6 @@ _format_modules = {
'c_format': 'c_format',
'chrome_messages_json': 'chrome_messages_json',
'data_package': 'data_pack',
- 'gzipped_resource_file_map_source': 'resource_map',
- 'gzipped_resource_map_header': 'resource_map',
- 'gzipped_resource_map_source': 'resource_map',
- 'js_map_format': 'js_map_format',
'policy_templates': 'policy_templates_json',
'rc_all': 'rc',
'rc_header': 'rc_header',
@@ -328,15 +324,10 @@ are exported to translation interchange files (e.g. XMB files), etc.
# files (no UTF-8), so we make all RC files UTF-16 to support all
# character sets.
if output_type in ('rc_header', 'resource_file_map_source',
- 'resource_map_header', 'resource_map_source',
- 'gzipped_resource_file_map_source',
- 'gzipped_resource_map_header',
- 'gzipped_resource_map_source',
- ):
+ 'resource_map_header', 'resource_map_source'):
return 'cp1252'
- if output_type in ('android', 'c_format', 'js_map_format', 'plist',
- 'plist_strings', 'doc', 'json', 'android_policy',
- 'chrome_messages_json'):
+ if output_type in ('android', 'c_format', 'plist', 'plist_strings', 'doc',
+ 'json', 'android_policy', 'chrome_messages_json'):
return 'utf_8'
# TODO(gfeher) modify here to set utf-8 encoding for admx/adml
return 'utf_16'
diff --git a/chromium/tools/grit/grit/util.py b/chromium/tools/grit/grit/util.py
index c3e004b7b45..d98a0bfddb2 100644
--- a/chromium/tools/grit/grit/util.py
+++ b/chromium/tools/grit/grit/util.py
@@ -641,7 +641,7 @@ class TempDir(object):
dir_path = os.path.split(file_path)[0]
if not os.path.exists(dir_path):
os.makedirs(dir_path)
- with open(file_path, 'w') as f:
+ with open(file_path, 'wb') as f:
f.write(file_data[name])
def __enter__(self):
diff --git a/chromium/tools/grit/grit_rule.gni b/chromium/tools/grit/grit_rule.gni
index 0e1dc9f9120..009181214ea 100644
--- a/chromium/tools/grit/grit_rule.gni
+++ b/chromium/tools/grit/grit_rule.gni
@@ -460,7 +460,12 @@ template("grit") {
# Since we generate a file, we need to be run before the targets that
# depend on us.
+ set_sources_assignment_filter([
+ "*.json",
+ "*.pak",
+ ])
sources = grit_outputs
+ set_sources_assignment_filter(sources_assignment_filter)
# Deps set on the template invocation will go on the action that runs
# grit above rather than this library. This target needs to depend on the
diff --git a/chromium/tools/grit/pak_util.py b/chromium/tools/grit/pak_util.py
index a1d473850a9..b71a20dee8f 100755
--- a/chromium/tools/grit/pak_util.py
+++ b/chromium/tools/grit/pak_util.py
@@ -137,13 +137,6 @@ def main():
help='The resource list path to write (default stdout)')
sub_parser.set_defaults(func=_ListMain)
- if len(sys.argv) == 1:
- parser.print_help()
- sys.exit(1)
- elif len(sys.argv) == 2 and sys.argv[1] in actions:
- parser.parse_args(sys.argv[1:] + ['-h'])
- sys.exit(1)
-
args = parser.parse_args()
args.func(args)
diff --git a/chromium/tools/gritsettings/resource_ids b/chromium/tools/gritsettings/resource_ids
index 33dc98925f5..2a7cb2dcb56 100644
--- a/chromium/tools/gritsettings/resource_ids
+++ b/chromium/tools/gritsettings/resource_ids
@@ -81,29 +81,36 @@
# START chrome/browser section.
"chrome/browser/browser_resources.grd": {
"includes": [11000],
- "structures": [12000],
+ "structures": [11900],
},
"chrome/browser/resources/chromeos/cellular_setup/cellular_setup_resources.grd": {
- "structures": [12040],
+ "structures": [11940],
},
"chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_resources.grd": {
- "structures": [12045],
+ "structures": [11945],
},
"chrome/browser/resources/component_extension_resources.grd": {
- "includes": [12100],
- "structures": [12350],
+ "includes": [12000],
+ "structures": [12250],
},
- "chrome/browser/resources/invalidations_resources.grd": {
- "includes": [12400],
+ "chrome/browser/resources/downloads/downloads_resources_vulcanized.grd": {
+ "includes": [12300],
},
- "chrome/browser/resources/local_ntp/local_ntp_resources.grd": {
- "includes": [12440],
+ "chrome/browser/resources/downloads/downloads_resources.grd": {
+ "includes": [12310],
+ "structures": [12320],
},
"chrome/browser/resources/extensions/extensions_resources_vulcanized.grd": {
- "includes": [12500],
+ "includes": [12400],
},
"chrome/browser/resources/extensions/extensions_resources.grd": {
- "structures": [12510],
+ "structures": [12410],
+ },
+ "chrome/browser/resources/invalidations_resources.grd": {
+ "includes": [12500],
+ },
+ "chrome/browser/resources/local_ntp/local_ntp_resources.grd": {
+ "includes": [12540],
},
"chrome/browser/resources/net_internals/net_internals_resources.grd": {
"includes": [12600],
@@ -145,6 +152,9 @@
"chrome/browser/vr/testapp/vr_testapp_resources.grd": {
"includes": [13990],
},
+ "chrome/browser/resources/kiosk_next_internal_resources.grd": {
+ "includes": [14040],
+ },
# END chrome/browser section.
# START chrome/ miscellaneous section.
@@ -195,6 +205,9 @@
"components/components_strings.grd": {
"messages": [15100],
},
+ "components/omnibox/resources/omnibox_resources.grd": {
+ "includes": [17190],
+ },
"components/policy/resources/policy_templates.grd": {
"structures": [17200],
},
@@ -309,6 +322,9 @@
"ash/components/resources/ash_components_resources.grd": {
"structures": [24350],
},
+ "ash/keyboard/ui/keyboard_resources.grd": {
+ "includes": [26800],
+ },
"ash/login/resources/login_resources.grd": {
"structures": [24360],
},
@@ -365,13 +381,17 @@
},
"net/base/net_resources.grd": {
- "includes": [24860],
+ "includes": [24890],
},
"remoting/resources/remoting_strings.grd": {
"messages": [24900],
},
+ "services/services_strings.grd": {
+ "messages": [25300],
+ },
+
"third_party/blink/public/blink_image_resources.grd": {
"structures": [25400],
},
@@ -404,9 +424,6 @@
"ui/file_manager/file_manager_resources.grd": {
"includes": [26550],
},
- "ui/keyboard/keyboard_resources.grd": {
- "includes": [26800],
- },
"ui/login/login_resources.grd": {
"includes": [26900],
},
diff --git a/chromium/tools/gritsettings/translation_expectations.pyl b/chromium/tools/gritsettings/translation_expectations.pyl
index 3a882524dd1..dbe60d3c631 100644
--- a/chromium/tools/gritsettings/translation_expectations.pyl
+++ b/chromium/tools/gritsettings/translation_expectations.pyl
@@ -27,6 +27,7 @@
"chrome/android/java/strings/android_chrome_strings.grd",
"chrome/android/features/vr/java/strings/android_chrome_vr_strings.grd",
"chrome/android/features/media_router/java/strings/android_chrome_media_router_strings.grd",
+ "chrome/android/features/keyboard_accessory/internal/java/strings/android_keyboard_accessory_strings.grd",
"chrome/android/features/autofill_assistant/java/strings/android_chrome_autofill_assistant_strings.grd",
"chrome/android/touchless/java/strings/touchless_strings.grd",
"chrome/android/webapk/strings/android_webapk_strings.grd",
@@ -36,6 +37,7 @@
"chrome/browser/resources/chromeos/camera/src/strings/camera_strings.grd",
"chrome/browser/resources/chromeos/chromevox/strings/chromevox_strings.grd",
"chrome/browser/resources/chromeos/select_to_speak/strings/select_to_speak_strings.grd",
+ "chrome/browser/resources/chromeos/switch_access/strings/switch_access_strings.grd",
"chrome/credential_provider/gaiacp/gaia_resources.grd",
"chromeos/chromeos_strings.grd",
"components/autofill/android/java/strings/autofill_strings.grd",
@@ -59,6 +61,7 @@
"ios/chrome/search_widget_extension/strings/ios_search_widget_extension_google_chrome_strings.grd",
"ios/chrome/share_extension/strings/ios_share_extension_strings.grd",
"remoting/resources/remoting_strings.grd",
+ "services/services_strings.grd",
"third_party/libaddressinput/chromium/address_input_strings.grd",
"ui/accessibility/extensions/strings/accessibility_extensions_strings.grd",
"ui/android/java/strings/android_ui_strings.grd",
@@ -79,6 +82,8 @@
"chromecast/app/resources/chromecast_settings.grd": "Not UI strings; localized separately",
"cloud_print/virtual_driver/win/install/virtual_driver_setup_resources.grd": "Separate release process",
"components/components_locale_settings.grd": "Not UI strings; localized separately",
+ "components/omnibox/resources/omnibox_resources.grd": "Not UI strings; localized separately",
+ "third_party/blink/renderer/devtools/front_end/langpacks/devtools_ui_strings.grd" : "Devtools UI strings that are optionally enabled by browser.",
"tools/grit/grit/testdata/buildinfo.grd": "Test data",
"tools/grit/grit/testdata/chrome/app/generated_resources.grd": "Test data",
"tools/grit/grit/testdata/substitute.grd": "Test data",
@@ -91,4 +96,11 @@
"ui/base/test/ui_base_test_resources.grd": "Test data",
"ui/strings/app_locale_settings.grd": "Not UI strings; localized separately",
},
+ # Internal grds that contain parts not available publicly and thus should
+ # not be checked by translation script.
+ "internal_grds": [
+ "chrome/browser/resources/kiosk_next_internal_resources.grd",
+ # Test grd that contains a part file that doesn't exist.
+ "tools/translation/testdata/internal.grd",
+ ],
}
diff --git a/chromium/tools/gypv8sh.py b/chromium/tools/gypv8sh.py
index e6d655f7f83..152b5e9accc 100755
--- a/chromium/tools/gypv8sh.py
+++ b/chromium/tools/gypv8sh.py
@@ -29,7 +29,7 @@ def main ():
parser = optparse.OptionParser()
parser.set_usage(
"%prog v8_shell mock.js test_api.js js2webui.js "
- "testtype inputfile inputrelfile cxxoutfile jsoutfile")
+ "testtype inputfile srcrootdir cxxoutfile jsoutfile")
parser.add_option('-v', '--verbose', action='store_true')
parser.add_option('-n', '--impotent', action='store_true',
help="don't execute; just print (as if verbose)")
@@ -43,9 +43,9 @@ def main ():
if len(args) != 9:
parser.error('all arguments are required.')
(v8_shell, mock_js, test_api, js2webui, test_type,
- inputfile, inputrelfile, cxxoutfile, jsoutfile) = args
+ inputfile, srcrootdir, cxxoutfile, jsoutfile) = args
cmd = [v8_shell]
- arguments = [js2webui, inputfile, inputrelfile, opts.deps_js,
+ arguments = [js2webui, inputfile, srcrootdir, opts.deps_js,
cxxoutfile, test_type]
cmd.extend(['-e', "arguments=" + json.dumps(arguments), mock_js,
test_api, js2webui])
diff --git a/chromium/tools/ipc_fuzzer/fuzzer/BUILD.gn b/chromium/tools/ipc_fuzzer/fuzzer/BUILD.gn
index a1363d177cd..d00e4111995 100644
--- a/chromium/tools/ipc_fuzzer/fuzzer/BUILD.gn
+++ b/chromium/tools/ipc_fuzzer/fuzzer/BUILD.gn
@@ -19,6 +19,7 @@ executable("ipc_fuzzer") {
"rand_util.h",
]
deps = [
+ "//base/util/type_safety",
"//tools/ipc_fuzzer/message_lib:ipc_message_lib",
]
public_deps = [
diff --git a/chromium/tools/ipc_fuzzer/message_lib/BUILD.gn b/chromium/tools/ipc_fuzzer/message_lib/BUILD.gn
index 6aa3ccb1c13..d352eca751c 100644
--- a/chromium/tools/ipc_fuzzer/message_lib/BUILD.gn
+++ b/chromium/tools/ipc_fuzzer/message_lib/BUILD.gn
@@ -33,7 +33,7 @@ static_library("ipc_message_lib") {
"//ui/accessibility:ax_enums_mojo",
]
if (is_win) {
- public_deps += [ "//chrome_elf:test_stubs" ]
+ public_deps += [ "//chrome/chrome_elf:test_stubs" ]
}
sources = [
"all_messages.h",
diff --git a/chromium/tools/json_schema_compiler/feature_compiler.py b/chromium/tools/json_schema_compiler/feature_compiler.py
index 1ee04780bc4..5ab30e9dd5a 100644
--- a/chromium/tools/json_schema_compiler/feature_compiler.py
+++ b/chromium/tools/json_schema_compiler/feature_compiler.py
@@ -179,6 +179,7 @@ FEATURE_GRAMMAR = (
'platform_app': 'Manifest::TYPE_PLATFORM_APP',
'shared_module': 'Manifest::TYPE_SHARED_MODULE',
'theme': 'Manifest::TYPE_THEME',
+ 'login_screen_extension': 'Manifest::TYPE_LOGIN_SCREEN_EXTENSION',
},
'allow_all': True
},
diff --git a/chromium/tools/json_schema_compiler/json_schema_api.gni b/chromium/tools/json_schema_compiler/json_schema_api.gni
index 07cded369a1..d1d6ea18153 100644
--- a/chromium/tools/json_schema_compiler/json_schema_api.gni
+++ b/chromium/tools/json_schema_compiler/json_schema_api.gni
@@ -106,9 +106,12 @@ template("generated_json_strings") {
}
# Compute the contents of the library/source set.
- lib_sources =
- invoker.sources + get_target_outputs(":$bundle_generator_schema_name")
+ lib_sources = get_target_outputs(":$bundle_generator_schema_name")
lib_deps = [ ":$bundle_generator_schema_name" ]
+ lib_public_deps = [
+ # For base::StringPiece.
+ "//base",
+ ]
lib_extra_configs = []
if (defined(invoker.configs)) {
lib_extra_configs += invoker.configs
@@ -121,7 +124,7 @@ template("generated_json_strings") {
static_library(target_name) {
sources = lib_sources
deps = lib_deps
- public_deps = []
+ public_deps = lib_public_deps
configs += lib_extra_configs
public_configs = [ ":$generated_config_name" ]
@@ -197,8 +200,7 @@ template("function_registration") {
}
# Compute the contents of the library/source set.
- lib_sources = invoker.sources +
- get_target_outputs(":$bundle_generator_registration_name")
+ lib_sources = get_target_outputs(":$bundle_generator_registration_name")
lib_deps = [ ":$bundle_generator_registration_name" ]
lib_extra_configs = []
if (defined(invoker.configs)) {
@@ -267,7 +269,7 @@ template("generated_types") {
}
# Compute the contents of the library/source set.
- lib_sources = invoker.sources + get_target_outputs(":$schema_generator_name")
+ lib_sources = get_target_outputs(":$schema_generator_name")
lib_public_deps = [ ":$schema_generator_name" ]
lib_deps = [
"//base",
diff --git a/chromium/tools/licenses.py b/chromium/tools/licenses.py
index 2c70d7c6b15..dbc8b367d63 100755
--- a/chromium/tools/licenses.py
+++ b/chromium/tools/licenses.py
@@ -534,14 +534,15 @@ def GetThirdPartyDepsFromGNDepsOutput(gn_deps, target_os):
relative_build_dep = os.path.relpath(
absolute_build_dep, _REPOSITORY_ROOT)
m = re.search(
- r'^((.+/)?third_party/[^/]+/)(.+/)?BUILD\.gn$', relative_build_dep)
+ r'^((.+[/\\])?third_party[/\\][^/\\]+[/\\])(.+[/\\])?BUILD\.gn$',
+ relative_build_dep)
if not m:
continue
third_party_path = m.group(1)
- if any(third_party_path.startswith(p + '/') for p in PRUNE_PATHS):
+ if any(third_party_path.startswith(p + os.sep) for p in PRUNE_PATHS):
continue
if (target_os == 'ios' and
- any(third_party_path.startswith(p + '/')
+ any(third_party_path.startswith(p + os.sep)
for p in KNOWN_NON_IOS_LIBRARIES)):
# Skip over files that are known not to be used on iOS.
continue
@@ -736,7 +737,7 @@ def GenerateLicenseFile(output_file, gn_out_dir, gn_target, target_os):
metadata = ParseDir(
directory, _REPOSITORY_ROOT, require_license_file=True)
content.append('-' * 20)
- content.append(directory.split('/')[-1])
+ content.append(directory.split(os.sep)[-1])
content.append('-' * 20)
license_file = metadata['License File']
if license_file and license_file != NOT_SHIPPED:
diff --git a/chromium/tools/linux/dump-static-initializers.py b/chromium/tools/linux/dump-static-initializers.py
index e937d681012..de271dd480e 100755
--- a/chromium/tools/linux/dump-static-initializers.py
+++ b/chromium/tools/linux/dump-static-initializers.py
@@ -18,7 +18,7 @@ A brief overview of static initialization:
4) at run time, on startup the binary runs all function pointers.
The functions in (1) all have mangled names of the form
- _GLOBAL__I_foobar.cc
+ _GLOBAL__I_foobar.cc or __cxx_global_var_initN
using objdump, we can disassemble those functions and dump all symbols that
they reference.
"""
@@ -104,16 +104,26 @@ def QualifyFilename(filename, symbol):
return candidate
-# Regex matching nm output for the symbols we're interested in.
+# Regex matching nm output for the symbols we're interested in. The two formats
+# we are interested in are _GLOBAL__sub_I_<filename> and _cxx_global_var_initN.
# See test_ParseNmLine for examples.
-nm_re = re.compile(r'(\S+) (\S+) t (?:_ZN12)?_GLOBAL__(?:sub_)?I_(.*)')
+nm_re = re.compile(
+ r'''(\S+)\s(\S+)\st\s # Symbol start address and size
+ (
+ (?:_ZN12)?_GLOBAL__(?:sub_)?I_ # Pattern with filename
+ |
+ __cxx_global_var_init\d* # Pattern without filename
+ )(.*) # capture the filename''',
+ re.X)
def ParseNmLine(line):
- """Given a line of nm output, parse static initializers as a
- (file, start, size) tuple."""
+ """Parse static initializers from a line of nm output.
+
+ Given a line of nm output, parse static initializers as a
+ (file, start, size, symbol) tuple."""
match = nm_re.match(line)
if match:
- addr, size, filename = match.groups()
- return (filename, int(addr, 16), int(size, 16))
+ addr, size, prefix, filename = match.groups()
+ return (filename, int(addr, 16), int(size, 16), prefix+filename)
def test_ParseNmLine():
@@ -121,12 +131,22 @@ def test_ParseNmLine():
parse = ParseNmLine(
'0000000001919920 0000000000000008 t '
'_ZN12_GLOBAL__I_safe_browsing_service.cc')
- assert parse == ('safe_browsing_service.cc', 26319136, 8), parse
+ assert parse == ('safe_browsing_service.cc', 26319136, 8,
+ '_ZN12_GLOBAL__I_safe_browsing_service.cc'), parse
parse = ParseNmLine(
'00000000026b9eb0 0000000000000024 t '
'_GLOBAL__sub_I_extension_specifics.pb.cc')
- assert parse == ('extension_specifics.pb.cc', 40607408, 36), parse
+ assert parse == ('extension_specifics.pb.cc', 40607408, 36,
+ '_GLOBAL__sub_I_extension_specifics.pb.cc'), parse
+
+ parse = ParseNmLine(
+ '0000000002e75a60 0000000000000016 t __cxx_global_var_init')
+ assert parse == ('', 48716384, 22, '__cxx_global_var_init'), parse
+
+ parse = ParseNmLine(
+ '0000000002e75a60 0000000000000016 t __cxx_global_var_init89')
+ assert parse == ('', 48716384, 22, '__cxx_global_var_init89'), parse
# Just always run the test; it is fast enough.
@@ -134,7 +154,10 @@ test_ParseNmLine()
def ParseNm(toolchain, binary):
- """Given a binary, yield static initializers as (file, start, size) tuples."""
+ """Yield static initializers for the given binary.
+
+ Given a binary, yield static initializers as (file, start, size, symbol)
+ tuples."""
nm = subprocess.Popen([toolchain + 'nm', '-S', binary],
stdout=subprocess.PIPE)
for line in nm.stdout:
@@ -147,7 +170,7 @@ def ParseNm(toolchain, binary):
# Example line:
# 12354ab: (disassembly, including <FunctionReference>)
disassembly_re = re.compile(r'^\s+[0-9a-f]+:.*<(\S+)>')
-def ExtractSymbolReferences(toolchain, binary, start, end):
+def ExtractSymbolReferences(toolchain, binary, start, end, symbol):
"""Given a span of addresses, returns symbol references from disassembly."""
cmd = [toolchain + 'objdump', binary, '--disassemble',
'--start-address=0x%x' % start, '--stop-address=0x%x' % end]
@@ -165,7 +188,7 @@ def ExtractSymbolReferences(toolchain, binary, start, end):
if ref.startswith('.LC') or ref.startswith('_DYNAMIC'):
# Ignore these, they are uninformative.
continue
- if re.match('_GLOBAL__(?:sub_)?I_', ref):
+ if re.match(symbol, ref):
# Probably a relative jump within this function.
continue
refs.add(ref)
@@ -196,7 +219,7 @@ def main():
files = ParseNm(opts.toolchain, binary)
if opts.diffable:
files = sorted(files)
- for filename, addr, size in files:
+ for filename, addr, size, symbol in files:
file_count += 1
ref_output = []
@@ -209,7 +232,7 @@ def main():
ref_output.append('[empty ctor, but it still has cost on gcc <4.6]')
else:
for ref in ExtractSymbolReferences(opts.toolchain, binary, addr,
- addr+size):
+ addr+size, symbol):
initializer_count += 1
ref = demangler.Demangle(ref)
diff --git a/chromium/tools/mb/mb.py b/chromium/tools/mb/mb.py
index c0848e510b3..b278a7ba825 100755
--- a/chromium/tools/mb/mb.py
+++ b/chromium/tools/mb/mb.py
@@ -352,13 +352,17 @@ class MetaBuildWrapper(object):
if not vals:
return 1
if self.args.build:
+ self.Print('')
ret = self.Build(self.args.target)
if ret:
return ret
+
+ self.Print('')
ret = self.RunGNIsolate(vals)
if ret:
return ret
+ self.Print('')
if self.args.swarmed:
return self._RunUnderSwarming(self.args.path, self.args.target)
else:
@@ -450,8 +454,24 @@ class MetaBuildWrapper(object):
'-I', isolate_server,
'--namespace', namespace,
]
- ret, out, _ = self.Run(cmd, force_verbose=False)
+
+ # Talking to the isolateserver may fail because we're not logged in.
+ # We trap the command explicitly and rewrite the error output so that
+ # the error message is actually correct for a Chromium check out.
+ self.PrintCmd(cmd, env=None)
+ ret, out, err = self.Run(cmd, force_verbose=False)
if ret:
+ self.Print(' -> returned %d' % ret)
+ if out:
+ self.Print(out, end='')
+ if err:
+ # The swarming client will return an exit code of 2 (via
+ # argparse.ArgumentParser.error()) and print a message to indicate
+ # that auth failed, so we have to parse the message to check.
+ if (ret == 2 and 'Please login to' in err):
+ err = err.replace(' auth.py', ' tools/swarming_client/auth.py')
+ self.Print(err, end='', file=sys.stderr)
+
return ret
isolated_hash = out.splitlines()[0].split()[0]
@@ -467,6 +487,7 @@ class MetaBuildWrapper(object):
self._AddBaseSoftware(cmd)
if self.args.extra_args:
cmd += ['--'] + self.args.extra_args
+ self.Print('')
ret, _, _ = self.Run(cmd, force_verbose=True, buffer_output=False)
return ret
@@ -1500,7 +1521,7 @@ class MetaBuildWrapper(object):
if self.args.jobs:
ninja_cmd.extend(['-j', '%d' % self.args.jobs])
ninja_cmd.append(target)
- ret, _, _ = self.Run(ninja_cmd, force_verbose=False, buffer_output=False)
+ ret, _, _ = self.Run(ninja_cmd, buffer_output=False)
return ret
def Run(self, cmd, env=None, force_verbose=True, buffer_output=True):
diff --git a/chromium/tools/mb/mb_config.pyl b/chromium/tools/mb/mb_config.pyl
index 63b39c8eb90..b68e821196e 100644
--- a/chromium/tools/mb/mb_config.pyl
+++ b/chromium/tools/mb/mb_config.pyl
@@ -24,33 +24,22 @@
# generated publicly advertised non-Official builds which are not allowed
# to have proprietary codecs enabled.
'chromium': {
- 'android-rel': 'android_without_codecs_release_bot_minimal_symbols',
- 'android-dbg': 'android_without_codecs_debug_bot_minimal_symbols',
- 'linux-rel': 'release_bot',
- 'linux-dbg': 'debug_bot',
- 'mac-rel': 'release_bot_mac_strip',
- 'mac-dbg': 'debug_bot',
- 'win32-rel': 'release_bot_x86_minimal_symbols_enable_archive_compression',
- 'win32-dbg': 'debug_bot_x86_minimal_symbols',
- 'win-rel': 'release_bot_minimal_symbols_enable_archive_compression',
- 'win-dbg': 'debug_bot_minimal_symbols',
+ 'android-archive-rel': 'android_without_codecs_release_bot_minimal_symbols',
+ 'android-archive-dbg': 'android_without_codecs_debug_bot',
+ 'linux-archive-rel': 'release_bot_minimal_symbols',
+ 'linux-archive-dbg': 'debug_bot',
+ 'mac-archive-rel': 'release_bot_mac_strip_minimal_symbols',
+ 'mac-archive-dbg': 'debug_bot',
+ 'win32-archive-rel': 'release_bot_x86_minimal_symbols_enable_archive_compression',
+ 'win32-archive-dbg': 'debug_bot_x86',
+ 'win-archive-rel': 'release_bot_minimal_symbols_enable_archive_compression',
+ 'win-archive-dbg': 'debug_bot',
},
'chromium.android': {
- 'Android ASAN (dbg)': 'android_clang_asan_debug_bot_minimal_symbols',
- 'Android Cronet ARM64 Builder': 'android_cronet_release_bot_minimal_symbols_arm64',
- 'Android Cronet ARM64 Builder (dbg)': 'android_cronet_debug_static_bot_arm64',
- 'Android Cronet Builder': 'android_cronet_release_bot_minimal_symbols_arm_no_neon',
- 'Android Cronet Builder (dbg)': 'android_cronet_debug_static_bot_arm_no_neon',
- 'Android Cronet Builder Asan': 'android_cronet_release_bot_minimal_symbols_arm_no_neon_clang_asan',
- 'Android Cronet KitKat Builder': 'android_cronet_release_bot_minimal_symbols_arm_no_neon',
- 'Android Cronet Lollipop Builder': 'android_cronet_release_bot_minimal_symbols_arm_no_neon',
- 'Android Cronet Marshmallow 64bit Builder': 'android_cronet_release_bot_minimal_symbols_arm64',
- 'Android Cronet Marshmallow 64bit Perf': 'android_cronet_release_bot_minimal_symbols_arm64',
- 'Android Cronet x86 Builder': 'android_cronet_release_bot_minimal_symbols_x86',
- 'Android Cronet x86 Builder (dbg)': 'android_cronet_debug_static_bot_x86',
- 'Android arm Builder (dbg)': 'android_debug_static_bot',
- 'Android arm64 Builder (dbg)': 'android_debug_static_bot_arm64',
+ 'Android ASAN (dbg)': 'android_clang_asan_debug_bot',
+ 'Android arm Builder (dbg)': 'android_webview_google_debug_static_bot',
+ 'Android arm64 Builder (dbg)': 'android_webview_google_debug_static_bot_arm64',
'Android x64 Builder (dbg)': 'android_debug_static_bot_x64',
'Android x86 Builder (dbg)': 'android_debug_static_bot_x86',
'Cast Android (dbg)': 'android_cast_debug_static_bot',
@@ -62,6 +51,7 @@
'android-cronet-arm64-dbg': 'android_cronet_debug_static_bot_arm64',
'android-cronet-arm64-rel': 'android_cronet_release_bot_minimal_symbols_arm64',
'android-cronet-asan-arm-rel': 'android_cronet_release_bot_minimal_symbols_arm_no_neon_clang_asan',
+ 'android-cronet-marshmallow-arm64-perf-rel': 'android_cronet_release_bot_minimal_symbols_arm64',
'android-cronet-x86-dbg': 'android_cronet_debug_static_bot_x86',
'android-cronet-x86-rel': 'android_cronet_release_bot_minimal_symbols_x86',
'android-incremental-dbg': 'android_incremental_debug_bot',
@@ -74,9 +64,6 @@
},
'chromium.android.fyi': {
- 'Android Cronet Builder (dbg)': 'android_cronet_debug_static_bot_arm_no_neon',
- 'Android Cronet Builder Asan': 'android_cronet_release_bot_minimal_symbols_arm_no_neon_clang_asan',
- 'Android Cronet KitKat Builder': 'android_cronet_release_bot_minimal_symbols_arm_no_neon',
'Memory Infra Tester': 'android_release_thumb_bot',
'NDK Next arm Builder':
'android_ndk_next_release_bot_minimal_symbols',
@@ -93,7 +80,7 @@
'chromium.chrome': {
'chromeos-amd64-generic-google-rel': 'official_cros_chrome_sdk',
- 'chromeos-betty-google-rel': 'official_cros_chrome_sdk',
+ 'chromeos-betty-google-rel': 'official_cros_chrome_sdk_headless_ozone',
'linux-chromeos-google-rel': 'official_goma_chromeos_minimal_symbols',
'linux-google-rel': 'official_goma',
'mac-google-rel': 'official_goma',
@@ -113,7 +100,7 @@
'chromeos-amd64-generic-asan-rel': 'cros_chrome_sdk_asan',
'chromeos-amd64-generic-cfi-thin-lto-rel': 'cros_chrome_sdk_headless_ozone_cfi_thin_lto',
'chromeos-amd64-generic-rel': 'cros_chrome_sdk_headless_ozone',
- 'chromeos-daisy-rel': 'cros_chrome_sdk',
+ 'chromeos-arm-generic-rel': 'cros_chrome_sdk',
'chromeos-kevin-rel': 'cros_chrome_sdk_headless_ozone',
'linux-chromeos-rel': 'chromeos_with_codecs_release_bot',
'linux-chromeos-dbg': 'chromeos_with_codecs_debug_bot',
@@ -152,7 +139,7 @@
'ToTWin': 'clang_tot_official_minimal_symbols_static_release_x86',
'ToTWin(dbg)': 'clang_tot_shared_debug_x86',
'ToTWin(dll)': 'clang_tot_minimal_symbols_shared_release_x86_dcheck',
- 'ToTWinOfficial': 'clang_tot_win_official_full_symbols_static_x86',
+ 'ToTWinOfficial': 'clang_tot_win_official_full_symbols_thin_lto_static_x86',
'ToTWin64': 'clang_tot_official_minimal_symbols_static_release',
'ToTWin64(dbg)': 'clang_tot_shared_debug',
'ToTWin64(dll)': 'clang_tot_shared_release_dcheck',
@@ -224,6 +211,7 @@
'chromeos-kevin-rel-hw-tests': 'cros_chrome_sdk_headless_ozone',
'chromeos-vm-code-coverage': 'cros_chrome_sdk_headless_ozone_coverage',
'linux-chromeos-code-coverage': 'chromeos_with_codecs_release_bot_coverage',
+ 'linux-chromeos-oobe-code-coverage': 'chromeos_with_codecs_release_bot_coverage',
'Linux Builder Goma Canary': 'release_bot',
'Linux Builder Goma Latest Client': 'release_bot',
@@ -239,19 +227,19 @@
'Mac Builder (dbg) Goma Canary': 'debug_bot',
'Mac Builder (dbg) Goma Latest Client (clobber)': 'debug_bot',
'Mac Builder (dbg) Goma Latest Client': 'debug_bot',
- 'Mac Builder Goma Canary': 'gpu_tests_release_bot',
- 'Mac Builder Goma Latest Client': 'gpu_tests_release_bot',
- 'Mac Goma Canary (clobber)': 'release_bot_mac_strip',
- 'Mac Goma Canary LocalOutputCache': 'release_bot_mac_strip',
- 'Mac Goma Latest Client (clobber)': 'release_bot_mac_strip',
- 'Mac Goma Latest Client LocalOutputCache': 'release_bot_mac_strip',
-
- 'Win7 Builder (dbg) Goma Canary': 'debug_trybot_x86_minimal_symbols',
- 'Win7 Builder (dbg) Goma Latest Client': 'debug_trybot_x86_minimal_symbols',
+ 'Mac Builder Goma Canary': 'gpu_tests_release_bot_minimal_symbols',
+ 'Mac Builder Goma Latest Client': 'gpu_tests_release_bot_minimal_symbols',
+ 'Mac Goma Canary (clobber)': 'release_bot_mac_strip_minimal_symbols',
+ 'Mac Goma Canary LocalOutputCache': 'release_bot_mac_strip_minimal_symbols',
+ 'Mac Goma Latest Client (clobber)': 'release_bot_mac_strip_minimal_symbols',
+ 'Mac Goma Latest Client LocalOutputCache': 'release_bot_mac_strip_minimal_symbols',
+
+ 'Win7 Builder (dbg) Goma Canary': 'debug_trybot_x86',
+ 'Win7 Builder (dbg) Goma Latest Client': 'debug_trybot_x86',
'Win7 Builder Goma Canary': 'release_bot_x86_minimal_symbols',
'Win7 Builder Goma Latest Client': 'release_bot_x86_minimal_symbols',
- 'Win Builder (dbg) Goma Canary': 'debug_bot_x86_minimal_symbols',
- 'Win Builder (dbg) Goma Latest Client': 'debug_bot_x86_minimal_symbols',
+ 'Win Builder (dbg) Goma Canary': 'debug_bot_x86',
+ 'Win Builder (dbg) Goma Latest Client': 'debug_bot_x86',
'Win Builder Goma Canary': 'release_bot_x86_minimal_symbols',
'Win Builder Goma Latest Client': 'release_bot_x86_minimal_symbols',
'Win cl.exe Goma Canary LocalOutputCache': 'release_bot_x86_minimal_symbols_no_clang',
@@ -270,9 +258,9 @@
'ios-simulator-code-coverage': 'clang_code_coverage_ios',
'ios-simulator': 'ios_error',
- 'Jumbo Linux x64': 'jumbo_large_chunks_release_bot_minimal_symbols',
- 'Jumbo Mac': 'jumbo_release_bot_minimal_symbols',
- 'Jumbo Win x64': 'jumbo_release_bot_minimal_symbols',
+ 'Jumbo Linux x64': 'jumbo_large_chunks_release_bot_compile_only',
+ 'Jumbo Mac': 'jumbo_release_bot_compile_only',
+ 'Jumbo Win x64': 'jumbo_release_bot_compile_only',
'Libfuzzer Upload Chrome OS ASan': 'libfuzzer_chromeos_asan_release_bot',
'Libfuzzer Upload Linux ASan': 'libfuzzer_asan_release_bot',
'Libfuzzer Upload Linux ASan Debug': 'libfuzzer_asan_debug_bot',
@@ -291,7 +279,7 @@
'linux-blink-heap-verification': 'release_bot_enable_blink_heap_verification_dcheck_always_on',
'linux-chromium-tests-staging-builder': 'release_bot',
'linux-code-coverage': 'clang_code_coverage',
- 'Mac deterministic': 'release_bot_mac_strip',
+ 'Mac deterministic': 'release_bot_mac_strip_minimal_symbols',
'Mac deterministic (dbg)': 'debug_bot',
'mac-autofill-captured-sites-rel': 'release_bot',
@@ -329,11 +317,16 @@
'Chromium Mac Goma RBE Staging (clobber)': 'release_bot',
'Chromium Mac Goma RBE Staging': 'release_bot',
'Chromium Mac Goma RBE Staging (dbg)': 'debug_bot',
+ 'Chromium Mac Goma RBE Prod': 'release_bot',
# Same as CrWinGomaStaging.
'Chromium Win Goma RBE ToT': 'release_bot_x86_minimal_symbols',
'Chromium Win Goma RBE Staging': 'release_bot_x86_minimal_symbols',
'Chromium Win Goma RBE Staging (clobber)': 'release_bot_x86_minimal_symbols',
+ 'Chromium Win Goma RBE Prod': 'release_bot_x86_minimal_symbols',
+ 'Chromium Win Goma RBE Prod (clobber)': 'release_bot_x86_minimal_symbols',
+ 'Chromium Win Goma RBE Prod (dbg)': 'debug_bot_x86',
+ 'Chromium Win Goma RBE Prod (dbg) (clobber)': 'debug_bot_x86',
'Chromium Android ARM 32-bit Goma RBE ToT': 'android_release_bot_minimal_symbols',
'Chromium Android ARM 32-bit Goma RBE ToT (ATS)': 'android_release_bot_minimal_symbols',
@@ -343,21 +336,6 @@
'Chromium Android ARM 32-bit Goma RBE Prod (dbg)': 'android_debug_static_bot',
'Chromium Android ARM 32-bit Goma RBE Prod (dbg) (clobber)': 'android_debug_static_bot',
- # For RBE load testing.
- 'Chromium Linux Goma RBE LoadTest': 'release_bot',
- 'Chromium Linux Goma RBE LoadTest (debug)': 'release_bot',
- 'Chromium Linux Goma RBE LoadTest (clobber)': 'release_bot',
- 'Chromium Linux Goma RBE LoadTest (clobber) (debug)': 'release_bot',
- 'Chromium Linux Goma RBE LoadTest (ATS)': 'release_bot',
- 'Chromium Linux Goma RBE LoadTest (ATS) (debug)': 'release_bot',
- 'Chromium Linux Goma RBE LoadTest (ATS) (clobber)': 'release_bot',
- 'Chromium Linux Goma RBE LoadTest (ATS) (clobber) (debug)': 'release_bot',
-
- 'Chromium Android ARM 32-bit Goma RBE LoadTest': 'release_bot',
- 'Chromium Android ARM 32-bit Goma RBE LoadTest (debug)': 'release_bot',
- 'Chromium Android ARM 32-bit Goma RBE LoadTest (clobber)': 'release_bot',
- 'Chromium Android ARM 32-bit Goma RBE LoadTest (clobber) (debug)': 'release_bot',
-
# RBE FYI
'Cast Linux (Goma RBE FYI)': 'cast_release_bot',
'chromeos-amd64-generic-rel (Goma RBE FYI)': 'cros_chrome_sdk_headless_ozone',
@@ -373,8 +351,8 @@
'GPU Mac Builder (dbg)': 'gpu_tests_debug_trybot',
'GPU Linux Builder': 'gpu_tests_release_trybot',
'GPU Linux Builder (dbg)': 'gpu_tests_debug_trybot',
- 'GPU Win Builder': 'gpu_tests_release_trybot_x86_minimal_symbols_resource_whitelisting',
- 'GPU Win Builder (dbg)': 'gpu_tests_debug_trybot_x86_minimal_symbols',
+ 'GPU Win Builder': 'gpu_tests_release_trybot_x86_resource_whitelisting',
+ 'GPU Win Builder (dbg)': 'gpu_tests_debug_trybot_x86',
'Android Release (Nexus 5X)': 'gpu_tests_android_release_trybot_arm64',
},
@@ -409,6 +387,7 @@
'GPU FYI Win x64 Builder': 'gpu_fyi_tests_release_trybot',
'GPU FYI Win x64 Builder (dbg)': 'gpu_fyi_tests_debug_trybot',
'GPU FYI Win x64 dEQP Builder': 'deqp_release_trybot',
+ 'GPU FYI XR Win Builder': 'gpu_fyi_tests_release_trybot_x86',
'Linux FYI GPU TSAN Release': 'gpu_fyi_tests_release_trybot_tsan',
'Mac FYI GPU ASAN Release': 'gpu_fyi_tests_release_trybot_asan',
'Optional Android Release (Nexus 5X)': 'gpu_tests_android_release_trybot_arm64',
@@ -429,7 +408,7 @@
'local': 'debug_bot_local_build',
'goma': 'debug_bot',
},
- 'Deterministic Linux': 'release_bot',
+ 'Deterministic Linux': 'release_bot_minimal_symbols',
'Fuchsia ARM64': 'release_bot_fuchsia_arm64',
'Fuchsia x64': 'release_bot_fuchsia',
'Leak Detection Linux': 'release_bot',
@@ -443,7 +422,6 @@
# for the jumbo part.
'linux-jumbo-rel': 'gpu_tests_release_bot_jumbo_no_symbols_use_dummy_lastchange',
'linux-ozone-rel': 'ozone_linux_release_bot',
- 'linux-xenial-rel': 'release_bot',
},
'chromium.lkgr': {
@@ -469,7 +447,7 @@
'chromium.mac': {
'Mac Builder': 'gpu_tests_release_bot_minimal_symbols',
'Mac Builder (dbg)': 'gpu_tests_debug_bot',
- 'mac-jumbo-rel': 'jumbo_large_chunks_release_bot_minimal_symbols',
+ 'mac-jumbo-rel': 'jumbo_large_chunks_release_bot_compile_only',
'ios-device': 'ios_error',
'ios-device-xcode-clang': 'ios_error',
'ios-simulator': 'ios_error',
@@ -488,9 +466,10 @@
'Linux MSan Builder': 'msan_release_bot',
'Linux TSan Builder': 'tsan_disable_nacl_release_bot',
'Mac ASan 64 Builder': 'asan_minimal_symbols_disable_nacl_release_bot_dcheck_always_on',
- 'WebKit Linux Trusty ASAN': 'asan_lsan_release_bot',
- 'WebKit Linux Trusty Leak': 'release_bot',
- 'WebKit Linux Trusty MSAN': 'msan_release_bot',
+ 'WebKit Linux ASAN': 'asan_lsan_release_bot',
+ 'WebKit Linux Leak': 'release_bot',
+ 'WebKit Linux MSAN': 'msan_release_bot',
+ 'android-asan': 'android_clang_asan_debug_bot_arm64',
'win-asan': 'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release',
},
@@ -506,16 +485,17 @@
},
'chromium.perf.fyi': {
- 'android-cfi-builder-perf-fyi': 'official_goma_minimal_symbols_android_thin_lto_opt',
+ 'android-cfi-builder-perf-fyi': 'official_goma_minimal_symbols_android_thin_lto_opt',
'android_arm64-cfi-builder-perf-fyi': 'official_goma_minimal_symbols_android_thin_lto_opt_arm64',
+ 'chromeos-kevin-builder-perf-fyi': 'official_cros_chrome_sdk',
},
'chromium.swarm': {
'Android N5 Swarm': 'android_release_bot_minimal_symbols',
'Android N5X Swarm': 'android_release_bot_minimal_symbols_arm64',
'ChromeOS Swarm': 'cros_chrome_sdk',
- 'Linux Swarm': 'release_bot',
- 'Mac Swarm': 'release_bot_mac_strip',
+ 'Linux Swarm': 'release_bot_minimal_symbols',
+ 'Mac Swarm': 'release_bot_mac_strip_minimal_symbols',
'Windows Swarm': 'release_bot_minimal_symbols',
},
@@ -552,7 +532,7 @@
'V8-Blink Linux 64 (dbg)': 'release_bot_v8_debug',
'V8-Blink Mac': 'release_bot',
'V8-Blink Win': 'release_bot_x86_minimal_symbols',
- 'Win V8 FYI Release (NVIDIA)': 'gpu_tests_release_trybot_x86_minimal_symbols_resource_whitelisting',
+ 'Win V8 FYI Release (NVIDIA)': 'gpu_tests_release_trybot_x86_resource_whitelisting',
},
# TODO(crbug.com/818301): This master is going away.
@@ -581,16 +561,16 @@
'WebRTC Chromium FYI Mac Builder': 'gpu_tests_release_bot',
'WebRTC Chromium FYI Mac Builder (dbg)': 'debug_bot',
'WebRTC Chromium FYI Win Builder': 'release_bot_x86_minimal_symbols_no_com_init_hooks_with_codecs',
- 'WebRTC Chromium FYI Win Builder (dbg)': 'debug_bot_x86_minimal_symbols_no_com_init_hooks_with_codecs',
+ 'WebRTC Chromium FYI Win Builder (dbg)': 'debug_bot_x86_no_com_init_hooks_with_codecs',
},
'chromium.win': {
# Windows bots take too long to link w/ full symbols and time out.
'Win Builder': 'gpu_tests_release_bot_x86_minimal_symbols',
- 'Win Builder (dbg)': 'gpu_tests_debug_bot_x86_minimal_symbols',
- 'win-jumbo-rel': 'jumbo_large_chunks_release_bot_minimal_symbols',
+ 'Win Builder (dbg)': 'gpu_tests_debug_bot_x86',
+ 'win-jumbo-rel': 'jumbo_large_chunks_release_bot_compile_only',
'Win x64 Builder': 'gpu_tests_release_bot_minimal_symbols',
- 'Win x64 Builder (dbg)': 'gpu_tests_debug_bot_minimal_symbols',
+ 'Win x64 Builder (dbg)': 'gpu_tests_debug_bot',
'Windows deterministic': 'release_bot_x86_minimal_symbols',
},
@@ -598,7 +578,7 @@
'Linux Canary': 'debug_bot',
'Linux Dev': 'debug_bot',
'Mac Dev': 'debug_bot',
- 'Windows Dev': 'debug_bot_minimal_symbols',
+ 'Windows Dev': 'debug_bot',
},
# Manually triggered internal builders running on LUCI.
@@ -625,8 +605,11 @@
},
'tryserver.chromium.android': {
+ # TODO(crbug/597596): Switch this back to debug_trybot when cronet's
+ # shared library loading is fixed.
+ 'android-cronet-arm-dbg': 'android_cronet_debug_static_bot_arm_no_neon',
'android-kitkat-arm-rel': 'android_release_trybot',
- 'android-marshmallow-arm64-rel': 'gpu_tests_android_release_trybot_arm64_no_symbols',
+ 'android-marshmallow-arm64-rel': 'gpu_tests_android_release_trybot_arm64_resource_whitelisting',
'android-oreo-arm64-cts-networkservice-dbg': 'android_debug_trybot_arm64',
'android_archive_rel_ng': 'android_release_trybot',
'android_arm64_dbg_recipe': 'android_debug_trybot_compile_only_arm64',
@@ -640,8 +623,6 @@
'android_coverage': 'android_debug_trybot_java_coverage',
'android_cronet': 'android_cronet_release_trybot_arm_no_neon',
- # TODO(crbug/597596): Switch this back to debug_trybot when cronet's
- # shared library loading is fixed.
'android_cronet_tester': 'android_cronet_debug_static_bot_arm_no_neon',
'android_mojo': 'android_release_trybot_arm64',
@@ -649,27 +630,26 @@
'android_optional_gpu_tests_rel': 'gpu_tests_android_release_trybot_arm64',
'android_unswarmed_pixel_aosp': 'android_debug_trybot_arm64',
'android-deterministic-dbg': 'android_debug_trybot',
- 'android-deterministic-rel': 'android_without_codecs_release_trybot_minimal_symbols',
+ 'android-deterministic-rel': 'android_without_codecs_release_trybot',
'cast_shell_android': 'android_cast_debug_static_bot_compile_only',
- 'gpu-manual-try-android-l-nexus-5-32': 'gpu_tests_android_release_trybot',
- 'gpu-manual-try-android-l-nexus-6-32': 'gpu_tests_android_release_trybot',
- 'gpu-manual-try-android-m-nexus-6p-64': 'gpu_tests_android_release_trybot_arm64',
- 'gpu-manual-try-android-m-nexus-9-64': 'gpu_tests_android_release_trybot_arm64',
- 'gpu-manual-try-android-n-nvidia-shield-tv-64': 'gpu_tests_android_release_trybot_arm64',
- 'gpu-manual-try-android-p-pixel-2-32': 'gpu_tests_android_release_trybot',
- 'gpu-manual-try-android-p-pixel-2-32-vk': 'gpu_tests_android_vulkan_release_trybot',
- 'gpu-manual-try-android-p-pixel-2-32-deqp-vk': 'deqp_android_vulkan_release_trybot',
- 'gpu-manual-try-android-p-pixel-2-64-vk': 'gpu_tests_android_vulkan_release_trybot_arm64',
- 'gpu-manual-try-android-p-pixel-2-64-deqp-vk': 'deqp_android_vulkan_release_trybot_arm64',
- 'gpu-manual-try-android-p-pixel-xl-32-vk': 'gpu_tests_android_vulkan_release_trybot',
- 'gpu-manual-try-android-p-pixel-xl-32-deqp-vk': 'deqp_android_vulkan_release_trybot',
- 'gpu-manual-try-android-p-pixel-xl-64-vk': 'gpu_tests_android_vulkan_release_trybot_arm64',
- 'gpu-manual-try-android-p-pixel-xl-64-deqp-vk': 'deqp_android_vulkan_release_trybot_arm64',
+ 'gpu-fyi-try-android-l-nexus-5-32': 'gpu_tests_android_release_trybot',
+ 'gpu-fyi-try-android-l-nexus-6-32': 'gpu_tests_android_release_trybot',
+ 'gpu-fyi-try-android-m-nexus-6p-64': 'gpu_tests_android_release_trybot_arm64',
+ 'gpu-fyi-try-android-m-nexus-9-64': 'gpu_tests_android_release_trybot_arm64',
+ 'gpu-fyi-try-android-n-nvidia-shield-tv-64': 'gpu_tests_android_release_trybot_arm64',
+ 'gpu-fyi-try-android-p-pixel-2-32': 'gpu_tests_android_release_trybot',
+ 'gpu-fyi-try-android-p-pixel-2-32-vk': 'gpu_tests_android_vulkan_release_trybot',
+ 'gpu-fyi-try-android-p-pixel-2-32-deqp-vk': 'deqp_android_vulkan_release_trybot',
+ 'gpu-fyi-try-android-p-pixel-2-64-vk': 'gpu_tests_android_vulkan_release_trybot_arm64',
+ 'gpu-fyi-try-android-p-pixel-2-64-deqp-vk': 'deqp_android_vulkan_release_trybot_arm64',
+ 'gpu-fyi-try-android-p-pixel-xl-32-vk': 'gpu_tests_android_vulkan_release_trybot',
+ 'gpu-fyi-try-android-p-pixel-xl-32-deqp-vk': 'deqp_android_vulkan_release_trybot',
+ 'gpu-fyi-try-android-p-pixel-xl-64-vk': 'gpu_tests_android_vulkan_release_trybot_arm64',
+ 'gpu-fyi-try-android-p-pixel-xl-64-deqp-vk': 'deqp_android_vulkan_release_trybot_arm64',
'linux_android_dbg_ng': 'android_debug_trybot',
'try-nougat-phone-tester': 'android_debug_trybot_arm64',
},
- # TODO(crbug/786044): Remove non-compile debug configs when migrated.
'tryserver.chromium.angle': {
'android_angle_rel_ng': 'gpu_tests_android_release_trybot_arm64',
'android_angle_vk32_rel_ng': 'gpu_tests_android_vulkan_release_trybot',
@@ -677,21 +657,17 @@
'android_angle_deqp_rel_ng': 'deqp_android_release_trybot_arm64',
'android_angle_vk32_deqp_rel_ng': 'deqp_android_vulkan_release_trybot',
'android_angle_vk64_deqp_rel_ng': 'deqp_android_vulkan_release_trybot_arm64',
+ 'fuchsia-angle-rel': 'gpu_fyi_tests_release_trybot_fuchsia',
'linux-angle-rel': 'gpu_fyi_tests_release_trybot',
'linux_angle_ozone_rel_ng': 'gpu_fyi_tests_ozone_linux_system_gbm_libdrm_release_trybot',
- 'linux_angle_dbg_ng': 'gpu_fyi_tests_debug_trybot',
'linux_angle_deqp_rel_ng': 'deqp_release_trybot',
'mac-angle-rel': 'gpu_fyi_tests_release_trybot',
- 'mac_angle_dbg_ng': 'gpu_fyi_tests_debug_trybot',
'win-angle-rel': 'gpu_fyi_tests_release_trybot_x86',
- 'win_angle_dbg_ng': 'gpu_fyi_tests_debug_trybot_x86',
'win_angle_deqp_rel_ng': 'deqp_release_trybot_x86',
- 'win_angle_x64_dbg_ng': 'gpu_fyi_tests_debug_trybot',
- 'win_angle_x64_deqp_rel_ng': 'deqp_release_trybot',
- 'win_angle_x64_rel_ng': 'gpu_fyi_tests_release_trybot',
},
'tryserver.chromium.chrome': {
+ 'chromeos-betty-chrome': 'official_cros_chrome_sdk_headless_ozone',
'linux-chromeos-chrome': 'official_goma_chromeos_minimal_symbols',
},
@@ -700,7 +676,7 @@
# and two kevin bots when the PFQ has it enabled.
'chromeos-amd64-generic-cfi-thin-lto-rel': 'cros_chrome_sdk_headless_ozone_cfi_thin_lto',
'chromeos-amd64-generic-rel': 'cros_chrome_sdk_headless_ozone',
- 'chromeos-daisy-rel': 'cros_chrome_sdk_dchecks_always_on',
+ 'chromeos-arm-generic-rel': 'cros_chrome_sdk_dchecks_always_on',
'chromeos-kevin-compile-rel': 'cros_chrome_sdk_headless_ozone',
'chromeos-kevin-rel': 'cros_chrome_sdk_headless_ozone',
'linux-chromeos-rel': 'chromeos_with_codecs_release_trybot',
@@ -730,30 +706,28 @@
'fuchsia-fyi-x64-rel': 'release_trybot_fuchsia',
'fuchsia_x64': 'release_trybot_fuchsia',
'fuchsia-x64-cast': 'release_trybot_fuchsia_cast',
- 'gpu-manual-try-linux-amd-rel': 'gpu_fyi_tests_release_trybot',
- 'gpu-manual-try-linux-intel-dqp': 'deqp_release_trybot',
- 'gpu-manual-try-linux-intel-exp': 'gpu_fyi_tests_release_trybot',
- 'gpu-manual-try-linux-intel-ozn': 'gpu_fyi_tests_ozone_linux_system_gbm_libdrm_release_trybot',
- 'gpu-manual-try-linux-intel-rel': 'gpu_fyi_tests_release_trybot',
- 'gpu-manual-try-linux-nvidia-dbg': 'gpu_fyi_tests_debug_trybot',
- 'gpu-manual-try-linux-nvidia-dqp': 'deqp_release_trybot',
- 'gpu-manual-try-linux-nvidia-exp': 'gpu_fyi_tests_release_trybot',
- 'gpu-manual-try-linux-nvidia-rel': 'gpu_fyi_tests_release_trybot',
- 'gpu-manual-try-linux-nvidia-tsn': 'gpu_fyi_tests_release_trybot_tsan',
+ 'gpu-fyi-try-linux-intel-dqp': 'deqp_release_trybot',
+ 'gpu-fyi-try-linux-intel-exp': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-linux-intel-rel': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-linux-nvidia-dbg': 'gpu_fyi_tests_debug_trybot',
+ 'gpu-fyi-try-linux-nvidia-dqp': 'deqp_release_trybot',
+ 'gpu-fyi-try-linux-nvidia-exp': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-linux-nvidia-rel': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-linux-nvidia-tsn': 'gpu_fyi_tests_release_trybot_tsan',
+ 'gpu-try-linux-nvidia-dbg': 'gpu_tests_debug_trybot',
'layout_test_leak_detection': 'release_trybot',
'leak_detection_linux': 'release_trybot',
'linux-blink-heap-concurrent-marking-tsan-rel': 'release_trybot_tsan',
'linux-blink-heap-verification-try': 'release_trybot_enable_blink_heap_verification',
- 'linux-coverage-rel': 'clang_code_coverage_trybot',
+ 'linux-coverage-rel': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage',
'linux-dcheck-off-rel': 'release_trybot_dcheck_off',
'linux-goma-rbe-staging-rel': 'gpu_tests_release_trybot_no_symbols',
'linux-gcc-rel': 'release_bot_x86_minimal_symbols_no_clang_cxx11',
- 'linux-jumbo-rel': 'jumbo_large_chunks_release_bot_minimal_symbols',
+ 'linux-jumbo-rel': 'jumbo_large_chunks_release_bot_compile_only',
'linux-libfuzzer-asan-rel': 'libfuzzer_asan_release_trybot',
'linux-ozone-rel': 'ozone_linux_release_trybot',
'linux-rel': 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange',
'linux-trusty-webkit-msan-rel': 'msan_release_bot',
- 'linux-xenial-rel': 'release_trybot',
'linux_arm': 'release_trybot_arm',
'linux_chromium_archive_rel_ng': 'release_bot',
'linux_chromium_asan_rel_ng': 'asan_lsan_release_trybot',
@@ -789,17 +763,32 @@
},
'tryserver.chromium.mac': {
+ 'gpu-fyi-try-mac-amd-dqp': 'deqp_release_trybot',
+ 'gpu-fyi-try-mac-amd-pro-rel': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-mac-amd-retina-dbg': 'gpu_fyi_tests_debug_trybot',
+ 'gpu-fyi-try-mac-amd-retina-exp': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-mac-amd-retina-rel': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-mac-asan': 'gpu_fyi_tests_release_trybot_asan',
+ 'gpu-fyi-try-mac-intel-dbg': 'gpu_fyi_tests_debug_trybot',
+ 'gpu-fyi-try-mac-intel-dqp': 'deqp_release_trybot',
+ 'gpu-fyi-try-mac-intel-exp': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-mac-intel-rel': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-mac-nvidia-retina-dbg': 'gpu_fyi_tests_debug_trybot',
+ 'gpu-fyi-try-mac-nvidia-retina-exp': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-mac-nvidia-retina-rel': 'gpu_fyi_tests_release_trybot',
+ 'gpu-try-mac-amd-retina-dbg': 'gpu_tests_debug_trybot',
+ 'gpu-try-mac-intel-dbg': 'gpu_tests_debug_trybot',
'ios-device': 'ios_error',
'ios-device-xcode-clang': 'ios_error',
'ios-simulator': 'ios_error',
'ios-simulator-full-configs': 'ios_error',
'ios-simulator-cronet': 'ios_error',
'ios-simulator-xcode-clang': 'ios_error',
- 'mac-jumbo-rel': 'jumbo_large_chunks_release_bot_minimal_symbols',
+ 'mac-jumbo-rel': 'jumbo_large_chunks_release_bot_compile_only',
'mac_chromium_10.10': 'gpu_tests_release_trybot',
'mac_chromium_10.12_rel_ng': 'gpu_tests_release_trybot',
'mac_chromium_10.13_rel_ng': 'release_trybot',
- 'mac_chromium_archive_rel_ng': 'release_bot_mac_strip',
+ 'mac_chromium_archive_rel_ng': 'release_bot_mac_strip_minimal_symbols',
'mac_chromium_asan_rel_ng': 'asan_dcheck_disable_nacl_release_bot',
'mac_chromium_compile_dbg_ng': 'gpu_tests_debug_trybot',
'mac_chromium_compile_rel_ng': 'gpu_tests_release_trybot',
@@ -819,34 +808,35 @@
},
'tryserver.chromium.win': {
- 'gpu-manual-try-win7-amd-dbg': 'gpu_fyi_tests_debug_trybot_x86',
- 'gpu-manual-try-win7-amd-dqp': 'deqp_release_trybot_x86',
- 'gpu-manual-try-win7-amd-rel': 'gpu_fyi_tests_release_trybot_x86',
- 'gpu-manual-try-win7-nvidia-dqp-64': 'deqp_release_trybot',
- 'gpu-manual-try-win7-nvidia-rel': 'gpu_fyi_tests_release_trybot_x86',
- 'gpu-manual-try-win7-nvidia-rel-64': 'gpu_fyi_tests_release_trybot',
- 'gpu-manual-try-win10-intel-dqp': 'deqp_release_trybot_x86',
- 'gpu-manual-try-win10-intel-exp': 'gpu_fyi_tests_release_trybot_x86',
- 'gpu-manual-try-win10-intel-rel': 'gpu_fyi_tests_release_trybot_x86',
- 'gpu-manual-try-win10-nvidia-dbg': 'gpu_fyi_tests_debug_trybot_x86',
- 'gpu-manual-try-win10-nvidia-dqp': 'deqp_release_trybot_x86',
- 'gpu-manual-try-win10-nvidia-exp': 'gpu_fyi_tests_release_trybot_x86',
- 'gpu-manual-try-win10-nvidia-rel': 'gpu_fyi_tests_release_trybot_x86',
- 'win7_chromium_rel_loc_exp': 'gpu_tests_release_trybot_x86_minimal_symbols_resource_whitelisting',
+ 'gpu-fyi-try-win7-amd-dbg': 'gpu_fyi_tests_debug_trybot_x86',
+ 'gpu-fyi-try-win7-amd-dqp': 'deqp_release_trybot_x86',
+ 'gpu-fyi-try-win7-amd-rel': 'gpu_fyi_tests_release_trybot_x86',
+ 'gpu-fyi-try-win7-nvidia-dqp-64': 'deqp_release_trybot',
+ 'gpu-fyi-try-win7-nvidia-rel': 'gpu_fyi_tests_release_trybot_x86',
+ 'gpu-fyi-try-win7-nvidia-rel-64': 'gpu_fyi_tests_release_trybot',
+ 'gpu-fyi-try-win10-intel-dqp': 'deqp_release_trybot_x86',
+ 'gpu-fyi-try-win10-intel-exp': 'gpu_fyi_tests_release_trybot_x86',
+ 'gpu-fyi-try-win10-intel-rel': 'gpu_fyi_tests_release_trybot_x86',
+ 'gpu-fyi-try-win10-nvidia-dbg': 'gpu_fyi_tests_debug_trybot_x86',
+ 'gpu-fyi-try-win10-nvidia-dqp': 'deqp_release_trybot_x86',
+ 'gpu-fyi-try-win10-nvidia-exp': 'gpu_fyi_tests_release_trybot_x86',
+ 'gpu-fyi-try-win10-nvidia-rel': 'gpu_fyi_tests_release_trybot_x86',
+ 'gpu-try-win10-nvidia-dbg': 'gpu_tests_debug_trybot_x86',
+ 'win7_chromium_rel_loc_exp': 'gpu_tests_release_trybot_x86_resource_whitelisting',
'win10_chromium_x64_dbg_ng': 'gpu_tests_debug_trybot',
'win10_chromium_x64_rel_ng': 'gpu_tests_release_trybot_resource_whitelisting',
'win10_chromium_x64_rel_ng_exp': 'release_trybot',
'win-annotator-rel': 'release_trybot',
'win-asan': 'asan_clang_fuzzer_static_v8_heap_minimal_symbols_release',
- 'win-jumbo-rel': 'jumbo_large_chunks_release_bot_minimal_symbols',
+ 'win-jumbo-rel': 'jumbo_large_chunks_release_bot_compile_only',
'win-libfuzzer-asan-rel': 'libfuzzer_windows_asan_release_trybot',
- 'win7-rel': 'gpu_tests_release_trybot_x86_minimal_symbols_resource_whitelisting',
+ 'win7-rel': 'gpu_tests_release_trybot_x86_resource_whitelisting',
'win_x64_archive': 'release_trybot',
'win_archive': 'release_trybot_x86',
- 'win_chromium_compile_dbg_ng': 'gpu_tests_debug_trybot_x86_minimal_symbols',
- 'win_chromium_compile_rel_ng': 'gpu_tests_release_trybot_x86_minimal_symbols_resource_whitelisting',
- 'win_chromium_dbg_ng': 'gpu_tests_debug_trybot_x86_minimal_symbols',
- 'win_chromium_x64_rel_ng': 'gpu_tests_release_trybot_minimal_symbols',
+ 'win_chromium_compile_dbg_ng': 'gpu_tests_debug_trybot_x86',
+ 'win_chromium_compile_rel_ng': 'gpu_tests_release_trybot_x86_resource_whitelisting',
+ 'win_chromium_dbg_ng': 'gpu_tests_debug_trybot_x86',
+ 'win_chromium_x64_rel_ng': 'gpu_tests_release_trybot',
'win_mojo': 'release_trybot_x86',
'win_optional_gpu_tests_rel': 'gpu_fyi_tests_release_trybot_x86',
'win_upload_clang': 'release_bot',
@@ -862,14 +852,10 @@
},
'tryserver.webrtc': {
- 'win_chromium_compile': 'gpu_tests_release_trybot_x86_minimal_symbols_resource_whitelisting',
+ 'win_chromium_compile': 'gpu_tests_release_trybot_x86_resource_whitelisting',
'mac_chromium_compile': 'gpu_tests_release_trybot',
'linux_chromium_compile': 'release_trybot',
'android_chromium_compile': 'android_release_trybot',
- 'win_chromium_webrtc_compile_rel_ng': 'gpu_tests_release_trybot_x86_minimal_symbols_resource_whitelisting',
- 'mac_chromium_webrtc_compile_rel_ng': 'gpu_tests_release_trybot',
- 'linux_chromium_webrtc_compile_rel_ng': 'release_trybot',
- 'android_webrtc_compile_rel': 'android_release_trybot',
},
},
@@ -886,7 +872,8 @@
],
'android_binary_size': [
- 'android', 'android_config_check', 'chrome_with_codecs', 'goma', 'minimal_symbols', 'official_optimize',
+ 'android', 'android_config_check', 'chrome_with_codecs', 'goma',
+ 'minimal_symbols', 'official_optimize', 'stable_channel',
],
'android_cast_debug_static_bot': [
@@ -901,9 +888,12 @@
'android', 'cfi_full', 'cfi_diag', 'thin_lto', 'release', 'static', 'dcheck_always_on', 'goma',
],
- 'android_clang_asan_debug_bot_minimal_symbols': [
- 'android', 'clang', 'asan', 'debug_bot', 'minimal_symbols',
- 'strip_debug_info',
+ 'android_clang_asan_debug_bot': [
+ 'android', 'clang', 'asan', 'debug_bot', 'strip_debug_info',
+ ],
+
+ 'android_clang_asan_debug_bot_arm64': [
+ 'android', 'clang', 'asan', 'debug_bot', 'arm64',
],
'android_clang_asan_debug_trybot_compile_only': [
@@ -1093,16 +1083,24 @@
'android_without_codecs', 'shared_release_bot', 'x64', 'dcheck_always_on',
],
- 'android_without_codecs_debug_bot_minimal_symbols': [
- 'android_without_codecs', 'debug_bot', 'minimal_symbols',
+ 'android_webview_google_debug_static_bot': [
+ 'android', 'debug_static_bot', 'webview_google',
+ ],
+
+ 'android_webview_google_debug_static_bot_arm64': [
+ 'android', 'debug_static_bot', 'arm64', 'webview_google',
+ ],
+
+ 'android_without_codecs_debug_bot': [
+ 'android_without_codecs', 'debug_bot',
],
'android_without_codecs_release_bot_minimal_symbols': [
'android_without_codecs', 'release_bot', 'minimal_symbols', 'strip_debug_info',
],
- 'android_without_codecs_release_trybot_minimal_symbols': [
- 'android_without_codecs', 'release_trybot', 'minimal_symbols', 'strip_debug_info',
+ 'android_without_codecs_release_trybot': [
+ 'android_without_codecs', 'release_trybot', 'strip_debug_info',
],
'asan_clang_shared_v8_heap_minimal_symbols_release_tot': [
@@ -1239,11 +1237,6 @@
'use_clang_coverage', 'debug_static_bot', 'x64', 'ios'
],
- 'clang_code_coverage_trybot': [
- 'gpu_tests', 'use_dummy_lastchange', 'release_trybot', 'clang', 'use_clang_coverage', 'no_symbols',
- 'libfuzzer', 'partial_clang_instrumentation'
- ],
-
'clang_tot_asan_lsan_static_release': [
'clang_tot', 'asan', 'lsan', 'static', 'release',
],
@@ -1300,8 +1293,8 @@
'clang_tot', 'minimal_symbols', 'shared', 'release', 'x86', 'dcheck_always_on',
],
- 'clang_tot_win_official_full_symbols_static_x86': [
- 'clang_tot', 'official', 'full_symbols', 'static', 'x86', 'win_linker_timing',
+ 'clang_tot_win_official_full_symbols_thin_lto_static_x86': [
+ 'clang_tot', 'official', 'full_symbols', 'thin_lto', 'static', 'x86', 'win_linker_timing',
],
'clang_tot_win_official_full_symbols_thin_lto_static': [
@@ -1412,14 +1405,12 @@
'debug_bot', 'fuchsia',
],
- # compiler.gni implicitly sets symbol_level=1 on Windows if goma is enabled,
- # if MSVC is used. Explicitly set it here so that it's set consistently for
- # both MSVC and clang.
- 'debug_bot_minimal_symbols': [ 'debug_bot', 'minimal_symbols' ],
- 'debug_bot_x86_minimal_symbols': [ 'debug_bot', 'x86', 'minimal_symbols' ],
+ 'debug_bot_x86': [
+ 'debug_bot', 'x86',
+ ],
- 'debug_bot_x86_minimal_symbols_no_com_init_hooks_with_codecs': [
- 'debug_bot', 'x86', 'minimal_symbols', 'no_com_init_hooks', 'chrome_with_codecs'
+ 'debug_bot_x86_no_com_init_hooks_with_codecs': [
+ 'debug_bot', 'x86', 'no_com_init_hooks', 'chrome_with_codecs'
],
'libfuzzer_asan_debug_bot_v8_arm64': [
@@ -1446,10 +1437,6 @@
'debug_trybot', 'x86',
],
- 'debug_trybot_x86_minimal_symbols': [
- 'debug_trybot', 'x86',
- ],
-
'deqp_android_release_trybot_arm64': [
'angle_deqp_tests', 'android', 'release_trybot', 'arm64',
],
@@ -1487,20 +1474,24 @@
],
'gpu_fyi_tests_release_trybot_asan': [
- 'gpu_fyi_tests', 'release_trybot', 'asan', 'minimal_symbols', 'disable_nacl',
+ 'gpu_fyi_tests', 'release_trybot', 'asan', 'disable_nacl',
],
'gpu_fyi_tests_release_trybot_tsan': [
- 'gpu_fyi_tests', 'release_trybot', 'tsan', 'minimal_symbols', 'disable_nacl',
+ 'gpu_fyi_tests', 'release_trybot', 'tsan', 'disable_nacl',
],
'gpu_fyi_tests_release_trybot_x86': [
'gpu_fyi_tests', 'release_trybot', 'x86',
],
+ 'gpu_fyi_tests_release_trybot_fuchsia': [
+ 'gpu_fyi_tests', 'release_trybot', 'fuchsia',
+ ],
+
'gpu_tests_android_release_bot_minimal_symbols_arm64': [
'android', 'release_bot', 'minimal_symbols', 'arm64',
- 'strip_debug_info', 'static_angle',
+ 'resource_whitelisting', 'static_angle',
],
'gpu_tests_android_release_trybot': [
@@ -1511,8 +1502,8 @@
'gpu_tests', 'android', 'release_trybot', 'arm64', 'static_angle',
],
- 'gpu_tests_android_release_trybot_arm64_no_symbols': [
- 'android', 'release_trybot', 'arm64', 'no_symbols', 'static_angle',
+ 'gpu_tests_android_release_trybot_arm64_resource_whitelisting': [
+ 'android', 'release_trybot', 'arm64', 'static_angle', 'resource_whitelisting',
],
'gpu_tests_android_vulkan_release_trybot': [
@@ -1527,18 +1518,10 @@
'gpu_tests', 'debug_bot',
],
- 'gpu_tests_debug_bot_minimal_symbols': [
- 'gpu_tests', 'debug_bot', 'minimal_symbols',
- ],
-
'gpu_tests_debug_bot_x86': [
'gpu_tests', 'debug_bot', 'x86',
],
- 'gpu_tests_debug_bot_x86_minimal_symbols': [
- 'gpu_tests', 'debug_bot', 'x86', 'minimal_symbols',
- ],
-
'gpu_tests_debug_trybot': [
'gpu_tests', 'debug_trybot',
],
@@ -1547,8 +1530,8 @@
'gpu_tests', 'debug_trybot', 'x86',
],
- 'gpu_tests_debug_trybot_x86_minimal_symbols': [
- 'gpu_tests', 'debug_trybot', 'x86', 'minimal_symbols',
+ 'gpu_tests_debug_trybot_x86': [
+ 'gpu_tests', 'debug_trybot', 'x86',
],
'gpu_tests_release_bot_minimal_symbols': [
@@ -1575,22 +1558,26 @@
'gpu_tests', 'release_trybot', 'no_symbols', 'use_dummy_lastchange',
],
+ 'gpu_tests_release_trybot_no_symbols_use_dummy_lastchange_code_coverage': [
+ 'gpu_tests', 'release_trybot', 'no_symbols', 'use_dummy_lastchange',
+ 'use_clang_coverage', 'partial_clang_instrumentation',
+ ],
+
'gpu_tests_release_bot_jumbo_no_symbols_use_dummy_lastchange': [
'gpu_tests', 'release_bot', 'jumbo_non_goma_chunks', 'no_symbols',
'use_dummy_lastchange',
],
- 'gpu_tests_release_trybot_minimal_symbols': [
- 'gpu_tests', 'release_trybot', 'minimal_symbols',
+ 'gpu_tests_release_trybot': [
+ 'gpu_tests', 'release_trybot',
],
'gpu_tests_release_trybot_ptr_comp': [
'gpu_tests', 'release_trybot', 'v8_pointer_compression',
],
- 'gpu_tests_release_trybot_x86_minimal_symbols_resource_whitelisting': [
- 'gpu_tests', 'release_trybot', 'x86', 'minimal_symbols',
- 'resource_whitelisting',
+ 'gpu_tests_release_trybot_x86_resource_whitelisting': [
+ 'gpu_tests', 'release_trybot', 'x86', 'resource_whitelisting',
],
'gpu_tests_release_bot': [
@@ -1608,11 +1595,11 @@
# build files.
'ios_error': [ 'error'],
- 'jumbo_release_bot_minimal_symbols': [
+ 'jumbo_release_bot_compile_only': [
'jumbo', 'release_bot', 'compile_only',
],
- 'jumbo_large_chunks_release_bot_minimal_symbols': [
+ 'jumbo_large_chunks_release_bot_compile_only': [
'jumbo_non_goma_chunks', 'release_bot', 'compile_only',
],
@@ -1672,7 +1659,7 @@
],
'libfuzzer_windows_asan_release_trybot': [
- 'libfuzzer', 'asan', 'release_trybot', 'chrome_with_codecs', 'pdf_xfa', 'disable_nacl', 'minimal_symbols',
+ 'libfuzzer', 'asan', 'release_trybot', 'chrome_with_codecs', 'pdf_xfa', 'disable_nacl',
],
'msan_release_bot': [
@@ -1694,6 +1681,9 @@
'official_cros_chrome_sdk': [
'cros_chrome_sdk',
],
+ 'official_cros_chrome_sdk_headless_ozone': [
+ 'cros_chrome_sdk', 'ozone_platform_headless',
+ ],
'official_goma': [
'official', 'goma',
@@ -1772,8 +1762,8 @@
'release_bot', 'fuchsia', 'arm64', 'cast', 'no_symbols',
],
- 'release_bot_mac_strip': [
- 'release_bot', 'mac_strip',
+ 'release_bot_mac_strip_minimal_symbols': [
+ 'release_bot', 'mac_strip', 'minimal_symbols',
],
'release_bot_v8_debug': [
@@ -1787,8 +1777,13 @@
# compiler.gni implicitly sets symbol_level=1 on Windows if goma is enabled,
# if MSVC is used. Explicitly set it here so that it's set consistently for
# both MSVC and clang.
- 'release_bot_minimal_symbols': [ 'release_bot', 'minimal_symbols' ],
- 'release_bot_x86_minimal_symbols': [ 'release_bot', 'x86', 'minimal_symbols' ],
+ 'release_bot_minimal_symbols': [
+ 'release_bot', 'minimal_symbols',
+ ],
+
+ 'release_bot_x86_minimal_symbols': [
+ 'release_bot', 'x86', 'minimal_symbols',
+ ],
'release_bot_minimal_symbols_enable_archive_compression': [
'release_bot', 'minimal_symbols', 'enable_archive_compression'
@@ -2007,7 +2002,7 @@
},
'clang_tot': {
- 'gn_args': 'llvm_force_head_revision=true clang_use_chrome_plugins=false',
+ 'gn_args': 'llvm_force_head_revision=true',
'mixins': ['clang'],
},
@@ -2186,7 +2181,7 @@
},
'java_coverage': {
- 'gn_args': 'emma_coverage=true emma_filter="org.chromium.*"',
+ 'gn_args': 'jacoco_coverage=true',
},
'jumbo': {
@@ -2352,6 +2347,10 @@
'gn_args': 'enable_resource_whitelist_generation=true',
},
+ 'stable_channel': {
+ 'gn_args': 'android_channel="stable"',
+ },
+
'tsan': {
'gn_args': 'is_tsan=true',
},
@@ -2415,6 +2414,10 @@
'gn_args': 'android32_ndk_api_level=26 android64_ndk_api_level=26',
},
+ 'webview_google': {
+ 'gn_args': 'system_webview_package_name="com.google.android.webview"',
+ },
+
'win_cross': {
'gn_args': 'target_os="win"',
},
diff --git a/chromium/tools/metrics/BUILD.gn b/chromium/tools/metrics/BUILD.gn
index 3de6d261091..b4c9f6f157f 100644
--- a/chromium/tools/metrics/BUILD.gn
+++ b/chromium/tools/metrics/BUILD.gn
@@ -99,9 +99,11 @@ group("metrics_python_tests") {
"//tools/metrics/common/pretty_print_xml.py",
"//tools/metrics/common/etree_util.py",
+ "//tools/metrics/histograms/enums.xml",
"//tools/metrics/histograms/extract_histograms.py",
"//tools/metrics/histograms/generate_expired_histograms_array.py",
"//tools/metrics/histograms/generate_expired_histograms_array_unittest.py",
+ "//tools/metrics/histograms/histogram_paths.py",
"//tools/metrics/histograms/histograms_print_style.py",
"//tools/metrics/histograms/merge_xml.py",
"//tools/metrics/histograms/pretty_print.py",
diff --git a/chromium/tools/metrics/actions/actions.xml b/chromium/tools/metrics/actions/actions.xml
index 3b541b096f6..5d97313a618 100644
--- a/chromium/tools/metrics/actions/actions.xml
+++ b/chromium/tools/metrics/actions/actions.xml
@@ -839,8 +839,29 @@ should be able to be added at any place in this file.
</action>
<action name="Accel_Restore_Tab">
- <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
- <description>Please enter the description of this user action.</description>
+ <owner>mpearson@chromium.org</owner>
+ <owner>chrisha@chromium.org</owner>
+ <description>
+ Emitted when the Ash window manager hotkey handler handles the
+ &quot;Ctrl-Shift-T&quot; shortcut that causes the most recently closed tab
+ to be restored. Because it's related to Ash, it's ChromeOS only. This is
+ only emitted when the Ash hotkey handler handles the shortcut, which only
+ happens when a non-Chrome window is focussed on ChromeOS. (The launcher is
+ an example of a non-Chrome window.) If a Chrome window was focussed on
+ ChromeOS as the user presses the keyboard shortcut, it's handled by Chrome's
+ keyboard shortcut handler system. In that case, the user action RestoreTab
+ is emitted, not Accel_Restore_Tab.
+
+ It's never the case that both Accel_Restore_Tab and RestoreTab are emitted
+ for the same keyboard shortcut press.
+
+ Note: if the last user action was to close an entire window with multiple
+ tabs, this keyboard shortcut will cause the entire window to be restored,
+ containing multiple tabs. This user action is only emitted once however,
+ regardless of the number of tabs.
+
+ This is not emitted during session restore that occurs as part of startup.
+ </description>
</action>
<action name="Accel_Rotate_Active_Window">
@@ -1758,6 +1779,13 @@ should be able to be added at any place in this file.
<description>User opened NTP with enabled ExploreSites section.</description>
</action>
+<action name="Android.ExploreSitesPage.ClickOnSiteIcon">
+ <owner>dimich@chromium.org</owner>
+ <description>
+ User clicked on a site icon while on ExploreSites page.
+ </description>
+</action>
+
<action name="Android.ExploreSitesPage.Open">
<owner>dimich@chromium.org</owner>
<description>
@@ -1765,6 +1793,14 @@ should be able to be added at any place in this file.
</description>
</action>
+<action name="Android.ExploreSitesPage.Scrolled">
+ <owner>dimich@chromium.org</owner>
+ <description>
+ User scrolled the ExploreSites page. Reported once per ExploreSitesPage
+ instance shown.
+ </description>
+</action>
+
<action name="Android.HistoryPage.ClearBrowsingData">
<owner>twellington@chromium.org</owner>
<description>
@@ -2204,6 +2240,15 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="AppList_ShowPlayStoreQueryResults">
+ <owner>jennyz@chromium.org</owner>
+ <owner>newcomer@chromium.org</owner>
+ <description>
+ Cros Launcher shows play store apps to user in response for a user typed
+ query with reason time for user to see and take action.
+ </description>
+</action>
+
<action name="AppList_ShowZeroStateSuggestions">
<owner>jennyz@chromium.org</owner>
<owner>newcomer@chromium.org</owner>
@@ -2225,6 +2270,17 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="AppList_WindowFocused">
+ <owner>newcomer@chromium.org</owner>
+ <description>
+ Emitted when the AppList has gained focus. The AppList gains focus every
+ time it is shown to the user, so this is equivalent to being emitted when
+ the AppList is shown to the user. This can be used in combination with
+ launch/activation metrics to calculate the click through rate in the
+ AppList.
+ </description>
+</action>
+
<action name="AppList_ZeroStateOpenInstalledApp">
<owner>jennyz@chromium.org</owner>
<owner>newcomer@chromium.org</owner>
@@ -2372,7 +2428,7 @@ should be able to be added at any place in this file.
</description>
</action>
-<action name="Autofill_ParsedProfileForm">
+<action name="Autofill_ParsedProfileForm" not_user_triggered="true">
<owner>sebsg@chromium.org</owner>
<description>
This user action is logged when a profile form is parsed.
@@ -3163,18 +3219,31 @@ should be able to be added at any place in this file.
</action>
<action name="BookmarkBar_ContextMenu_OpenAll">
- <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
- <description>Please enter the description of this user action.</description>
+ <owner>dfried@chromium.org</owner>
+ <description>
+ The user opened one or more bookmarks in the Bookmarks Bar using the context
+ menu. Distinguished from launching from e.g. the application menu or the
+ bookmark manager. This is for opening bookmarks normally (in the same
+ window).
+ </description>
</action>
<action name="BookmarkBar_ContextMenu_OpenAllIncognito">
- <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
- <description>Please enter the description of this user action.</description>
+ <owner>dfried@chromium.org</owner>
+ <description>
+ The user opened one or more bookmarks in the Bookmarks Bar using the context
+ menu. Distinguished from launching from e.g. the application menu or the
+ bookmark manager. This is for opening bookmarks in an incognito window.
+ </description>
</action>
<action name="BookmarkBar_ContextMenu_OpenAllInNewWindow">
- <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
- <description>Please enter the description of this user action.</description>
+ <owner>dfried@chromium.org</owner>
+ <description>
+ The user opened one or more bookmarks in the Bookmarks Bar using the context
+ menu. Distinguished from launching from e.g. the application menu or the
+ bookmark manager. This is for opening bookmarks in a new window.
+ </description>
</action>
<action name="BookmarkBar_ContextMenu_OpenInNewTab">
@@ -3856,6 +3925,7 @@ should be able to be added at any place in this file.
</action>
<action name="ClearBrowsingData_ChannelIDs">
+ <obsolete>Deprecated as of 4/2019.</obsolete>
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<description>Please enter the description of the metric.</description>
</action>
@@ -4088,8 +4158,12 @@ should be able to be added at any place in this file.
</action>
<action name="ClickedBookmarkBarURLButton">
- <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
- <description>Please enter the description of this user action.</description>
+ <owner>dfried@chromium.org</owner>
+ <description>
+ User clicks a bookmark to open it, either in the bookmarks bar or in a
+ bookmarks bar folder or overflow menu. (Changed in M75 to include
+ non-top-level bookmarks.)
+ </description>
</action>
<action name="ClickToPlay_AllowAlways">
@@ -4505,6 +4579,7 @@ should be able to be added at any place in this file.
</action>
<action name="ContextualSuggestions">
+ <obsolete>This feature was deprecated in M74</obsolete>
<owner>huayinz@chromium.org</owner>
<owner>twellington@chromium.com</owner>
<owner>wylieb@chromium.com</owner>
@@ -4512,6 +4587,7 @@ should be able to be added at any place in this file.
</action>
<action name="ContextualSuggestions.ContextMenu">
+ <obsolete>This feature was deprecated in M74</obsolete>
<owner>huayinz@chromium.org</owner>
<owner>twellington@chromium.com</owner>
<description>
@@ -4521,6 +4597,7 @@ should be able to be added at any place in this file.
</action>
<action name="ContextualSuggestions.Preference.Disabled">
+ <obsolete>This feature was deprecated in M74</obsolete>
<owner>huayinz@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<description>
@@ -4530,6 +4607,7 @@ should be able to be added at any place in this file.
</action>
<action name="ContextualSuggestions.Preference.Enabled">
+ <obsolete>This feature was deprecated in M74</obsolete>
<owner>huayinz@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<description>
@@ -4723,12 +4801,12 @@ should be able to be added at any place in this file.
<description>User hit &quot;read it later&quot; menu item.</description>
</action>
-<action name="CustomTabsRemoteViewsShown">
+<action name="CustomTabsRemoteViewsShown" not_user_triggered="true">
<owner>ianwen@chromium.org</owner>
<description>A RemoteViews based bottom bar was shown.</description>
</action>
-<action name="CustomTabsRemoteViewsUpdated">
+<action name="CustomTabsRemoteViewsUpdated" not_user_triggered="true">
<owner>ianwen@chromium.org</owner>
<description>
A RemoteViews based bottom bar was updated through service API.
@@ -5316,6 +5394,25 @@ should be able to be added at any place in this file.
</description>
</action>
+<action name="Downloads_OpenUrlOfDownloadedItem">
+ <owner>xingliu@chromium.org</owner>
+ <description>
+ Records clicks on the URL of download items in chrome://downloads page.
+ </description>
+</action>
+
+<action name="Downloads_OpenUrlOfDownloadedItemFromContextMenu">
+ <owner>xingliu@chromium.org</owner>
+ <description>
+ Records open a URL of download items in chrome://downloads page from context
+ menu.
+
+ As of M-76, &quot;Save link as...&quot;, &quot;Copy link address&quot;, and
+ &quot;Copy link text&quot; context menu actions no longer log this action
+ (this was accidentally the case before M-76).
+ </description>
+</action>
+
<action name="Duplicate">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<description>Please enter the description of this user action.</description>
@@ -5964,6 +6061,28 @@ should be able to be added at any place in this file.
</description>
</action>
+<action name="GridTabSwitcher.Drag.AddToGroupOrCreateGroup">
+ <owner>yusufo@chromium.org</owner>
+ <owner>wychen@chromium.org</owner>
+ <description>
+ User drags a tab and drops it on another tab to form a new group in grid tab
+ switcher.
+ </description>
+</action>
+
+<action name="GridTabSwitcher.DropTabToMerge">
+ <obsolete>
+ Deprecated as of 6/2019. Replaced with
+ GridTabSwitcher.Drag.AddToGroupOrCreateGroup.
+ </obsolete>
+ <owner>yusufo@chromium.org</owner>
+ <owner>wychen@chromium.org</owner>
+ <description>
+ User drags a tab and drops it on another tab to form a group in grid tab
+ switcher.
+ </description>
+</action>
+
<action name="GridTabSwitcher.UndoCloseTabGroup">
<owner>yusufo@chromium.org</owner>
<owner>wychen@chromium.org</owner>
@@ -10922,6 +11041,11 @@ should be able to be added at any place in this file.
</description>
</action>
+<action name="MediaRouter.CastStreaming.Session.End">
+ <owner>miu@google.com</owner>
+ <description>User ended a Cast Streaming session.</description>
+</action>
+
<action name="MediaRouter_Icon_Click">
<owner>apacible@chromium.org</owner>
<description>
@@ -10995,6 +11119,15 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="MiddleClickedBookmarkBarFolder">
+ <owner>dfried@chromium.org</owner>
+ <description>
+ Triggered when user middle-clicks a bookmarks bar folder, resulting in all
+ bookmarks in the folder being opened. Applies to all folders reachable from
+ the bookmark bar, including subfolders and overflow.
+ </description>
+</action>
+
<action name="MinButton_Clk">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<description>Please enter the description of this user action.</description>
@@ -11392,6 +11525,16 @@ should be able to be added at any place in this file.
</description>
</action>
+<action name="MobileExitStackView">
+ <owner>yusufo@chromium.org</owner>
+ <owner>wychen@chromium.org</owner>
+ <description>
+ User exited the Android tab switcher due to one of the listed actions,
+ opened a new normal/incognito tab, selected an existed tab, or pressed
+ system back button.
+ </description>
+</action>
+
<action name="MobileExternalNavigationDispatched">
<owner>thildebr@chromium.org</owner>
<description>
@@ -11607,6 +11750,12 @@ should be able to be added at any place in this file.
<description>User pressed 'Fullscreen' in the app menu.</description>
</action>
+<action name="MobileMenuGroupTabs">
+ <owner>yusufo@chromium.org</owner>
+ <owner>wychen@chromium.org</owner>
+ <description>User pressed 'Group tabs' in the tab switcher menu.</description>
+</action>
+
<action name="MobileMenuHelp">
<owner>gambard@chromium.org</owner>
<description>User pressed 'Help' in the app menu.</description>
@@ -11743,6 +11892,69 @@ should be able to be added at any place in this file.
<description>User pressed 'Voice Search' in the app menu.</description>
</action>
+<action name="MobileMessagesBadgeAcceptedTapped">
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <description>
+ User tapped on an accepted Infobar Message badge which displayed the Modal.
+ </description>
+</action>
+
+<action name="MobileMessagesBadgeNonAcceptedTapped">
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <description>
+ User tapped on a non-accepted Infobar Message badge which displayed the
+ Modal.
+ </description>
+</action>
+
+<action name="MobileMessagesBannerDraggedDown">
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <description>
+ User dragged down the Infobar Message Banner which expanded it into a Modal.
+ </description>
+</action>
+
+<action name="MobileMessagesBannerTapped">
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <description>
+ User tapped the Infobar Message Banner which expanded it into a Modal.
+ </description>
+</action>
+
+<action name="MobileMessagesModalAcceptedTapped">
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <description>User accepted the Infobar Modal main action.</description>
+</action>
+
+<action name="MobileMessagesModalCancelledTapped">
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <description>
+ User dismissed the Infobar Modal without any action.
+ </description>
+</action>
+
+<action name="MobileMessagesModalNever">
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <description>
+ User dismissed both the Infobar Modal and the InfobarBadge.
+ </description>
+</action>
+
+<action name="MobileMessagesModalSettings">
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <description>
+ User dismissed the Infobar Modal by opening the Infobar Settings.
+ </description>
+</action>
+
<action name="MobileMWSession">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<description>Please enter the description of this user action.</description>
@@ -11753,6 +11965,15 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="MobileNewTabOpenedTabStrip">
+ <owner>yusufo@chromium.org</owner>
+ <owner>wychen@chromium.org</owner>
+ <description>
+ Users tapped '+' button on the tab strip, causing a new tab to be created in
+ the group.
+ </description>
+</action>
+
<action name="MobileNTP.Interests.Click">
<owner>knn@chromium.org</owner>
<description>
@@ -11863,6 +12084,14 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="MobileNTPIdentityDiscTapped">
+ <owner>msarda@chromium.org</owner>
+ <owner>pkl@chromium.org</owner>
+ <description>
+ Recorded when a user taps on the Identity Disc on NTP.
+ </description>
+</action>
+
<action name="MobileNTPMostVisited">
<owner>dewittj@chromium.org</owner>
<description>Recorded when a user clicks on a Most Visited tile.</description>
@@ -12365,6 +12594,14 @@ should be able to be added at any place in this file.
</description>
</action>
+<action name="MobileShareMenuSendTabToSelf">
+ <owner>jeffreycohen@chromium.org</owner>
+ <owner>sebsg@chromium.org</owner>
+ <description>
+ The user pressed &quot;Send Tab To Self&quot; from the share action menu.
+ </description>
+</action>
+
<action name="MobileShortcutAllBookmarks">
<obsolete>Deprecated as of 5/2015</obsolete>
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
@@ -12737,6 +12974,12 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="MobileToolbarIdentityDiscTap">
+ <owner>pavely@chromium.org</owner>
+ <owner>chrome-android-app@chromium.org</owner>
+ <description>User tapped on IdentityDisc button on toolbar.</description>
+</action>
+
<action name="MobileToolbarNewTab">
<obsolete>Deprecated as of 5/2015</obsolete>
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
@@ -16625,8 +16868,27 @@ should be able to be added at any place in this file.
</action>
<action name="RestoreTab">
- <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
- <description>Please enter the description of this user action.</description>
+ <owner>mpearson@chromium.org</owner>
+ <owner>chrisha@chromium.org</owner>
+ <description>
+ Emitted anytime the most recently closed tab is restored via
+ browser/ui/browser_tab_restorer.cc. This occurs either via the
+ (Ctrl-Shift-T) hotkey or the tab context menu. These are cases where the
+ user hasn't explicitly selected a recently closed tab; the user is asking
+ that the most recently closed tab be restored. Thus, it's not recorded, for
+ example, if the user uses three-dots menu &gt; History &gt; Recently Closed
+ Tabs and selects a tab, as in this case the user has selected a recently
+ closed tab explicitly. That case and cases like it go directly to
+ TabRestoreService::RestoreEntryById and bypass the browser_tab_restorer code
+ path.
+
+ Note: if the last user action was to close an entire window with multiple
+ tabs, this RestoreTab action will cause the entire window to be restored,
+ containing multiple tabs. This user action is only emitted once however,
+ regardless of the number of tabs.
+
+ This is not emitted during session restore that occurs as part of startup.
+ </description>
</action>
<action name="Save">
@@ -16939,6 +17201,15 @@ should be able to be added at any place in this file.
<description>User interacts with an answer card.</description>
</action>
+<action name="SearchClickMappedToRightClick">
+ <owner>zentaro@chromium.org</owner>
+ <description>
+ User pressed search click on a touchpad device to generate right click. This
+ is measuring the transition of use from the legacy alt click behaviour that
+ is tracked by AltClickMappedToRightClick.
+ </description>
+</action>
+
<action name="SearchEngine_ManualChange">
<owner>ianwen@chromium.org</owner>
<description>
@@ -17282,6 +17553,14 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="ShowAppManagementPage">
+ <owner>jshikaram@chromium.org</owner>
+ <owner>dominickn@chromium.org</owner>
+ <description>
+ The user selected the App Info context menu item in the app launcher.
+ </description>
+</action>
+
<action name="ShowAppMenu">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<description>Please enter the description of this user action.</description>
@@ -20239,6 +20518,15 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="SyncPreferences_ManageGoogleAccountClicked">
+ <owner>triploblastic@google.com</owner>
+ <owner>msarda@chromium.org</owner>
+ <description>
+ Used clicked 'Manage your Google Account' in sync and google services menu
+ in android.
+ </description>
+</action>
+
<action name="SystemBack">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<description>Please enter the description of this user action.</description>
@@ -20386,8 +20674,18 @@ should be able to be added at any place in this file.
</action>
<action name="TabContextMenu_RestoreTab">
- <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
- <description>Please enter the description of this user action.</description>
+ <owner>mpearson@chromium.org</owner>
+ <owner>chrisha@chromium.org</owner>
+ <description>
+ Emitted when the user uses the tab strip context menu and selects
+ &quot;Reopen Closed Tab&quot;. This interaction also causes the user action
+ RestoreTab to be emitted.
+
+ Note: if the last user action was to close an entire window with multiple
+ tabs, this &quot;Reopen Closed Tab&quot; action will cause the entire window
+ to be restored, containing multiple tabs. This user action is only emitted
+ once however, regardless of the number of tabs.
+ </description>
</action>
<action name="TabContextMenu_SendTabToSelf_Clicked">
@@ -20447,6 +20745,30 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="TabGrid.Drag">
+ <owner>yusufo@chromium.org</owner>
+ <owner>wychen@chromium.org</owner>
+ <description>User drags a tab to reorder it.</description>
+</action>
+
+<action name="TabGrid.DragToReorder">
+ <obsolete>
+ Deprecated as of 6/2019. Replaced with TabGrid.Drag.Reordered.
+ </obsolete>
+ <owner>yusufo@chromium.org</owner>
+ <owner>wychen@chromium.org</owner>
+ <description>User drags a tab to reorder it.</description>
+</action>
+
+<action name="TabGridDialog.Drag.RemoveFromGroup">
+ <owner>yusufo@chromium.org</owner>
+ <owner>wychen@chromium.org</owner>
+ <description>
+ User drags a tab in tab grid dialog and drops it on the ungroup bar to move
+ the tab out of the group.
+ </description>
+</action>
+
<action name="TabGridSheet.UndoCloseTab">
<owner>yusufo@chromium.org</owner>
<owner>wychen@chromium.org</owner>
@@ -20549,6 +20871,12 @@ should be able to be added at any place in this file.
</description>
</action>
+<action name="TabMultiSelect">
+ <owner>yusufo@chromium.org</owner>
+ <owner>wychen@chromium.org</owner>
+ <description>User took an action on the TabSelectionEditor.</description>
+</action>
+
<action name="TabOverview_DetachCell">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<description>Please enter the description of this user action.</description>
@@ -20813,6 +21141,15 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="TopMenu_Bookmarks_LaunchURL">
+ <owner>dfried@chromium.org</owner>
+ <description>
+ The user opened a bookmark from the application menu at the top of the
+ screen on, for example, MacOS. Distinguished from launching from the
+ wrench/app menu or the bookmarks bar.
+ </description>
+</action>
+
<action name="Touchpad_Gesture_Overview">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<description>Please enter the description of this user action.</description>
@@ -21683,6 +22020,43 @@ should be able to be added at any place in this file.
<description>Please enter the description of this user action.</description>
</action>
+<action name="WrenchMenu_Bookmarks_ContextMenu_OpenAll">
+ <owner>dfried@chromium.org</owner>
+ <description>
+ The user opened one or more bookmarks in the Bookmarks Bar using the context
+ menu. Distinguished from launching from e.g. the application menu or the
+ bookmark manager. This is for opening bookmarks normally (in the same
+ window).
+ </description>
+</action>
+
+<action name="WrenchMenu_Bookmarks_ContextMenu_OpenAllIncognito">
+ <owner>dfried@chromium.org</owner>
+ <description>
+ The user opened one or more bookmarks in the Bookmarks Bar using the context
+ menu. Distinguished from launching from e.g. the application menu or the
+ bookmark manager. This is for opening bookmarks in an incognito window.
+ </description>
+</action>
+
+<action name="WrenchMenu_Bookmarks_ContextMenu_OpenAllInNewWindow">
+ <owner>dfried@chromium.org</owner>
+ <description>
+ The user opened one or more bookmarks in the Bookmarks Bar using the context
+ menu. Distinguished from launching from e.g. the application menu or the
+ bookmark manager. This is for opening bookmarks in a new window.
+ </description>
+</action>
+
+<action name="WrenchMenu_Bookmarks_LaunchURL">
+ <owner>dfried@chromium.org</owner>
+ <description>
+ The user opened a bookmark from the wrench/application/three-dot menu.
+ Distinguished from launching from e.g. the bookmarks bar or bookmark
+ manager.
+ </description>
+</action>
+
<action name="WrenchMenu_OpenRecentTabFromDevice">
<owner>jwd@chromium.org</owner>
<description>
@@ -21767,6 +22141,7 @@ should be able to be added at any place in this file.
<suffix name="DownloadPage" label="For DownloadPage feature."/>
<suffix name="DownloadPageScreenshot"
label="For DownloadPageScreenshot feature."/>
+ <suffix name="ExploreSitesTile" label="For Explore Sites feature."/>
<suffix name="HomePageButton" label="For HomePageButton feature."/>
<suffix name="HomepageTile" label="For HomepageTile feature."/>
<suffix name="IncognitoWindow" label="For IncognitoWindow feature."/>
@@ -21859,6 +22234,8 @@ should be able to be added at any place in this file.
label="Users tapped on a link with a target=_blank"/>
<suffix name="OpenInNewTab"
label="Users long pressed a link and opened in new tab."/>
+ <suffix name="TabMultiSelect"
+ label="Users tapped the 'Group' button in the TabSelectionEditor."/>
<suffix name="TabSwitcher"
label="Users tapped the 'Create group' button in TabSwitcher."/>
<affected-action name="TabGroup.Created"/>
@@ -21915,4 +22292,45 @@ should be able to be added at any place in this file.
<affected-action name="Android.DarkTheme.Preference"/>
</action-suffix>
+<action-suffix separator="." ordering="suffix">
+ <suffix name="GridTabSwitcher"
+ label="Users swipe to close a tab in grid layout TabSwitcher."/>
+ <suffix name="TabGridDialog"
+ label="Users swipe to close a tab in tab grid dialog."/>
+ <suffix name="TabGridSheet"
+ label="Users swipe to close a tab in tab group bottom sheet."/>
+ <affected-action name="MobileStackViewSwipeCloseTab"/>
+</action-suffix>
+
+<action-suffix separator="." ordering="suffix">
+ <suffix name="Reordered.GridTabSwitcher"
+ label="Users drag to reorder tabs in grid layout TabSwitcher."/>
+ <suffix name="Reordered.TabGridDialog"
+ label="Users drag to reorder tabs in tab grid dialog."/>
+ <suffix name="Reordered.TabGridSheet"
+ label="Users drag to reorder tabs in tab group bottom sheet."/>
+ <suffix name="Start.GridTabSwitcher"
+ label="Users long tap on a tab to trigger dragging in grid layout
+ TabSwitcher."/>
+ <suffix name="Start.TabGridDialog"
+ label="Users long tap on a tab to trigger dragging in tab grid dialog."/>
+ <suffix name="Start.TabGridSheet"
+ label="Users long tap on a tab to trigger dragging in tab group bottom
+ sheet."/>
+ <affected-action name="TabGrid.Drag"/>
+</action-suffix>
+
+<action-suffix separator="." ordering="suffix">
+ <suffix name="Cancelled"
+ label="Users exited the TabSelectionEditor to the tab switcher via the
+ back arrow or through the system back."/>
+ <suffix name="Done"
+ label="Users tapped the action button on the top right corner."/>
+ <suffix name="TabSelected"
+ label="Users selected a tab in TabSelectionEditor."/>
+ <suffix name="TabUnselected"
+ label="Users un-selected a tab in TabSelectionEditor."/>
+ <affected-action name="TabMultiSelect"/>
+</action-suffix>
+
</actions>
diff --git a/chromium/tools/metrics/actions/extract_actions.py b/chromium/tools/metrics/actions/extract_actions.py
index 169f5b3ef4d..5c4941694b2 100755
--- a/chromium/tools/metrics/actions/extract_actions.py
+++ b/chromium/tools/metrics/actions/extract_actions.py
@@ -72,6 +72,16 @@ USER_METRICS_ACTION_RE_JS = re.compile(r"""
""",
re.VERBOSE | re.DOTALL # Verbose syntax and makes . also match new lines.
)
+USER_METRICS_ACTION_RE_DEVTOOLS = re.compile(r"""
+ InspectorFrontendHost\.recordUserMetricsAction # Start of function call.
+ \( # Opening parenthesis.
+ \s* # Any amount of whitespace, including new lines.
+ (.+?) # A sequence of characters for the param.
+ \s* # Any amount of whitespace, including new lines.
+ \) # Closing parenthesis.
+ """,
+ re.VERBOSE | re.DOTALL # Verbose syntax and makes . also match new lines.
+)
COMPUTED_ACTION_RE = re.compile(r'RecordComputedAction')
QUOTED_STRING_RE = re.compile(r"""('[^']+'|"[^"]+")$""")
@@ -99,6 +109,7 @@ KNOWN_COMPUTED_USERS = (
'pepper_pdf_host.cc', # see AddClosedSourceActions()
'record_user_action.cc', # see RecordUserAction.java
'blink_platform_impl.cc', # see WebKit/public/platform/Platform.h
+ 'devtools_ui_bindings.cc', # see AddDevToolsActions()
)
# Language codes used in Chrome. The list should be updated when a new
@@ -433,6 +444,31 @@ def GrepForWebUIActions(path, actions):
if not close_called:
parser.close()
+def GrepForDevToolsActions(path, actions):
+ """Grep a DevTools source file for calls to UserMetrics functions.
+
+ Arguments:
+ path: path to the file
+ actions: set of actions to add to
+ """
+ global number_of_files_total
+ number_of_files_total = number_of_files_total + 1
+
+ ext = os.path.splitext(path)[1].lower()
+ if ext != '.js':
+ return
+
+ finder = ActionNameFinder(path, open(path).read(),
+ USER_METRICS_ACTION_RE_DEVTOOLS)
+ while True:
+ try:
+ action_name = finder.FindNextAction()
+ if not action_name:
+ break
+ actions.add(action_name)
+ except InvalidStatementException, e:
+ logging.warning(str(e))
+
def WalkDirectory(root_path, actions, extensions, callback):
for path, dirs, files in os.walk(root_path):
if '.svn' in dirs:
@@ -485,6 +521,16 @@ def AddWebUIActions(actions):
WalkDirectory(resources_root, actions, ('.html'), GrepForWebUIActions)
WalkDirectory(resources_root, actions, ('.js'), GrepForActions)
+def AddDevToolsActions(actions):
+ """Add user actions defined in DevTools frontend files.
+
+ Arguments:
+ actions: set of actions to add to.
+ """
+ resources_root = os.path.join(REPOSITORY_ROOT, 'third_party', 'blink',
+ 'renderer', 'devtools', 'front_end')
+ WalkDirectory(resources_root, actions, ('.js'), GrepForDevToolsActions)
+
def AddHistoryPageActions(actions):
"""Add actions that are used in History page.
@@ -721,6 +767,7 @@ def UpdateXml(original_xml):
actions = set()
AddComputedActions(actions)
AddWebUIActions(actions)
+ AddDevToolsActions(actions)
AddLiteralActions(actions)
diff --git a/chromium/tools/metrics/histograms/OWNERS b/chromium/tools/metrics/histograms/OWNERS
index 70ef08fd294..e800c91285e 100644
--- a/chromium/tools/metrics/histograms/OWNERS
+++ b/chromium/tools/metrics/histograms/OWNERS
@@ -5,6 +5,7 @@ per-file histograms.xml=file://base/metrics/OWNERS
# - You work in the same area as them.
# - They are already a good reviewer for the non-metrics part of the CL.
per-file histograms.xml=alexilin@chromium.org
+per-file histograms.xml=altimin@chromium.org # Scheduling-related metrics.
per-file histograms.xml=csharrison@chromium.org
per-file histograms.xml=cthomp@chromium.org # For security-related metrics only.
per-file histograms.xml=schenney@chromium.org
diff --git a/chromium/tools/metrics/histograms/README.md b/chromium/tools/metrics/histograms/README.md
index bfd84b9b6b2..550ab45eff0 100644
--- a/chromium/tools/metrics/histograms/README.md
+++ b/chromium/tools/metrics/histograms/README.md
@@ -95,69 +95,92 @@ the same histogram. For example, if you want to count pages opened from the
history page, it might be a useful comparison to have the same histogram
record the number of times the history page was opened.
-If few buckets will be emitted to, consider using a [sparse
+If only a few buckets will be emitted to, consider using a [sparse
histogram](#When-To-Use-Sparse-Histograms).
-You may append to your enum if the possible states/actions grows. However, you
-should not reorder, renumber, or otherwise reuse existing values. Definitions
-for enums recorded in histograms should be prefixed by the following warning:
-```c++
-// These values are persisted to logs. Entries should not be renumbered and
-// numeric values should never be reused.
-```
+#### Requirements
+
+Enums logged in histograms must:
+
+- be prefixed with the comment:
+ ```c++
+ // These values are persisted to logs. Entries should not be renumbered and
+ // numeric values should never be reused.
+ ```
+- be numbered starting from `0`. Note this bullet point does *not* apply for
+ enums logged with sparse histograms.
+- have enumerators with explicit values (`= 0`, `= 1`, `= 2`), to make it clear
+ that the actual values are important. This also makes it easy to match the
+ values between the C++/Java definition and [histograms.xml](./histograms.xml).
+- not renumber or reuse enumerator values. When adding a new enumerator, append
+ the new enumerator to the end. When removing an unused enumerator, comment it
+ out, making it clear the value was previously used.
+
+If your enum histogram has a catch-all / miscellaneous bucket, put that bucket
+first (`= 0`). This will make the bucket easy to find on the dashboard if
+additional buckets are added later.
+
+#### Usage
-The enums themselves should have explicit enumerator values set (`= 0`, `= 1`,
-`= 2`), to make it clear that the actual values are important and to make it
-easy to match the values between the C++ definition and
-[histograms.xml](./histograms.xml).
+Define an `enum class` with a `kMaxValue` enumerator:
-For new enums used in histograms, prefer using an enum class with a kMaxValue
-element, like this:
-```c++ {.good}
+```c++
enum class NewTabPageAction {
kUseOmnibox = 0,
kClickTitle = 1,
- kOpenBookmark = 2,
+ // kUseSearchbox = 2, // no longer used, combined into omnibox
+ kOpenBookmark = 3,
kMaxValue = kOpenBookmark,
};
```
-`kMaxValue` is a special enumerator value that shares the value of the highest
-enumerator: this should be done by assigning it the name of the enumerator with
-the highest explicit integral value. There is a presubmit check which will
-enforce this semantic. Enums defined this way have better type checking support
-from the compiler, allow inferring kMaxValue from the type, and allow `switch`
-statements over them will not need to handle an otherwise unused sentinel value.
-
-Enumerators defined in this way should be recorded using the two argument
-version of `UMA_HISTOGRAM_ENUMERATION`:
-```
+
+`kMaxValue` is a special enumerator that must share the highest enumerator
+value, typically done by aliasing it with the enumerator with the highest
+value: clang automatically checks that `kMaxValue` is correctly set for `enum
+class`.
+
+The histogram helpers use the `kMaxValue` convention, and the enum may be
+logged with:
+
+```c++
UMA_HISTOGRAM_ENUMERATION("NewTabPageAction", action);
```
-which automatically deduces the range of the enum from `kMaxValue`.
-If you need to record a histogram based on an enum without kMaxValue, you can
-use the three argument version, which takes the number of buckets as the argument, e.g:
+or:
+
```c++
-UMA_HISTOGRAM_ENUMERATION("NewTabPageAction", action,
- NewTabPageAction_MaxValue + 1);
+UmaHistogramEnumeration("NewTabPageAction", action);
```
-This is often seen with enums defined with a sentinal enumerator value at the
-end, relying on the compiler to keep the value up to date:
+#### Legacy Enums
+
+**Note: this method of defining histogram enums is deprecated. Do not use this
+for new enums.**
+
+Many legacy enums define a `kCount` sentinel, reying on the compiler to
+automatically update it when new entries are added:
+
```c++
enum class NewTabPageAction {
kUseOmnibox = 0,
kClickTitle = 1,
- kOpenBookmark = 2,
+ // kUseSearchbox = 2, // no longer used, combined into omnibox
+ kOpenBookmark = 3,
kCount,
};
+```
+These enums must be recorded using the legacy helpers:
+
+```c++
UMA_HISTOGRAM_ENUMERATION("NewTabPageAction", action, NewTabPageAction::kCount);
```
-Finally, if your enum histogram has a catch-all / miscellaneous bucket, put that
-bucket first (`= 0`). This will make the bucket easy to find on the dashboard
-if later you add additional buckets to your histogram.
+or:
+
+```c++
+UmaHistogramEnumeration("NewTabPageAction", action, NewTabPageAction::kCount);
+```
### Flag Histograms
@@ -291,13 +314,21 @@ contact someone from the OWNERS file.
Histogram expiry is specified by **'expires_after'** attribute in histogram
descriptions in histograms.xml. The attribute can be specified as date in
-**YYYY-MM-DD** format or as Chrome milestone in **M**\*(e.g. M68) format. After
-a histogram expires, it will not be recorded (nor uploaded to the UMA servers).
-The code to record it becomes dead code, and should be removed from the
-codebase along with marking the histogram definition as obsolete. However, if
-histogram would remain useful, the expiration should be extended accordingly
-before it becomes expired. If histogram you care about already expired, see
-[Expired Histogram Whitelist](#Expired-histogram-whitelist).
+**YYYY-MM-DD** format or as Chrome milestone in **M**\*(e.g. M68) format. In the
+latter case, the actual expiry date is about 12 weeks after that branch is cut,
+or basically when it is replaced on the "stable" channel by the following
+release.
+
+After a histogram expires, it will cease to be displayed on the dashboard.
+However, the client may continue to send data for that histogram for some time
+after the official expiry date so simply bumping the 'expires_after' date in
+HEAD may be sufficient to resurrect it without any discontinuity. If too much
+time has passed and the client is no longer sending data, it can be re-enabled
+via Finch: see [Expired Histogram Whitelist](#Expired-histogram-whitelist).
+
+Once a histogram has expired, the code to record it becomes dead code and should
+be removed from the codebase along with marking the histogram definition as
+obsolete.
In **rare** cases, the expiry can be set to "never". This is used to denote
metrics of critical importance that are, typically, used for other reports.
diff --git a/chromium/tools/metrics/histograms/enums.xml b/chromium/tools/metrics/histograms/enums.xml
index e6ecb2ff8ef..3da3bc2b1ac 100644
--- a/chromium/tools/metrics/histograms/enums.xml
+++ b/chromium/tools/metrics/histograms/enums.xml
@@ -839,6 +839,9 @@ Unknown properties are collapsed to zero. -->
<int value="0" label="Automatic password generation"/>
<int value="1" label="'Manage all passwords' link"/>
<int value="2" label="Autofill suggestion"/>
+ <int value="3" label="'Manage all credit cards' link"/>
+ <int value="4" label="'Manage all addresses' link"/>
+ <int value="5" label="Manual password generation"/>
</enum>
<enum name="AccessoryBarContents">
@@ -858,6 +861,8 @@ Unknown properties are collapsed to zero. -->
<enum name="AccessorySuggestionType">
<int value="0" label="USERNAME"/>
<int value="1" label="PASSWORD"/>
+ <int value="2" label="PAYMENT_INFO"/>
+ <int value="3" label="ADDRESS_INFO"/>
</enum>
<enum name="AccessPasswordInSettingsEvent">
@@ -1760,6 +1765,9 @@ Unknown properties are collapsed to zero. -->
</enum>
<enum name="AndroidWebViewVariationsEnableState">
+ <obsolete>
+ Removed from code July 2018. Variations in WebView has launched.
+ </obsolete>
<int value="0" label="DEFAULT_ENABLED"/>
<int value="1" label="CONTROL_DISABLED"/>
<int value="2" label="EXPERIMENT_ENABLED"/>
@@ -1880,6 +1888,7 @@ Unknown properties are collapsed to zero. -->
<int value="33" label="Waiting for native data"/>
<int value="34" label="App install dialog shown"/>
<int value="35" label="Cannot check service worker for null start URL"/>
+ <int value="36" label="prefer_related_applications set to true"/>
</enum>
<enum name="AppBannersInstallEvent">
@@ -2098,6 +2107,18 @@ Unknown properties are collapsed to zero. -->
<int value="4" label="Launched From SearchBox"/>
</enum>
+<enum name="AppListLaunchRecorderError">
+ <int value="0" label="kStateReadError"/>
+ <int value="1" label="kStateWriteError"/>
+ <int value="2" label="kStateFromProtoError"/>
+ <int value="3" label="kStateToProtoError"/>
+ <int value="4" label="kNoStateProto"/>
+ <int value="5" label="kInvalidUserId"/>
+ <int value="6" label="kInvalidSecret"/>
+ <int value="7" label="kMaxEventsPerUploadExceeded"/>
+ <int value="8" label="kLaunchTypeUnspecified"/>
+</enum>
+
<enum name="AppListOmniboxResult">
<int value="0" label="QUERY_SUGGESTION"/>
<int value="1" label="ZERO_STATE_SUGEESTION"/>
@@ -2165,7 +2186,7 @@ Unknown properties are collapsed to zero. -->
<int value="13" label="Omnibox, Recently Visited Website"/>
<int value="14" label="Omnibox, Recent Doc In Drive"/>
<int value="15" label="Omnibox, Web Query"/>
- <int value="16" label="Omnibox, History"/>
+ <int value="16" label="OMNIBOX_HISTORY_DEPRECATED"/>
<int value="17" label="Arc++ App"/>
<int value="18" label="Arc++ Reinstall App"/>
<int value="19" label="Internal App"/>
@@ -2175,6 +2196,9 @@ Unknown properties are collapsed to zero. -->
<int value="23" label="AppDataResult, Person From Contacts"/>
<int value="24" label="AppDataResult, Note Document"/>
<int value="25" label="Omnibox, Assistant"/>
+ <int value="26" label="Omnibox, Search History"/>
+ <int value="27" label="Omnibox, Search Suggest"/>
+ <int value="28" label="Omnibox, Personalzied Suggestion"/>
</enum>
<enum name="AppListSearchResultDisplayType">
@@ -2182,6 +2206,7 @@ Unknown properties are collapsed to zero. -->
<int value="1" label="LIST"/>
<int value="2" label="TILE"/>
<int value="3" label="RECOMMENDATION"/>
+ <int value="4" label="CARD"/>
</enum>
<enum name="ApplistSearchResultOpenedSource">
@@ -2472,6 +2497,7 @@ Unknown properties are collapsed to zero. -->
<int value="3" label="M_TO_N"/>
<int value="4" label="M_TO_P"/>
<int value="5" label="N_TO_P"/>
+ <int value="6" label="P_TO_Q"/>
</enum>
<enum name="ArcShareFilesOnExit">
@@ -2523,6 +2549,7 @@ Unknown properties are collapsed to zero. -->
<int value="16" label="App started from link context menu"/>
<int value="17" label="App started from Smart Text Selection context menu"/>
<int value="18" label="App started from Kiosk Next Home"/>
+ <int value="19" label="Interaction with gamepad"/>
</enum>
<enum name="ArcVideoDecodeAcceleratorResult">
@@ -3340,6 +3367,13 @@ Unknown properties are collapsed to zero. -->
<int value="19" label="No initial scripts"/>
</enum>
+<enum name="AutofillAssistantOnBoarding">
+ <int value="0" label="Shown"/>
+ <int value="1" label="Not shown (returning user)"/>
+ <int value="2" label="Accepted"/>
+ <int value="3" label="Cancelled"/>
+</enum>
+
<enum name="AutofillCardholderNameFixFlowPromptEvent">
<int value="0" label="Shown"/>
<int value="1" label="Accepted"/>
@@ -3394,8 +3428,9 @@ Unknown properties are collapsed to zero. -->
<int value="12" label="User requested to provide cardholder name"/>
<int value="13" label="Max strikes, did not show infobar (mobile only)"/>
<int value="14" label="User requested to provide expiration date"/>
- <int value="15" label="Card was not in a supported bin range"/>
- <int value="16" label="Upload was offered for a dynamic form"/>
+ <int value="15" label="Upload was offered for a non-focusable form"/>
+ <int value="16" label="Card was not in a supported bin range"/>
+ <int value="17" label="Upload was offered for a dynamic form"/>
</enum>
<enum name="AutofillCardUploadEnabled">
@@ -3835,6 +3870,17 @@ Unknown properties are collapsed to zero. -->
<int value="3" label="User navigated away from page while bubble hidden"/>
</enum>
+<enum name="AutofillLocalCardMigrationDecisionMetric">
+ <int value="0" label="Migration offered"/>
+ <int value="1" label="User used new card"/>
+ <int value="2" label="Failed migration prerequisites"/>
+ <int value="3" label="Reached max strikes"/>
+ <int value="4" label="No migratable cards"/>
+ <int value="5" label="Get upload details RPC failed"/>
+ <int value="6" label="All cards are unsupported"/>
+ <int value="7" label="Single local card"/>
+</enum>
+
<enum name="AutofillLocalCardMigrationDialogOffer">
<int value="0" label="Shown"/>
<int value="1" label="Not shown due to legal message being invalid"/>
@@ -4147,6 +4193,11 @@ Unknown properties are collapsed to zero. -->
<int value="13" label="A field was populated by autofill"/>
</enum>
+<enum name="AutofillValuePatterns">
+ <int value="0" label="No pattern found"/>
+ <int value="1" label="UPI VPA"/>
+</enum>
+
<enum name="AutofillWalletAddressConversionType">
<int value="0" label="Merged with existing local profile"/>
<int value="1" label="Added as a new local profile"/>
@@ -4207,6 +4258,15 @@ Unknown properties are collapsed to zero. -->
<int value="1" label="kBrightnessPercent"/>
</enum>
+<enum name="AutoScreenBrightnessModelLoadingStatus">
+ <int value="0" label="Success"/>
+ <int value="1" label="MissingGlobal"/>
+ <int value="2" label="IllFormattedGlobal"/>
+ <int value="3" label="MissingPersonal"/>
+ <int value="4" label="IllFormattedPersonal"/>
+ <int value="5" label="MissingIterationCount"/>
+</enum>
+
<enum name="AutoScreenBrightnessNoBrightnessChangeCause">
<int value="0" label="WaitingForInitialAls"/>
<int value="1" label="WaitingForAvgHorizon"/>
@@ -4217,6 +4277,7 @@ Unknown properties are collapsed to zero. -->
<int value="6" label="FluctuatingAlsDecrease"/>
<int value="7" label="MinimalAlsChange"/>
<int value="8" label="MissingPersonalCurve"/>
+ <int value="9" label="WaitingForTrainedPersonalCurve"/>
</enum>
<enum name="AutoScreenBrightnessParameterError">
@@ -4487,7 +4548,7 @@ Unknown properties are collapsed to zero. -->
<int value="100" label="OBSOLETE_BDH_EMPTY_OR_INVALID_FILTERS"/>
<int value="101"
label="OBSOLETE_WC_CONTENT_WITH_CERT_ERRORS_BAD_SECURITY_INFO"/>
- <int value="102" label="RFMF_RENDERER_FAKED_ITS_OWN_DEATH"/>
+ <int value="102" label="OBSOLETE_RFMF_RENDERER_FAKED_ITS_OWN_DEATH"/>
<int value="103" label="DWNLD_INVALID_SAVABLE_RESOURCE_LINKS_RESPONSE"/>
<int value="104" label="OBSOLETE_DWNLD_INVALID_SERIALIZE_AS_MHTML_RESPONSE"/>
<int value="105" label="BDH_DEVICE_NOT_ALLOWED_FOR_ORIGIN"/>
@@ -4613,6 +4674,7 @@ Unknown properties are collapsed to zero. -->
<int value="213" label="INVALID_INITIATOR_ORIGIN"/>
<int value="214" label="RFHI_BEGIN_NAVIGATION_MISSING_INITIATOR_ORIGIN"/>
<int value="215" label="RFHI_BEGIN_NAVIGATION_NON_WEBBY_TRANSITION"/>
+ <int value="216" label="RFH_NO_MATCHING_NAVIGATION_REQUEST_ON_COMMIT"/>
</enum>
<enum name="BadMessageReasonExtensions">
@@ -5039,6 +5101,14 @@ Unknown properties are collapsed to zero. -->
<int value="2" label="Unknown"/>
</enum>
+<enum name="BluetoothTransportType">
+ <int value="0" label="Unknown"/>
+ <int value="1" label="Classic"/>
+ <int value="2" label="Low Energy"/>
+ <int value="3" label="Dual"/>
+ <int value="4" label="Invalid"/>
+</enum>
+
<enum name="BlueZReasonOfDisconnection">
<int value="1" label="Disconnected by local host"/>
<int value="2" label="Disconnected by remote device"/>
@@ -5149,6 +5219,7 @@ Unknown properties are collapsed to zero. -->
<int value="4" label="Wrench menu"/>
<int value="5" label="Bookmark manager"/>
<int value="6" label="Omnibox suggestion"/>
+ <int value="7" label="Top application menu (Mac, etc.)"/>
</enum>
<enum name="BookmarkManagerCommand">
@@ -5161,7 +5232,7 @@ Unknown properties are collapsed to zero. -->
<int value="6" label="Open in incognito"/>
<int value="7" label="Undo"/>
<int value="8" label="Redo"/>
- <int value="9" label="Open (double click/enter)"/>
+ <int value="9" label="Open bookmark or folder (deprecated)"/>
<int value="10" label="Select all"/>
<int value="11" label="Deselect all"/>
<int value="12" label="Copy"/>
@@ -5173,6 +5244,8 @@ Unknown properties are collapsed to zero. -->
<int value="18" label="Import"/>
<int value="19" label="Export"/>
<int value="20" label="Help center"/>
+ <int value="21" label="Open bookmark (via double-click / enter)"/>
+ <int value="22" label="Open folder (via double-click / enter)"/>
</enum>
<enum name="BookmarkManagerMenuSource">
@@ -5256,6 +5329,11 @@ Unknown properties are collapsed to zero. -->
<int value="1" label="Allowed"/>
</enum>
+<enum name="BooleanAlreadyUpdating">
+ <int value="0" label="Not Already Updating"/>
+ <int value="1" label="Already Updating"/>
+</enum>
+
<enum name="BooleanAnchorElementSameHost">
<int value="0" label="Anchor element has different host than document host"/>
<int value="1" label="Anchor element has same host as document host"/>
@@ -5271,6 +5349,56 @@ Unknown properties are collapsed to zero. -->
<int value="1" label="Attempted"/>
</enum>
+<enum name="BooleanAutofillFillAfterSuggestion">
+ <int value="0" label="User chose to fill"/>
+ <int value="1" label="User did not choose to fill"/>
+</enum>
+
+<enum name="BooleanAutofillFillingAcceptance">
+ <int value="0" label="No suggestion accepted"/>
+ <int value="1" label="At least one suggestion accepted"/>
+</enum>
+
+<enum name="BooleanAutofillFillingAssistance">
+ <int value="0" label="No assistance"/>
+ <int value="1" label="Fields were filled"/>
+</enum>
+
+<enum name="BooleanAutofillFillingCorrectness">
+ <int value="0" label="User edited filled fields"/>
+ <int value="1" label="No filled fields were edited"/>
+</enum>
+
+<enum name="BooleanAutofillFillingReadiness">
+ <int value="0" label="No data available to fill"/>
+ <int value="1" label="Some data available to fill"/>
+</enum>
+
+<enum name="BooleanAutofillInteractionAfterParsedAsType">
+ <int value="0" label="No interaction"/>
+ <int value="1" label="Interaction observed"/>
+</enum>
+
+<enum name="BooleanAutofillParsedAsType">
+ <int value="0" label="Different type"/>
+ <int value="1" label="This type"/>
+</enum>
+
+<enum name="BooleanAutofillSubmission">
+ <int value="0" label="Form was abandoned"/>
+ <int value="1" label="Form was submitted"/>
+</enum>
+
+<enum name="BooleanAutofillSubmissionAfterFill">
+ <int value="0" label="Not submitted"/>
+ <int value="1" label="Submitted"/>
+</enum>
+
+<enum name="BooleanAutofillSuggestionAfterInteraction">
+ <int value="0" label="Not shown"/>
+ <int value="1" label="Shown"/>
+</enum>
+
<enum name="BooleanAvailable">
<int value="0" label="Not Available"/>
<int value="1" label="Available"/>
@@ -5716,6 +5844,11 @@ Unknown properties are collapsed to zero. -->
<int value="1" label="Has slow paths with non-AA paint"/>
</enum>
+<enum name="BooleanHasStrongValidators">
+ <int value="0" label="Lacks strong validators"/>
+ <int value="1" label="Has strong validators"/>
+</enum>
+
<enum name="BooleanHasWithheldHosts">
<int value="0" label="Does not have withheld hosts"/>
<int value="1" label="Has withheld hosts"/>
@@ -5851,6 +5984,11 @@ Unknown properties are collapsed to zero. -->
<int value="1" label="Main frame"/>
</enum>
+<enum name="BooleanMarkedForReload">
+ <int value="0" label="Not marked for reload"/>
+ <int value="1" label="Marked for reload"/>
+</enum>
+
<enum name="BooleanMatched">
<int value="0" label="Not matched"/>
<int value="1" label="Matched"/>
@@ -5896,6 +6034,11 @@ Unknown properties are collapsed to zero. -->
<int value="1" label="Needs to be duplications cleared"/>
</enum>
+<enum name="BooleanNeedsNormalization">
+ <int value="0" label="Doesn't need normalization"/>
+ <int value="1" label="Needs normalization"/>
+</enum>
+
<enum name="BooleanNetworkQuietBeforeSwap">
<int value="0" label="FMP OK, network not yet quiet"/>
<int value="1" label="FMP not OK, network was already quiet"/>
@@ -5946,6 +6089,11 @@ Unknown properties are collapsed to zero. -->
<int value="1" label="Opted-in"/>
</enum>
+<enum name="BooleanOptedOut">
+ <int value="0" label="Not opted-out"/>
+ <int value="1" label="Opted-out"/>
+</enum>
+
<enum name="BooleanOptionConditionsChanged">
<int value="0" label="Conditions unchanged"/>
<int value="1" label="Conditions changed"/>
@@ -6034,6 +6182,11 @@ Unknown properties are collapsed to zero. -->
<int value="1" label="Present"/>
</enum>
+<enum name="BooleanProcessReuseDisallowed">
+ <int value="0" label="Process reuse allowed"/>
+ <int value="1" label="Process reuse disallowed"/>
+</enum>
+
<enum name="BooleanProfileSignedIn">
<int value="0" label="Profile was not Signed In"/>
<int value="1" label="Profile was Signed In"/>
@@ -6355,6 +6508,7 @@ Unknown properties are collapsed to zero. -->
<int value="2" label="HTTP_STREAM_FACTORY_JOB_ALT"/>
<int value="3" label="HTTP_STREAM_FACTORY_JOB_MAIN"/>
<int value="4" label="QUIC_HTTP_STREAM"/>
+ <int value="5" label="HTTP_NETWORK_TRANSACTION"/>
</enum>
<enum name="BrotliFilterDecodingStatus">
@@ -6445,6 +6599,13 @@ Unknown properties are collapsed to zero. -->
<int value="11" label="kNetworkErrorLogging"/>
</enum>
+<enum name="BrowsingInstancePluralityVisibilityState">
+ <int value="0" label="Single visible page"/>
+ <int value="1" label="Single non-visible page"/>
+ <int value="2" label="Multiple pages, at least one of which is visible"/>
+ <int value="3" label="Multiple pages, all of which are non-visible"/>
+</enum>
+
<enum name="BubbleDismissalReason">
<int value="0" label="The timer dismissed the bubble."/>
<int value="1" label="A tap inside the bubble caused dismissal."/>
@@ -6533,6 +6694,7 @@ Unknown properties are collapsed to zero. -->
<int value="21" label="RenderPassDrawQuad has unconvertable filters."/>
<int value="22" label="RenderPassDrawQuad has a sorting context id."/>
<int value="23" label="Too many RenderPassDrawQuads."/>
+ <int value="24" label="Unsupported rounded corner rect."/>
</enum>
<enum name="CanMakePaymentUsage">
@@ -6998,6 +7160,9 @@ histogram as enum -->
</enum>
<enum name="ChromeChannelForHistogram">
+ <obsolete>
+ Relevant histogram (DidSuppressJavaScriptException) expired 2018-08.
+ </obsolete>
<int value="0" label="UNKNOWN"/>
<int value="1" label="CANARY"/>
<int value="2" label="DEV"/>
@@ -7049,6 +7214,19 @@ histogram as enum -->
<int value="2" label="First service disabled"/>
</enum>
+<enum name="ChromeOSCameraErrorType">
+ <int value="1" label="Device"/>
+ <int value="2" label="Request"/>
+ <int value="3" label="Result"/>
+ <int value="4" label="Buffer"/>
+</enum>
+
+<enum name="ChromeOSCameraFacing">
+ <int value="0" label="Back"/>
+ <int value="1" label="Front"/>
+ <int value="2" label="External"/>
+</enum>
+
<enum name="ChromeOSColorProfile">
<summary>See ui/display/display_constants.h for the variation.</summary>
<int value="0" label="Standard"/>
@@ -8662,6 +8840,29 @@ Called by update_net_error_codes.py.-->
<int value="2" label="Will use composited scrolling"/>
</enum>
+<enum name="CompositorAnimationsFailureReason">
+ <int value="0" label="No failure"/>
+ <int value="1" label="Accelerated animations disabled"/>
+ <int value="2" label="Effect suppressed by devtools"/>
+ <int value="3" label="Either the animation or effect is invalid"/>
+ <int value="4" label="Effect has unsupported timing parameters"/>
+ <int value="5" label="Effect has a composite mode other than 'replace'"/>
+ <int value="6" label="Target element has invalid compositing state"/>
+ <int value="7" label="Target element has other incompatible animations"/>
+ <int value="8" label="Target element has a CSS offset"/>
+ <int value="9"
+ label="Target element has multiple transform properties specified"/>
+ <int value="10" label="Animation affects non-CSS properties"/>
+ <int value="11"
+ label="Transform related property cannot be animated on the target
+ element"/>
+ <int value="12" label="Transform related property depends on box size"/>
+ <int value="13" label="Filter related property moves pixels"/>
+ <int value="14" label="Animation has an unsupported CSS property"/>
+ <int value="15"
+ label="There are multiple transform animations on the target element"/>
+</enum>
+
<enum name="CompositorFrameSinkSubmitResult">
<int value="0" label="Accepted"/>
<int value="1" label="CopyOutputResults not allowed"/>
@@ -8720,6 +8921,7 @@ Called by update_net_error_codes.py.-->
<int value="11" label="FAILURE_SESSION_RATE_IMPACT_PARSE"/>
<int value="12" label="FAILURE_SESSION_RATE_IMPACT_UNKNOWN_FEATURE"/>
<int value="13" label="FAILURE_TRACKING_ONLY_PARSE"/>
+ <int value="14" label="SUCCESS_FROM_SOURCE"/>
</enum>
<enum name="ConfusionMatrix">
@@ -8808,6 +9010,7 @@ Called by update_net_error_codes.py.-->
<int value="21" label="QUIC/43"/>
<int value="22" label="QUIC/99"/>
<int value="23" label="QUIC/44"/>
+ <int value="27" label="QUIC/999"/>
</enum>
<enum name="ConnectionResult">
@@ -9171,8 +9374,12 @@ Called by update_net_error_codes.py.-->
<int value="44" label="USB guard"/>
<int value="45" label="Background fetch"/>
<int value="46" label="Intent picker display"/>
- <int value="47" label="Serial guard"/>
- <int value="48" label="Serial permission data"/>
+ <int value="47" label="Idle detection"/>
+ <int value="48" label="Serial guard"/>
+ <int value="49" label="Serial permission data"/>
+ <int value="50" label="Periodic background sync"/>
+ <int value="51" label="HID guard"/>
+ <int value="52" label="HID permission data"/>
</enum>
<enum name="ContentTypeParseableResult">
@@ -9276,6 +9483,9 @@ Called by update_net_error_codes.py.-->
</enum>
<enum name="ContextMenuOption">
+ <obsolete>
+ Removed from code as of 5/2019.
+ </obsolete>
<summary>The item selected from a context menu</summary>
<int value="0" label="Open in new tab"/>
<int value="1" label="Open in incognito tab"/>
@@ -9317,6 +9527,75 @@ Called by update_net_error_codes.py.-->
<int value="37" label="Share link"/>
<int value="38" label="Sneak peek (Ephemeral tab)"/>
<int value="39" label="Sneak peek for image (Ephemeral tab)"/>
+ <int value="40" label="Go to URL"/>
+</enum>
+
+<enum name="ContextMenuOptionAndroid">
+ <summary>The item selected from a context menu on Android.</summary>
+ <int value="0" label="Open in new tab"/>
+ <int value="1" label="Open in incognito tab"/>
+ <int value="2" label="Copy link address"/>
+ <int value="3" label="Copy email address"/>
+ <int value="4" label="Copy link text"/>
+ <int value="5" label="Save link"/>
+ <int value="6" label="Save image"/>
+ <int value="7" label="Open image"/>
+ <int value="8" label="Open image in new tab"/>
+ <int value="9" label="Search by image"/>
+ <int value="10" label="Load original image"/>
+ <int value="11" label="Save video"/>
+ <int value="12" label="Share image"/>
+ <int value="13" label="Open in new/other window"/>
+ <int value="14" label="Send email"/>
+ <int value="15" label="Add to contacts"/>
+ <int value="16" label="Call"/>
+ <int value="17" label="Send text message"/>
+ <int value="18" label="Copy phone number"/>
+ <int value="19" label="Open in new Chrome tab (CCT)"/>
+ <int value="20" label="Open in Chrome incognito tab (CCT)"/>
+ <int value="21" label="Open in browser (CCT)"/>
+ <int value="22" label="Open in Chrome (Fullscreen)"/>
+ <int value="23" label="Share link"/>
+ <int value="24" label="Preview page (Ephemeral tab)"/>
+ <int value="25" label="Preview image (Ephemeral tab)"/>
+</enum>
+
+<enum name="ContextMenuOptionDesktop">
+ <summary>The item selected from a context menu on Desktop.</summary>
+ <int value="0" label="Open in new tab"/>
+ <int value="1" label="Open in incognito tab"/>
+ <int value="2" label="Copy link address"/>
+ <int value="3" label="Copy link text"/>
+ <int value="4" label="Save link"/>
+ <int value="5" label="Save image"/>
+ <int value="6" label="Open image in new tab"/>
+ <int value="7" label="Copy image"/>
+ <int value="8" label="Copy image URL"/>
+ <int value="9" label="Search by image"/>
+ <int value="10" label="Open link in a new window"/>
+ <int value="11" label="Print"/>
+ <int value="12" label="Search web for..."/>
+ <int value="13" label="Save media as"/>
+ <int value="14" label="Spellcheck suggestion"/>
+ <int value="15" label="Add to dictionary"/>
+ <int value="16" label="Context spelling toggle (Use enhanced spell check)"/>
+ <int value="17" label="Cut text"/>
+ <int value="18" label="Paste text"/>
+ <int value="19" label="Go to URL"/>
+</enum>
+
+<enum name="ContextMenuOptionIOS">
+ <summary>The item selected from a context menu on iOS.</summary>
+ <int value="0" label="Open in new tab"/>
+ <int value="1" label="Open in incognito tab"/>
+ <int value="2" label="Copy link address"/>
+ <int value="3" label="Save image"/>
+ <int value="4" label="Open image"/>
+ <int value="5" label="Open image in new tab"/>
+ <int value="6" label="Copy image"/>
+ <int value="7" label="Search by image"/>
+ <int value="8" label="Open (JavaScript evaluation)"/>
+ <int value="9" label="Read Later"/>
</enum>
<enum name="ContextMenuSaveImage">
@@ -9617,12 +9896,18 @@ Called by update_net_error_codes.py.-->
</enum>
<enum name="ContextualSuggestions.ClickDuration">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<int value="0" label="Short (&lt;4 seconds)"/>
<int value="1" label="Medium (4-180 seconds)"/>
<int value="2" label="Long (&gt;180 seconds)"/>
</enum>
<enum name="ContextualSuggestions.Event">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<int value="0" label="Uninitialized"/>
<int value="1" label="Fetch delayed"/>
<int value="2" label="Fetch requested"/>
@@ -9812,6 +10097,31 @@ Called by update_net_error_codes.py.-->
<int value="2" label="Cache miss"/>
</enum>
+<enum name="CorbCanonicalMimeType">
+ <summary>Coarse MIME type classification for CORB decisions.</summary>
+ <int value="0" label="Html">
+ https://mimesniff.spec.whatwg.org/#html-mime-type.
+ </int>
+ <int value="1" label="Xml">
+ https://mimesniff.spec.whatwg.org/#xml-mime-type, except `image/svg+xml` and
+ `application/dash+xml`.
+ </int>
+ <int value="2" label="Json">
+ https://mimesniff.spec.whatwg.org/#json-mime-type.
+ </int>
+ <int value="3" label="Plain">text/plain</int>
+ <int value="4" label="Others">
+ Other, unrecognized MIME type. Blocked if sniffing finds a JSON security
+ prefix.
+ </int>
+ <int value="5" label="NeverSniffed">
+ Used for content types that are unlikely to be incorrectly applied to
+ images, scripts and other legacy no-cors resources (which consequently don't
+ need any confimation sniffing). For example: `application/pdf`,
+ `application/zip`, etc.
+ </int>
+</enum>
+
<enum name="CorbResultVsInitiatorLockCompatibility">
<summary>
Whether CORB blocking might have been caused by treating |request_initiator|
@@ -9920,30 +10230,91 @@ Called by update_net_error_codes.py.-->
<int value="1094926916" label="ACBD (Sand)"/>
<int value="1094926917" label="ACBE (Santa)"/>
<int value="1094926918" label="ACBF (Bruce)"/>
+ <int value="1094993739" label="ADGK (Laser14)"/>
+ <int value="1095520840" label="ALRH (Sion)"/>
+ <int value="1095716933" label="AOPE (Jax)"/>
+ <int value="1095784537" label="APXY (Wukong)"/>
<int value="1095909961" label="ARBI (Soraka)"/>
<int value="1095980364" label="ASUL (Cave)"/>
<int value="1095980366" label="ASUN (Basking)"/>
<int value="1095980367" label="ASUO (Bob)"/>
+ <int value="1111707468" label="BCOL (Ampton)"/>
+ <int value="1111771479" label="BDIW (Sparky360)"/>
+ <int value="1128420697" label="CBUY (Pantheon)"/>
+ <int value="1129075526" label="CLSF (Alan)"/>
<int value="1129336916" label="CPPT (Nasher)"/>
<int value="1129597253" label="CTIE (Astronaut)"/>
+ <int value="1129927505" label="CYSQ (Phaser360)"/>
+ <int value="1145193796" label="DBED (Wukong)"/>
<int value="1145389384" label="DEAH (Asuka)"/>
<int value="1146640980" label="DXZT (Scarlet)"/>
+ <int value="1162826827" label="EOTK (Wukong)"/>
+ <int value="1178752080" label="FBTP (Blacktip360)"/>
+ <int value="1179734090" label="FQPJ (Karma)"/>
+ <int value="1179736649" label="FQZI (Bigdaddy)"/>
+ <int value="1179862873" label="FSGY (Meep)"/>
+ <int value="1180128843" label="FWVK (Bobba360)"/>
+ <int value="1196055126" label="GJZV (Syndra)"/>
+ <int value="1196378965" label="GOKU (Babymega)"/>
+ <int value="1212568135" label="HFRG (Sona)"/>
+ <int value="1212699214" label="HHRN (Careena)"/>
+ <int value="1213156680" label="HOMH (Sparky)"/>
+ <int value="1213159245" label="HOWM (Nospike)"/>
<int value="1213225551" label="HPZO (Snappy)"/>
<int value="1213225554" label="HPZR (Chell)"/>
<int value="1213352282" label="HRIZ (Whitetip)"/>
+ <int value="1229478471" label="IHZG (Mimrock)"/>
<int value="1229870420" label="INUT (Nasher360)"/>
+ <int value="1230326865" label="IULQ (Whitetip)"/>
+ <int value="1246124610" label="JFZB (Liara)"/>
+ <int value="1247369291" label="JYXK (Bluebird)"/>
<int value="1262568010" label="KABJ (Robo360)"/>
+ <int value="1263291223" label="KLKW (Fleex)"/>
+ <int value="1279349582" label="LASN (Phaser)"/>
<int value="1279607114" label="LEAJ (Sentry)"/>
<int value="1279607118" label="LEAN (Pyro)"/>
<int value="1280264001" label="LOGA (Gru)"/>
<int value="1280264007" label="LOGG (Poppy)"/>
+ <int value="1280264008" label="LOGH (Whitetip)"/>
+ <int value="1296254030" label="MCDN (Dumo)"/>
+ <int value="1296256847" label="MCOO (Sarien)"/>
+ <int value="1297634649" label="MXUY (Aleena)"/>
+ <int value="1312969043" label="NBQS (Nocturne)"/>
+ <int value="1313819972" label="NOMD (Shyvana)"/>
+ <int value="1313883459" label="NPEC (Vayne)"/>
<int value="1314212940" label="NULL (not yet assigned)"/>
+ <int value="1330008133" label="OFPE (Kasumi360)"/>
+ <int value="1346851142" label="PGQF (Grabbiter)"/>
+ <int value="1346918722" label="PHYB (Teemo)"/>
+ <int value="1347961935" label="PXDO (Barla)"/>
<int value="1364874584" label="QZUX (Robo)"/>
+ <int value="1380535111" label="RIKG (Blacktip)"/>
+ <int value="1381388877" label="RVRM (Abra)"/>
<int value="1397244238" label="SHAN (Lava)"/>
<int value="1397571914" label="SMAJ (Kevin)"/>
+ <int value="1397571916" label="SMAL (NautilusLTE)"/>
+ <int value="1397703489" label="SOCA (Akali360)"/>
+ <int value="1413829460" label="TEST (testing label)"/>
+ <int value="1414219090" label="TKER (Orbatrix)"/>
+ <int value="1414353733" label="TMSE (Wukong)"/>
+ <int value="1414547534" label="TPHN (Whitetip)"/>
+ <int value="1414943322" label="TVRZ (Blacktip360)"/>
+ <int value="1430733145" label="UGAY (Kasumi)"/>
+ <int value="1431460420" label="URZD (Whitetip)"/>
+ <int value="1447581000" label="VHUH (Bobba)"/>
<int value="1448498499" label="VVUC (blue)"/>
+ <int value="1464686165" label="WMVU (Epaulette)"/>
+ <int value="1465408071" label="WXZG (Blacktip)"/>
+ <int value="1482053969" label="XVYQ (Apel)"/>
+ <int value="1482115653" label="XWJE (atlas)"/>
+ <int value="1497913685" label="YHYU (Arcada)"/>
+ <int value="1498238293" label="YMMU (DruWL)"/>
+ <int value="1498432325" label="YPCE (Rabbid)"/>
+ <int value="1498956363" label="YXBK (Kench)"/>
+ <int value="1498957124" label="YXED (Babytiger)"/>
<int value="1515408205" label="ZSKM (Nautilus)"/>
<int value="1515864390" label="ZZAF (Eve)"/>
+ <int value="1515864914" label="ZZCR (Early prod samples)"/>
</enum>
<enum name="CrashExitCodes">
@@ -12270,6 +12641,13 @@ Called by update_net_error_codes.py.-->
<int value="33" label="Network panel film strip started recording"/>
</enum>
+<enum name="DevToolsBackgroundService">
+ <int value="2" label="Background Fetch"/>
+ <int value="3" label="Background Sync"/>
+ <int value="4" label="Push Messaging"/>
+ <int value="5" label="Notifications"/>
+</enum>
+
<enum name="DevToolsPanel">
<int value="1" label="Elements"/>
<int value="2" label="Resources"/>
@@ -12631,7 +13009,7 @@ Called by update_net_error_codes.py.-->
</enum>
<enum name="DllHash">
-<!-- Generated by chrome_elf/dll_hash/dll_hash_main.cc -->
+<!-- Generated by chrome/chrome_elf/dll_hash/dll_hash_main.cc -->
<int value="26393601" label="wajam_goblin_64.dll"/>
<int value="44551499" label="949ba8b6a9.dll"/>
@@ -14019,6 +14397,29 @@ Called by update_net_error_codes.py.-->
<int value="362" label="configprofile"/>
<int value="363" label="internetconnect"/>
<int value="364" label="networkconnect"/>
+ <int value="365" label="bmp"/>
+ <int value="366" label="css"/>
+ <int value="367" label="ehtml"/>
+ <int value="368" label="flac"/>
+ <int value="369" label="ico"/>
+ <int value="370" label="jfif"/>
+ <int value="371" label="m4a"/>
+ <int value="372" label="m4v"/>
+ <int value="373" label="mpeg"/>
+ <int value="374" label="mpg"/>
+ <int value="375" label="oga"/>
+ <int value="376" label="ogg"/>
+ <int value="377" label="ogm"/>
+ <int value="378" label="ogv"/>
+ <int value="379" label="opus"/>
+ <int value="380" label="pjp"/>
+ <int value="381" label="pjpeg"/>
+ <int value="382" label="svgz"/>
+ <int value="383" label="text"/>
+ <int value="384" label="tiff"/>
+ <int value="385" label="weba"/>
+ <int value="386" label="webm"/>
+ <int value="387" label="xbm"/>
</enum>
<enum name="DownloadItem.DangerType">
@@ -14171,6 +14572,12 @@ Called by update_net_error_codes.py.-->
<int value="4" label="Same as source"/>
</enum>
+<enum name="DownloadResumptionRestartCountType">
+ <int value="0" label="Requested by server response"/>
+ <int value="1" label="Strong validators changed"/>
+ <int value="2" label="Missing strong validators"/>
+</enum>
+
<enum name="DownloadSavePackageEvent">
<int value="0" label="Started"/>
<int value="1" label="Cancelled"/>
@@ -14409,6 +14816,16 @@ Called by update_net_error_codes.py.-->
<int value="19" label="DXGI_COLOR_SPACE_YCBCR_FULL_GHLG_TOPLEFT_P2020"/>
</enum>
+<enum name="DXGI_FORMAT">
+ <summary>
+ Resource data formats. Defined here:
+ https://github.com/apitrace/dxsdk/blob/master/Include/dxgiformat.h
+ </summary>
+ <int value="87" label="DXGI_FORMAT_B8G8R8A8_UNORM"/>
+ <int value="103" label="DXGI_FORMAT_NV12"/>
+ <int value="107" label="DXGI_FORMAT_YUY2"/>
+</enum>
+
<enum name="DxgiFramePresentationMode">
<int value="0" label="Composed"/>
<int value="1" label="Overlay"/>
@@ -16690,6 +17107,18 @@ Called by update_net_error_codes.py.-->
<int value="554" label="PolicyListMultipleSourceMergeList"/>
<int value="555" label="SamlPasswordExpirationAdvanceWarningDays"/>
<int value="556" label="DeviceScheduledUpdateCheck"/>
+ <int value="557" label="KerberosEnabled"/>
+ <int value="558" label="KerberosRememberPasswordEnabled"/>
+ <int value="559" label="KerberosAddAccountsAllowed"/>
+ <int value="560" label="KerberosAccounts"/>
+ <int value="561" label="StickyKeysEnabled"/>
+ <int value="562" label="DockedMagnifierEnabled"/>
+ <int value="563" label="AppRecommendationZeroStateEnabled"/>
+ <int value="564" label="BrowserSwitcherExternalGreylistUrl"/>
+ <int value="565" label="PolicyDictionaryMultipleSourceMergeList"/>
+ <int value="566" label="CommandLineFlagSecurityWarningsEnabled"/>
+ <int value="567" label="RelaunchHeadsUpPeriod"/>
+ <int value="568" label="StartupBrowserWindowLaunchSuppressed"/>
</enum>
<enum name="EnterprisePolicyInvalidations">
@@ -17777,6 +18206,7 @@ Called by update_net_error_codes.py.-->
<int value="435" label="ACCESSIBILITY_PRIVATE_ON_ANNOUNCE_FOR_ACCESSIBILITY"/>
<int value="436" label="MIME_HANDLER_PRIVATE_SAVE"/>
<int value="437" label="RUNTIME_ON_CONNECT_NATIVE"/>
+ <int value="438" label="ACTION_ON_CLICKED"/>
</enum>
<enum name="ExtensionFileWriteResult">
@@ -19172,6 +19602,16 @@ Called by update_net_error_codes.py.-->
<int value="1330" label="FEEDBACKPRIVATE_LOGINFEEDBACKCOMPLETE"/>
<int value="1331" label="FILEMANAGERPRIVATE_SEARCHFILES"/>
<int value="1332" label="MANAGEMENT_INSTALLREPLACEMENTWEBAPP"/>
+ <int value="1333" label="FILEMANAGERPRIVATE_GETANDROIDPICKERAPPS"/>
+ <int value="1334" label="FILEMANAGERPRIVATE_SELECTANDROIDPICKERAPP"/>
+ <int value="1335" label="AUTOTESTPRIVATE_GETSHELFALIGNMENT"/>
+ <int value="1336" label="AUTOTESTPRIVATE_SETSHELFALIGNMENT"/>
+ <int value="1337" label="BLUETOOTHPRIVATE_RECORDPAIRING"/>
+ <int value="1338" label="FILEMANAGERPRIVATE_SETARCSTORAGETOASTSHOWNFLAG"/>
+ <int value="1339" label="INPUTMETHODPRIVATE_SETCOMPOSITIONRANGE"/>
+ <int value="1340" label="BLUETOOTHPRIVATE_RECORDRECONNECTION"/>
+ <int value="1341" label="LOGINSCREENUI_SHOW"/>
+ <int value="1342" label="LOGINSCREENUI_CLOSE"/>
</enum>
<enum name="ExtensionIconState">
@@ -19208,6 +19648,19 @@ Called by update_net_error_codes.py.-->
<int value="24" label="UPDATE_NON_EXISTING_EXTENSION"/>
</enum>
+<enum name="ExtensionInstallationDownloadingStage">
+ <int value="0" label="PENDING"/>
+ <int value="1" label="QUEUED_FOR_MANIFEST"/>
+ <int value="2" label="DOWNLOADING_MANIFEST"/>
+ <int value="3" label="DOWNLOADING_MANIFEST_RETRY"/>
+ <int value="4" label="PARSING_MANIFEST"/>
+ <int value="5" label="MANIFEST_LOADED"/>
+ <int value="6" label="QUEUED_FOR_CRX"/>
+ <int value="7" label="DOWNLOADING_CRX"/>
+ <int value="8" label="DOWNLOADING_CRX_RETRY"/>
+ <int value="9" label="FINISHED"/>
+</enum>
+
<enum name="ExtensionInstallationFailureReason">
<int value="0" label="UNKNOWN"/>
<int value="1" label="INVALID_ID"/>
@@ -19685,6 +20138,8 @@ Called by update_net_error_codes.py.-->
<int value="214" label="kSystemPowerSource"/>
<int value="215" label="kArcAppsPrivate"/>
<int value="216" label="kEnterpriseHardwarePlatform"/>
+ <int value="217" label="kLoginScreenUi"/>
+ <int value="218" label="kDeclarativeNetRequestFeedback"/>
</enum>
<enum name="ExtensionServiceVerifyAllSuccess">
@@ -20005,10 +20460,66 @@ Called by update_net_error_codes.py.-->
</enum>
<enum name="FeatureModuleInstallStatus">
- <int value="0" label="Success"/>
- <int value="1" label="Failure"/>
- <int value="2" label="Request Error"/>
- <int value="3" label="Cancellation"/>
+ <int value="0" label="Success">Installation succeeded.</int>
+ <int value="1" label="Failure (deprecated)">
+ (deprecated) Catch-all for install failures.
+ </int>
+ <int value="2" label="Request Error (deprecated)">
+ (deprecated) Catch-all for request failures.
+ </int>
+ <int value="3" label="Cancellation">The installation has been cancelled.</int>
+ <int value="4" label="Access Denied">
+ Download not permitted under current device circumstances (e.g. in
+ background).
+ </int>
+ <int value="5" label="Active Sessions Limit Exceeded">
+ Too many sessions are running for current app, existing sessions must be
+ resolved first.
+ </int>
+ <int value="6" label="API Not Available">
+ Split Install API is not available.
+ </int>
+ <int value="7" label="Incompatible with Existing Session">
+ Requested session contains modules from an existing active session and also
+ new modules.
+ </int>
+ <int value="8" label="Insufficient Storage">
+ Install failed due to insufficient storage.
+ </int>
+ <int value="9" label="Invalid Request">Request is otherwise invalid.</int>
+ <int value="10" label="Module Unavailable">
+ A requested module is not available (to this user/device, for the installed
+ apk).
+ </int>
+ <int value="11" label="Network Error">
+ Network error: unable to obtain split details
+ </int>
+ <int value="12" label="No Error"/>
+ <int value="13" label="Service Died">
+ Service handling split install has died.
+ </int>
+ <int value="14" label="Session Not Found">
+ Requested session is not found.
+ </int>
+ <int value="15" label="Splitcompat Copy Error">
+ Error in copying files for SplitCompat.
+ </int>
+ <int value="16" label="Splitcompat Emulation Error">
+ Error in SplitCompat emulation.
+ </int>
+ <int value="17" label="Splitcompat Verification Error">
+ Signature verification error when invoking SplitCompat.
+ </int>
+ <int value="18" label="Internal Error">
+ Unknown error processing split install.
+ </int>
+ <int value="19" label="Split Install Unknown Error">
+ Unmapped error processing split install error code.
+ </int>
+ <int value="20" label="Unknown Request Error">
+ Catch-all for unknown request failures.
+ </int>
+ <int value="21" label="No SplitCompat">SplitCompat has not been enabled.</int>
</enum>
<enum name="FeatureObserver">
@@ -20679,9 +21190,9 @@ Called by update_net_error_codes.py.-->
<int value="665" label="MixedContentFormPresent"/>
<int value="666" label="GetUserMediaInsecureOrigin"/>
<int value="667" label="GetUserMediaSecureOrigin"/>
- <int value="668" label="DeviceMotionInsecureOrigin"/>
+ <int value="668" label="DeviceMotionInsecureOrigin_Obsolete"/>
<int value="669" label="DeviceMotionSecureOrigin"/>
- <int value="670" label="DeviceOrientationInsecureOrigin"/>
+ <int value="670" label="DeviceOrientationInsecureOrigin_Obsolete"/>
<int value="671" label="DeviceOrientationSecureOrigin"/>
<int value="672" label="SandboxViaIFrame"/>
<int value="673" label="SandboxViaCSP"/>
@@ -21012,7 +21523,7 @@ Called by update_net_error_codes.py.-->
<int value="984" label="BluetoothDeviceInstanceId"/>
<int value="985" label="HTMLLabelElementFormIDLAttribute"/>
<int value="986" label="HTMLLabelElementFormContentAttribute"/>
- <int value="987" label="DeviceOrientationAbsoluteInsecureOrigin"/>
+ <int value="987" label="DeviceOrientationAbsoluteInsecureOrigin_Obsolete"/>
<int value="988" label="DeviceOrientationAbsoluteSecureOrigin"/>
<int value="989" label="FontFaceConstructor"/>
<int value="990" label="ServiceWorkerControlledPage"/>
@@ -21345,7 +21856,7 @@ Called by update_net_error_codes.py.-->
<int value="1302" label="V8Document_Scripts_AttributeGetter"/>
<int value="1303" label="V8Document_Anchors_AttributeGetter"/>
<int value="1304" label="V8Document_Applets_AttributeGetter"/>
- <int value="1305" label="XMLHttpRequestCrossOriginWithCredentials"/>
+ <int value="1305" label="OBSOLETE_XMLHttpRequestCrossOriginWithCredentials"/>
<int value="1306" label="MediaStreamTrackRemote"/>
<int value="1307" label="V8Node_IsConnected_AttributeGetter"/>
<int value="1308" label="ShadowRootDelegatesFocus"/>
@@ -22029,7 +22540,6 @@ Called by update_net_error_codes.py.-->
<int value="1973" label="FontShapingNotDefGlyphObserved"/>
<int value="1974" label="PostMessageOutgoingWouldBeBlockedByConnectSrc"/>
<int value="1975" label="PostMessageIncomingWouldBeBlockedByConnectSrc"/>
- <int value="1976" label="PaymentRequestNetworkNameInSupportedMethods"/>
<int value="1977" label="CrossOriginPropertyAccess"/>
<int value="1978" label="CrossOriginPropertyAccessFromOpener"/>
<int value="1979" label="CredentialManagerCreate"/>
@@ -22132,7 +22642,7 @@ Called by update_net_error_codes.py.-->
<int value="2064" label="PresentationRequestStartInsecureOrigin"/>
<int value="2065" label="PersistentClientHintHeader"/>
<int value="2066" label="StyleSheetListNonNullAnonymousNamedGetter"/>
- <int value="2067" label="OffMainThreadFetch"/>
+ <int value="2067" label="OBSOLETE_OffMainThreadFetch"/>
<int value="2068"
label="OBSOLETE_HTMLOptionsCollectionNamedGetterReturnsNodeList"/>
<int value="2069" label="ARIAActiveDescendantAttribute"/>
@@ -22244,16 +22754,16 @@ Called by update_net_error_codes.py.-->
<int value="2174" label="CrossOriginTextHtml"/>
<int value="2175" label="CrossOriginTextPlain"/>
<int value="2176" label="CrossOriginTextXml"/>
- <int value="2177" label="SameOriginWorkerApplicationOctetStream"/>
- <int value="2178" label="SameOriginWorkerApplicationXml"/>
- <int value="2179" label="SameOriginWorkerTextHtml"/>
- <int value="2180" label="SameOriginWorkerTextPlain"/>
- <int value="2181" label="SameOriginWorkerTextXml"/>
- <int value="2182" label="CrossOriginWorkerApplicationOctetStream"/>
- <int value="2183" label="CrossOriginWorkerApplicationXml"/>
- <int value="2184" label="CrossOriginWorkerTextHtml"/>
- <int value="2185" label="CrossOriginWorkerTextPlain"/>
- <int value="2186" label="CrossOriginWorkerTextXml"/>
+ <int value="2177" label="OBSOLETE_SameOriginWorkerApplicationOctetStream"/>
+ <int value="2178" label="OBSOLETE_SameOriginWorkerApplicationXml"/>
+ <int value="2179" label="OBSOLETE_SameOriginWorkerTextHtml"/>
+ <int value="2180" label="OBSOLETE_SameOriginWorkerTextPlain"/>
+ <int value="2181" label="OBSOLETE_SameOriginWorkerTextXml"/>
+ <int value="2182" label="OBSOLETE_CrossOriginWorkerApplicationOctetStream"/>
+ <int value="2183" label="OBSOLETE_CrossOriginWorkerApplicationXml"/>
+ <int value="2184" label="OBSOLETE_CrossOriginWorkerTextHtml"/>
+ <int value="2185" label="OBSOLETE_CrossOriginWorkerTextPlain"/>
+ <int value="2186" label="OBSOLETE_CrossOriginWorkerTextXml"/>
<int value="2187" label="OBSOLETE_ImageCaptureSetOptions"/>
<int value="2188" label="PerformanceObserverForWindow"/>
<int value="2189" label="PerformanceObserverForWorker"/>
@@ -22283,7 +22793,7 @@ Called by update_net_error_codes.py.-->
<int value="2213" label="DocumentSetSelectedStylesheetSet"/>
<int value="2214" label="GeolocationGetCurrentPosition"/>
<int value="2215" label="GeolocationWatchPosition"/>
- <int value="2216" label="DataUriHasOctothorpe"/>
+ <int value="2216" label="OBSOLETE_DataUriHasOctothorpe"/>
<int value="2217" label="NetInfoSaveData"/>
<int value="2218" label="V8Element_GetClientRects_Method"/>
<int value="2219" label="V8Element_GetBoundingClientRect_Method"/>
@@ -22395,7 +22905,7 @@ Called by update_net_error_codes.py.-->
<int value="2324" label="InputTypeFileSecureOriginOpenChooser"/>
<int value="2325" label="InputTypeFileInsecureOriginOpenChooser"/>
<int value="2326" label="BasicShapeEllipseNoRadius"/>
- <int value="2327" label="BasicShapeEllipseOneRadius"/>
+ <int value="2327" label="OBSOLETE_BasicShapeEllipseOneRadius"/>
<int value="2328" label="BasicShapeEllipseTwoRadius"/>
<int value="2329" label="TemporalInputTypeChooserByTrustedClick"/>
<int value="2330" label="TemporalInputTypeChooserByUntrustedClick"/>
@@ -22976,15 +23486,74 @@ Called by update_net_error_codes.py.-->
<int value="2868" label="V8RTCQuicTransport_ReadyToSendDatagram_Method"/>
<int value="2869" label="V8RTCQuicTransport_SendDatagram_Method"/>
<int value="2870" label="V8RTCQuicTransport_ReceiveDatagrams_Method"/>
- <int value="2871"
- label="V8RTCRtpReceiver_JitterBufferDelayHint_AttributeGetter"/>
- <int value="2872"
- label="V8RTCRtpReceiver_JitterBufferDelayHint_AttributeSetter"/>
+ <int value="2871" label="CSSValueContainStyle"/>
+ <int value="2872" label="WebShareSuccessfulContainingFiles"/>
+ <int value="2873" label="WebShareSuccessfulWithoutFiles"/>
+ <int value="2874" label="WebShareUnsuccessfulContainingFiles"/>
+ <int value="2875" label="WebShareUnsuccessfulWithoutFiles"/>
+ <int value="2876" label="VerticalScrollbarThumbScrollingWithMouse"/>
+ <int value="2877" label="VerticalScrollbarThumbScrollingWithTouch"/>
+ <int value="2878" label="HorizontalScrollbarThumbScrollingWithMouse"/>
+ <int value="2879" label="HorizontalScrollbarThumbScrollingWithTouch"/>
+ <int value="2880" label="SMSReceiverStart"/>
+ <int value="2881" label="V8Animation_Pending_AttributeGetter"/>
<int value="2882" label="FocusWithoutUserActivationNotSandboxedNotAdFrame"/>
<int value="2883" label="FocusWithoutUserActivationNotSandboxedAdFrame"/>
<int value="2884" label="FocusWithoutUserActivationSandboxedNotAdFrame"/>
<int value="2885" label="FocusWithoutUserActivationSandboxedAdFrame"/>
+ <int value="2886"
+ label="V8RTCRtpReceiver_JitterBufferDelayHint_AttributeGetter"/>
+ <int value="2887"
+ label="V8RTCRtpReceiver_JitterBufferDelayHint_AttributeSetter"/>
<int value="2888" label="MediaCapabilitiesDecodingInfoWithKeySystemConfig"/>
+ <int value="2889" label="RevertInCustomIdent"/>
+ <int value="2890" label="UnoptimizedImagePolicies"/>
+ <int value="2891" label="VTTCueParser"/>
+ <int value="2892" label="MediaElementTextTrackContainer"/>
+ <int value="2893" label="MediaElementTextTrackList"/>
+ <int value="2894" label="PaymentRequestInitialized"/>
+ <int value="2895" label="PaymentRequestShow"/>
+ <int value="2896" label="PaymentRequestShippingAddressChange"/>
+ <int value="2897" label="PaymentRequestShippingOptionChange"/>
+ <int value="2898" label="PaymentRequestPaymentMethodChange"/>
+ <int value="2899" label="V8Animation_UpdatePlaybackRate_Method"/>
+ <int value="2900" label="TwoValuedOverflow"/>
+ <int value="2901" label="TextFragmentAnchor"/>
+ <int value="2902" label="TextFragmentAnchorMatchFound"/>
+ <int value="2903" label="NonPassiveTouchEventListener"/>
+ <int value="2904" label="PassiveTouchEventListener"/>
+ <int value="2905" label="CSSValueAppearanceSearchCancelForOthers2Rendered"/>
+ <int value="2906" label="WebXrFramebufferScale"/>
+ <int value="2907" label="WebXrIgnoreDepthValues"/>
+ <int value="2908" label="WebXrSessionCreated"/>
+ <int value="2909" label="V8XRReferenceSpace_GetOffsetReferenceSpace_Method"/>
+ <int value="2910" label="V8XRInputSource_Gamepad_AttributeGetter"/>
+ <int value="2911" label="V8XRSession_End_Method"/>
+ <int value="2912" label="V8XRWebGLLayer_Constructor"/>
+ <int value="2913" label="FetchKeepalive"/>
+ <int value="2914" label="CSSTransitionCancelledByRemovingStyle"/>
+ <int value="2915" label="V8RTCRtpSender_SetStreams_Method"/>
+ <int value="2916" label="CookieNoSameSite"/>
+ <int value="2917" label="CookieInsecureAndSameSiteNone"/>
+ <int value="2918" label="UnsizedMediaPolicy"/>
+ <int value="2922" label="FeaturePolicyCommaSeparatedDeclarations"/>
+ <int value="2923" label="FeaturePolicySemicolonSeparatedDeclarations"/>
+ <int value="2932" label="LazyLoadFrameLoadingAttributeEager"/>
+ <int value="2933" label="LazyLoadFrameLoadingAttributeLazy"/>
+ <int value="2934" label="LazyLoadImageLoadingAttributeEager"/>
+ <int value="2935" label="LazyLoadImageLoadingAttributeLazy"/>
+ <int value="2936" label="LazyLoadImageMissingDimensionsForLazy"/>
+</enum>
+
+<enum name="FeaturePolicyAllowlistType">
+ <int value="0" label="Empty"/>
+ <int value="1" label="None"/>
+ <int value="2" label="Self"/>
+ <int value="3" label="Src"/>
+ <int value="4" label="Star"/>
+ <int value="5" label="Origins"/>
+ <int value="6" label="KeywordsOnly"/>
+ <int value="7" label="Mixed"/>
</enum>
<enum name="FeaturePolicyFeature">
@@ -23043,7 +23612,21 @@ Called by update_net_error_codes.py.-->
<int value="47" label="UnoptimizedLosslessImagesStrict"/>
<int value="48" label="LoadingFrameDefaultEager"/>
<int value="49" label="DownloadsWithoutUserActivation"/>
+ <int value="50" label="ExecutionWhileOutOfViewport"/>
+ <int value="51" label="ExecutionWhileNotRendered"/>
<int value="52" label="FocusWithoutUserActivation"/>
+ <int value="53" label="ClientHintDPR"/>
+ <int value="54" label="ClientHintDeviceMemory"/>
+ <int value="55" label="ClientHintDownlink"/>
+ <int value="56" label="ClientHintECT"/>
+ <int value="57" label="ClientHintLang"/>
+ <int value="58" label="ClientHintRTT"/>
+ <int value="59" label="ClientHintUA"/>
+ <int value="60" label="ClientHintUAArch"/>
+ <int value="61" label="ClientHintUAModel"/>
+ <int value="62" label="ClientHintUAPlatform"/>
+ <int value="63" label="ClientHintViewportWidth"/>
+ <int value="64" label="ClientHintWidth"/>
</enum>
<enum name="FeaturePolicyImageCompressionFormat">
@@ -24151,6 +24734,14 @@ Called by update_net_error_codes.py.-->
<int value="14" label="Async DeleteFile Failed"/>
</enum>
+<enum name="FileOpenType">
+ <int value="0" label="Unknown"/>
+ <int value="1" label="Launch"/>
+ <int value="2" label="Open"/>
+ <int value="3" label="SaveAs"/>
+ <int value="4" label="Download"/>
+</enum>
+
<enum name="FileReaderLoaderFailureType">
<int value="0" label="Mojo pipe creation failed"/>
<int value="1" label="Data incomplete after synchronous reading"/>
@@ -24392,6 +24983,79 @@ Called by update_net_error_codes.py.-->
<int value="642" label="NSFileWriteVolumeReadOnlyError"/>
</enum>
+<enum name="FoundationPopularErrorCode">
+ <int value="-3007" label="NSURLErrorDownloadDecodingFailedToComplete"/>
+ <int value="-3006" label="NSURLErrorDownloadDecodingFailedMidStream"/>
+ <int value="-3005" label="NSURLErrorCannotMoveFile"/>
+ <int value="-3004" label="NSURLErrorCannotRemoveFile"/>
+ <int value="-3003" label="NSURLErrorCannotWriteToFile"/>
+ <int value="-3002" label="NSURLErrorCannotCloseFile"/>
+ <int value="-3001" label="NSURLErrorCannotOpenFile"/>
+ <int value="-3000" label="NSURLErrorCannotCreateFile"/>
+ <int value="-2000" label="NSURLErrorCannotLoadFromNetwork"/>
+ <int value="-1206" label="NSURLErrorClientCertificateRequired"/>
+ <int value="-1205" label="NSURLErrorClientCertificateRejected"/>
+ <int value="-1204" label="NSURLErrorServerCertificateNotYetValid"/>
+ <int value="-1203" label="NSURLErrorServerCertificateHasUnknownRoot"/>
+ <int value="-1202" label="NSURLErrorServerCertificateUntrusted"/>
+ <int value="-1201" label="NSURLErrorServerCertificateHasBadDate"/>
+ <int value="-1200" label="NSURLErrorSecureConnectionFailed"/>
+ <int value="-1104" label="NSURLErrorFileOutsideSafeArea"/>
+ <int value="-1103" label="NSURLErrorDataLengthExceedsMaximum"/>
+ <int value="-1102" label="NSURLErrorNoPermissionsToReadFile"/>
+ <int value="-1101" label="NSURLErrorFileIsDirectory"/>
+ <int value="-1100" label="NSURLErrorFileDoesNotExist"/>
+ <int value="-1022"
+ label="NSURLErrorAppTransportSecurityRequiresSecureConnection"/>
+ <int value="-1021" label="NSURLErrorRequestBodyStreamExhausted"/>
+ <int value="-1020" label="NSURLErrorDataNotAllowed"/>
+ <int value="-1019" label="NSURLErrorCallIsActive"/>
+ <int value="-1018" label="NSURLErrorInternationalRoamingOff"/>
+ <int value="-1017" label="NSURLErrorCannotParseResponse"/>
+ <int value="-1016" label="NSURLErrorCannotDecodeContentData"/>
+ <int value="-1015" label="NSURLErrorCannotDecodeRawData"/>
+ <int value="-1014" label="NSURLErrorZeroByteResource"/>
+ <int value="-1013" label="NSURLErrorUserAuthenticationRequired"/>
+ <int value="-1012" label="NSURLErrorUserCancelledAuthentication"/>
+ <int value="-1011" label="NSURLErrorBadServerResponse"/>
+ <int value="-1010" label="NSURLErrorRedirectToNonExistentLocation"/>
+ <int value="-1009" label="NSURLErrorNotConnectedToInternet"/>
+ <int value="-1008" label="NSURLErrorResourceUnavailable"/>
+ <int value="-1007" label="NSURLErrorHTTPTooManyRedirects"/>
+ <int value="-1006" label="NSURLErrorDNSLookupFailed"/>
+ <int value="-1005" label="NSURLErrorNetworkConnectionLost"/>
+ <int value="-1004" label="NSURLErrorCannotConnectToHost"/>
+ <int value="-1003" label="NSURLErrorCannotFindHost"/>
+ <int value="-1002" label="NSURLErrorUnsupportedURL"/>
+ <int value="-1001" label="NSURLErrorTimedOut"/>
+ <int value="-1000" label="NSURLErrorBadURL"/>
+ <int value="-999" label="NSURLErrorCancelled"/>
+ <int value="-997" label="NSURLErrorBackgroundSessionWasDisconnected"/>
+ <int value="-996" label="NSURLErrorBackgroundSessionInUseByAnotherProcess"/>
+ <int value="-995" label="NSURLErrorBackgroundSessionRequiresSharedContainer"/>
+ <int value="-1" label="NSURLErrorUnknown"/>
+ <int value="0" label="NSNoError"/>
+ <int value="4" label="NSFileNoSuchFileError"/>
+ <int value="255" label="NSFileLockingError"/>
+ <int value="256" label="NSFileReadUnknownError"/>
+ <int value="257" label="NSFileReadNoPermissionError"/>
+ <int value="258" label="NSFileReadInvalidFileNameError"/>
+ <int value="259" label="NSFileReadCorruptFileError"/>
+ <int value="260" label="NSFileReadNoSuchFileError"/>
+ <int value="261" label="NSFileReadInapplicableStringEncodingError"/>
+ <int value="262" label="NSFileReadUnsupportedSchemeError"/>
+ <int value="263" label="NSFileReadTooLargeError"/>
+ <int value="264" label="NSFileReadUnknownStringEncodingError"/>
+ <int value="512" label="NSFileWriteUnknownError"/>
+ <int value="513" label="NSFileWriteNoPermissionError"/>
+ <int value="514" label="NSFileWriteInvalidFileNameError"/>
+ <int value="516" label="NSFileWriteFileExistsError"/>
+ <int value="517" label="NSFileWriteInapplicableStringEncodingError"/>
+ <int value="518" label="NSFileWriteUnsupportedSchemeError"/>
+ <int value="640" label="NSFileWriteOutOfSpaceError"/>
+ <int value="642" label="NSFileWriteVolumeReadOnlyError"/>
+</enum>
+
<enum name="FramebustInterventionOutcome">
<int value="0" label="Accepted"/>
<int value="1" label="Declined and navigated"/>
@@ -24429,7 +25093,27 @@ Called by update_net_error_codes.py.-->
<int value="7" label="Allowed navigation, user gesture, ad frame"/>
</enum>
+<enum name="FrameSiteInstanceProcessRelationship">
+ <summary>
+ Used to describe the relationship between frames hosted in a process,
+ indicating whether or not there are any frames in the process that share the
+ same SiteInstance.
+ </summary>
+ <int value="0" label="All frames have distinct SiteInstances"/>
+ <int value="1" label="Some frames have the same SiteInstance"/>
+</enum>
+
+<enum name="FrameVisibility">
+ <int value="0" label="Rendered but not in the current viewport"/>
+ <int value="1" label="Rendered in current viewport"/>
+ <int value="2"
+ label="Not visible, no layout object created (e.g., display: none)"/>
+</enum>
+
<enum name="FtpDataConnectionError">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<int value="0" label="Data connection successful"/>
<int value="1" label="Local firewall blocked the connection"/>
<int value="2" label="Connection timed out"/>
@@ -24467,6 +25151,9 @@ Called by update_net_error_codes.py.-->
</enum>
<enum name="FtpServerType2">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<summary>
FTP server type as defined in net/ftp/ftp_server_type_histograms.h
</summary>
@@ -26570,6 +27257,19 @@ Called by update_net_error_codes.py.-->
<int value="7" label="Error adding a new key"/>
</enum>
+<enum name="GetOriginIdResult">
+ <int value="0" label="Success with pre-provisioned origin ID"/>
+ <int value="1" label="Success with newly provisioned origin ID"/>
+ <int value="2" label="Success with unprovisioned origin ID"/>
+ <int value="3"
+ label="Failed on device that supports per-application provisioning"/>
+ <int value="4"
+ label="Failed on device that doesn't support per-application
+ provisioning"/>
+ <int value="5"
+ label="Failed as no factory associated with the profile found"/>
+</enum>
+
<enum name="GetOutputDeviceInfoCacheHit">
<int value="0" label="Miss: no cached sink found">
Output parmeters for a device are requested, and there is no corresponding
@@ -26826,6 +27526,11 @@ Called by update_net_error_codes.py.-->
<int value="2" label="Clicked, intent failed"/>
</enum>
+<enum name="GoogleUpdateNotificationLaunchEvent">
+ <int value="0" label="Start"/>
+ <int value="1" label="Start activity failed"/>
+</enum>
+
<enum name="GoogleUpdateUpgradeStatus">
<int value="0" label="UPGRADE_STARTED"/>
<int value="1" label="UPGRADE_CHECK_STARTED"/>
@@ -26969,6 +27674,11 @@ Called by update_net_error_codes.py.-->
<int value="67" label="User Disabled WIN10_RS5"/>
<int value="68" label="Fallback to Software WIN10_RS5"/>
<int value="69" label="Status Unknown WIN10_RS5"/>
+ <int value="70" label="Enabled WIN10_19H1"/>
+ <int value="71" label="Blacklisted WIN10_19H1"/>
+ <int value="72" label="User Disabled WIN10_19H1"/>
+ <int value="73" label="Fallback to Software WIN10_19H1"/>
+ <int value="74" label="Status Unknown WIN10_19H1"/>
</enum>
<enum name="GPUBlacklistTestResultPerEntry">
@@ -27796,6 +28506,24 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="2" label="Dismissed"/>
</enum>
+<enum name="HeapProfilingMode">
+ <int value="0" label="None"/>
+ <int value="1" label="Minimal"/>
+ <int value="2" label="All"/>
+ <int value="3" label="Browser"/>
+ <int value="4" label="Gpu"/>
+ <int value="5" label="Renderer Sampling"/>
+ <int value="6" label="All renderers"/>
+ <int value="7" label="Manual"/>
+</enum>
+
+<enum name="HeapProfilingProcessType">
+ <int value="0" label="Other"/>
+ <int value="1" label="Browser"/>
+ <int value="2" label="Renderer"/>
+ <int value="3" label="GPU"/>
+</enum>
+
<enum name="HeavyPageCappingInfoBarInteraction">
<int value="0" label="InfoBar shown">
The user was shown the capping heavy pages InfoBar.
@@ -27818,6 +28546,16 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="2" label="Both devices, pointing and keyboard, detected."/>
</enum>
+<enum name="HintCacheStoreEntryType">
+ <summary>
+ Possible store entry types contained within the HintCacheStore.
+ </summary>
+ <int value="0" label="Unknown"/>
+ <int value="1" label="Metadata"/>
+ <int value="2" label="Component Hint"/>
+ <int value="3" label="Fetched Hint"/>
+</enum>
+
<enum name="HistogramActivityReport">
<int value="0" label="Reports created"/>
<int value="1" label="Histograms created"/>
@@ -28945,6 +29683,9 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<enum name="IMESwitchType">
<int value="0" label="By tray menu">IME switches by tray menu</int>
<int value="1" label="By accelerator">IME switches by accelerator</int>
+ <int value="2" label="By mode change key">
+ IME switches by mode change key
+ </int>
</enum>
<enum name="IMEVKLayout">
@@ -29124,6 +29865,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="90" label="INLINE_UPDATE_FAILED_INFOBAR_ANDROID"/>
<int value="91" label="FLASH_DEPRECATION_INFOBAR_DELEGATE"/>
<int value="92" label="SEND_TAB_TO_SELF_INFOBAR_DELEGATE"/>
+ <int value="93" label="TAB_SHARING_INFOBAR_DELEGATE"/>
</enum>
<enum name="InfoBarResponse">
@@ -29812,6 +30554,40 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="35" label="Ran by google.com/intl/ (deprecated)"/>
</enum>
+<enum name="InsecureDownloadExtensions">
+ <int value="0" label="kUnknown"/>
+ <int value="1" label="kNone"/>
+ <int value="2" label="kImage"/>
+ <int value="3" label="kArchive"/>
+ <int value="4" label="kAudio"/>
+ <int value="5" label="kVideo"/>
+ <int value="6" label="kMSExecutable"/>
+ <int value="7" label="kMacExecutable"/>
+ <int value="8" label="kWeb"/>
+ <int value="9" label="kText"/>
+ <int value="10" label="kMSOffice"/>
+ <int value="11" label="kPDF"/>
+ <int value="12" label="kCRX"/>
+ <int value="13" label="kAPK"/>
+ <int value="14" label="kBIN"/>
+ <int value="15" label="kSH"/>
+ <int value="16" label="kVB"/>
+ <int value="17" label="kSWF"/>
+ <int value="18" label="kICO"/>
+ <int value="19" label="kEPUB"/>
+ <int value="20" label="kICS"/>
+ <int value="21" label="kSVG"/>
+</enum>
+
+<enum name="InsecureDownloadSecurityStatus">
+ <int value="0" label="kInitiatorUnknownFileSecure"/>
+ <int value="1" label="kInitiatorUnknownFileInsecure"/>
+ <int value="2" label="kInitiatorSecureFileSecure"/>
+ <int value="3" label="kInitiatorSecureFileInsecure"/>
+ <int value="4" label="kInitiatorInsecureFileSecure"/>
+ <int value="5" label="kInitiatorInsecureFileInsecure"/>
+</enum>
+
<enum name="InsignificantPlaybackReason">
<int value="0" label="Frame size too small"/>
<int value="1" label="Audio muted"/>
@@ -29842,6 +30618,14 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="5" label="Check complete, site is a PWA"/>
</enum>
+<enum name="InstallationCounterReasonEnum">
+ <int value="0" label="User"/>
+ <int value="1" label="Default App"/>
+ <int value="2" label="OEM"/>
+ <int value="3" label="Policy based App"/>
+ <int value="4" label="Unknown Reason"/>
+</enum>
+
<enum name="InstallStatus">
<int value="0" label="FIRST_INSTALL_SUCCESS"/>
<int value="1" label="INSTALL_REPAIRED"/>
@@ -30972,6 +31756,22 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="3" label="Consumer manual launch"/>
</enum>
+<enum name="KioskNextHomeBridgeAction">
+ <int value="0" label="List apps"/>
+ <int value="1" label="Launch app"/>
+ <int value="2" label="Uninstall app"/>
+ <int value="3" label="Notified of app change"/>
+ <int value="4" label="Get ARC Android id"/>
+ <int value="5" label="Launch intent"/>
+ <int value="6" label="Get user info"/>
+</enum>
+
+<enum name="KioskNextHomeLaunchIntentResult">
+ <int value="0" label="Success"/>
+ <int value="1" label="Not allowed"/>
+ <int value="2" label="ARC not available"/>
+</enum>
+
<enum name="LanguageCode">
<summary>ISO 639 Language Codes.</summary>
<int value="24929" label="Afar"/>
@@ -31518,6 +32318,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<enum name="LanguageSettingsPageType">
<int value="0" label="Main"/>
<int value="1" label="Add Language"/>
+ <int value="2" label="Language Details">iOS only.</int>
</enum>
<enum name="LargestContentType">
@@ -31620,6 +32421,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="12" label="Trusted Web Activity"/>
<int value="13" label="WebShareTarget (WebAPK)"/>
<int value="14" label="External intent from Chrome (WebAPK)"/>
+ <int value="15" label="WebShareTarget for Files (WebAPK)"/>
</enum>
<enum name="LaunchIntentFlags">
@@ -32284,6 +33086,12 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="9" label="Parent access button"/>
</enum>
+<enum name="LockToSingleUserResult">
+ <int value="0" label="Success"/>
+ <int value="1" label="No response"/>
+ <int value="2" label="Failed to lock"/>
+</enum>
+
<enum name="LoginConsumerWhitelist">
<int value="0" label="ANY_USER_ALLOWED">Any user can sign in</int>
<int value="1" label="ONLY_WHITELISTED_ALLOWED">Whitelisted users only</int>
@@ -32308,8 +33116,10 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-2133892372" label="ResamplingInputEvents:disabled"/>
<int value="-2133277113" label="CCTModuleCustomHeader:disabled"/>
<int value="-2132591642" label="enable-input-view"/>
+ <int value="-2132161378" label="SendTabToSelfHistory:disabled"/>
<int value="-2131746498"
label="AutofillUseImprovedLabelDisambiguation:enabled"/>
+ <int value="-2129940395" label="WebAssemblySimd:disabled"/>
<int value="-2128705444" label="AssistantAppSupport:enabled"/>
<int value="-2124839789"
label="OmniboxUIExperimentHideSteadyStateUrlSchemeAndSubdomains:enabled"/>
@@ -32349,7 +33159,6 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
label="AutofillCreditCardLastUsedDateDisplay:enabled"/>
<int value="-2080504230" label="TabHoverCards:disabled"/>
<int value="-2077268643" label="disable-device-enumeration"/>
- <int value="-2076250656" label="MojoIMF:enabled"/>
<int value="-2075870708" label="MediaRemotingEncrypted:disabled"/>
<int value="-2075807193" label="enable-webusb-on-any-origin"/>
<int value="-2075725205" label="disable-new-zip-unpacker"/>
@@ -32364,6 +33173,8 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-2061363134"
label="AutofillSaveCreditCardUsesStrikeSystemV2:disabled"/>
<int value="-2059771509" label="NTPTilesLowerResolutionFavicons:disabled"/>
+ <int value="-2058762785"
+ label="AllowDownloadResumptionWithoutStrongValidators:disabled"/>
<int value="-2058656447" label="ContextualSearchUrlActions:enabled"/>
<int value="-2054612904" label="BuiltInModuleInfra:enabled"/>
<int value="-2053860791" label="XGEOVisibleNetworks:enabled"/>
@@ -32397,13 +33208,17 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-2013551096" label="ViewsSimplifiedFullscreenUI:disabled"/>
<int value="-2013124655" label="EnableEphemeralFlashPermission:disabled"/>
<int value="-2012990889" label="SpannableInlineAutocomplete:enabled"/>
+ <int value="-2011532551" label="SignedExchangeSubresourcePrefetch:disabled"/>
<int value="-2010634516" label="OmniboxLocalEntitySuggestions:disabled"/>
<int value="-2009622663" label="WebRtcHWH264Encoding:enabled"/>
+ <int value="-2009172938" label="DragToPinTabs:disabled"/>
<int value="-2008272679" label="disable-webrtc-hw-encoding"/>
<int value="-2005089558" label="BackgroundVideoTrackOptimization:disabled"/>
+ <int value="-2004882388" label="AutofillPruneSuggestions:enabled"/>
<int value="-2004231189" label="AppNotificationStatusMessaging:disabled"/>
<int value="-2003354337"
label="enable-search-button-in-omnibox-for-str-or-iip"/>
+ <int value="-2002461806" label="ShoppingAssist:enabled"/>
<int value="-2001869199" label="ShillSandboxing:enabled"/>
<int value="-2000567059" label="SimplifyHttpsIndicator:enabled"/>
<int value="-1999892428" label="force-ui-direction"/>
@@ -32413,6 +33228,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
label="OmniboxGroupSuggestionsBySearchVsUrl:enabled"/>
<int value="-1992319691" label="AvoidFlashBetweenNavigation:enabled"/>
<int value="-1989747818" label="TabStripKeyboardFocus:disabled"/>
+ <int value="-1985452239" label="SmartDim20190221:disabled"/>
<int value="-1985239289" label="AutofillRichMetadataQueries:enabled"/>
<int value="-1985025593" label="file-manager-enable-new-gallery"/>
<int value="-1983569861" label="WebXROrientationSensorDevice:disabled"/>
@@ -32426,7 +33242,6 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1971086581" label="print-scaling"/>
<int value="-1965587041" label="omnibox-tab-switch-suggestions"/>
<int value="-1964261747" label="WebVrVsyncAlign:disabled"/>
- LoginCustomFlags
<int value="-1963427770" label="EmojiHandwritingVoiceInput:disabled"/>
<int value="-1963402827" label="enable-topchrome-md"/>
<int value="-1962749353" label="SimplifiedNTP:enabled"/>
@@ -32448,6 +33263,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1948540128" label="disable-webrtc-hw-encoding (deprecated)"/>
<int value="-1946595906" label="enable-push-api-background-mode"/>
<int value="-1946522787" label="VrCustomTabBrowsing:disabled"/>
+ <int value="-1946367770" label="SyncWifiConfigurations:enabled"/>
<int value="-1945524394" label="EnableBackgroundBlur:disabled"/>
<int value="-1943817505" label="SingleClickAutofill:enabled"/>
<int value="-1943507605" label="enable-new-video-renderer"/>
@@ -32466,6 +33282,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1937077699" label="http-form-warning"/>
<int value="-1934661084" label="ForceUnifiedConsentBump:disabled"/>
<int value="-1933425042" label="OfflinePreviews:enabled"/>
+ <int value="-1932609987" label="CSSBackdropFilter:disabled"/>
<int value="-1932379839"
label="OmniboxUIExperimentHideSteadyStateUrlTrivialSubdomains:enabled"/>
<int value="-1930720286" label="nacl-debug-mask"/>
@@ -32487,6 +33304,8 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1907342706" label="ReadItLaterInMenu:disabled"/>
<int value="-1903365454" label="SyncPseudoUSSPreferences:disabled"/>
<int value="-1899715534" label="GamepadPollingInterval:enabled"/>
+ <int value="-1899409297"
+ label="ProcessSharingWithStrictSiteInstances:disabled"/>
<int value="-1895719323" label="VrBrowsingTabsView:enabled"/>
<int value="-1894699049" label="AudioFocusEnforcement:disabled"/>
<int value="-1893668420"
@@ -32494,7 +33313,6 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1892555086" label="disable-compositor-animation-timelines"/>
<int value="-1892000374" label="SeccompSandboxAndroid:enabled"/>
<int value="-1890374564" label="OobeRecommendAppsScreen:disabled"/>
- <int value="-1890060129" label="MojoIMF:disabled"/>
<int value="-1888273969" label="tab-capture-upscale-quality"/>
<int value="-1887862464" label="SpannableInlineAutocomplete:disabled"/>
<int value="-1887053262"
@@ -32505,6 +33323,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1882330924" label="NTPArticleSuggestions:enabled"/>
<int value="-1881250251" label="InterestFeedContentSuggestions:disabled"/>
<int value="-1880355454" label="disable-topchrome-md"/>
+ <int value="-1879877238" label="disable-cancel-all-touches"/>
<int value="-1876881908"
label="disable-infobar-for-protected-media-identifier"/>
<int value="-1875383510" label="UseGoogleLocalNtp:disabled"/>
@@ -32530,13 +33349,16 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1860481724" label="ChromeHomeExpandButton:enabled"/>
<int value="-1859095876" label="Previews:disabled"/>
<int value="-1856902397" label="LoadingWithMojo:enabled"/>
+ <int value="-1855347512" label="FormControlsRefresh:disabled"/>
<int value="-1854432127" label="ChromeHomePullToRefreshIphAtTop:disabled"/>
<int value="-1854372227" label="VrBrowsingExperimentalFeatures:enabled"/>
+ <int value="-1853570433" label="AdvancedPpdAttributes:enabled"/>
<int value="-1849706663" label="enable-password-force-saving:disabled"/>
<int value="-1847835522" label="disable-touch-adjustment"/>
<int value="-1847776781"
label="enable-loading-ipc-optimization-for-small-resources"/>
<int value="-1844754731" label="Mash:disabled"/>
+ <int value="-1840608422" label="AdvancedPpdAttributes:disabled"/>
<int value="-1839874877" label="WebXROrientationSensorDevice:enabled"/>
<int value="-1839496458" label="disable-file-manager-touch-mode"/>
<int value="-1838482444" label="disable-settings-window"/>
@@ -32552,6 +33374,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1817209284" label="PayWithGoogleV1:enabled"/>
<int value="-1816066138" label="CastAllowAllIPs:enabled"/>
<int value="-1812579951" label="ContentSuggestionsCategoryRanker:enabled"/>
+ <int value="-1811949013" label="SameSiteByDefaultCookies:disabled"/>
<int value="-1811394154" label="disable-webrtc-hw-vp8-encoding"/>
<int value="-1810294310" label="AndroidPaymentApps:enabled"/>
<int value="-1809891158" label="WebAuthenticationCable:enabled"/>
@@ -32561,6 +33384,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1807797669" label="google-doodle-url"/>
<int value="-1804485171" label="disable-fullscreen-tab-detaching"/>
<int value="-1802502753" label="enable-manual-password-generation:enabled"/>
+ <int value="-1799801575" label="CookieDeprecationMessages:enabled"/>
<int value="-1798337879" label="enable-md-downloads"/>
<int value="-1797739460" label="brotli-encoding:disabled"/>
<int value="-1791226955" label="BreakingNewsPush:enabled"/>
@@ -32577,6 +33401,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1768672408" label="ChromeDuplex:disabled"/>
<int value="-1768308156" label="OmniboxDedupeGoogleDriveURLs:enabled"/>
<int value="-1767470652" label="out-of-process-pdf"/>
+ <int value="-1766648764" label="OmniboxShortBookmarkSuggestions:disabled"/>
<int value="-1766129470" label="DataSaverLiteModeRebranding:disabled"/>
<int value="-1758468685" label="DownloadHomeV2:disabled"/>
<int value="-1755301960" label="ClearOldBrowsingData:enabled"/>
@@ -32592,6 +33417,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1736075054" label="EnableFullscreenAppList:enabled"/>
<int value="-1735643253" label="enable-display-list-2d-canvas"/>
<int value="-1734254845" label="ash-enable-night-light"/>
+ <int value="-1732888954" label="UseButtonTranslateBubbleUI:enabled"/>
<int value="-1732561795" label="ConsistentOmniboxGeolocation:enabled"/>
<int value="-1731149013" label="AndroidMessagesIntegration:enabled"/>
<int value="-1729926412" label="enable-webusb-notifications"/>
@@ -32608,8 +33434,6 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1714128884" label="disable-launcher-search-provider-api"/>
<int value="-1713564656" label="ProtectSyncCredentialOnReauth:enabled"/>
<int value="-1711751318" label="enable-data-reduction-proxy-lo-fi-preview"/>
- <int value="-1711283256"
- label="AutofillSaveCardSignInAfterLocalSave:enabled"/>
<int value="-1710772665" label="disable-my-files-navigation"/>
<int value="-1704472714" label="UseMessagesGoogleComDomain:disabled"/>
<int value="-1703709912" label="enable-new-ntp"/>
@@ -32630,6 +33454,8 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1677715989" label="UnifiedConsent:disabled"/>
<int value="-1676256979"
label="AutofillUpstreamUseGooglePayOnAndroidBranding:enabled"/>
+ <int value="-1672160462"
+ label="SwapSideVolumeButtonsForOrientation:disabled"/>
<int value="-1670137340"
label="OptimizeLoadingIPCForSmallResources:disabled"/>
<int value="-1669486359" label="ImportantSitesInCBD:enabled"/>
@@ -32641,9 +33467,13 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1655535052" label="enable-pointer-events"/>
<int value="-1654344175" label="disable-extension-info-dialog"/>
<int value="-1653838003" label="PauseBackgroundTabs:enabled"/>
+ <int value="-1652173255"
+ label="OmniboxUIExperimentShowPlaceholderWhenCaretShowing:enabled"/>
<int value="-1650769314" label="enable-webgl2-compute-context"/>
<int value="-1649778035" label="disable-clear-browsing-data-counters"/>
<int value="-1648216169" label="NewOmniboxAnswerTypes:disabled"/>
+ <int value="-1645071473" label="ChromeColors:disabled"/>
+ <int value="-1641832607" label="DragToPinTabs:enabled"/>
<int value="-1638815914" label="enable-experimental-productivity-features"/>
<int value="-1634878515" label="ChromeHomeModernLayout:enabled"/>
<int value="-1634490190"
@@ -32677,6 +33507,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1599538279" label="enable-md-policy-page"/>
<int value="-1596859081" label="WebAuthenticationPINSupport:enabled"/>
<int value="-1596559650" label="max-tiles-for-interest-area"/>
+ <int value="-1596489715" label="AutoScreenBrightness:enabled"/>
<int value="-1594298767" label="FullscreenToolbarReveal:enabled"/>
<int value="-1586642651" label="MaterialDesignExtensions:disabled"/>
<int value="-1585733447" label="ContextualSearchUnityIntegration:disabled"/>
@@ -32741,6 +33572,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1503851906" label="EnableSettingsShortcutSearch:enabled"/>
<int value="-1498681588" label="AndroidWebContentsDarkMode:enabled"/>
<int value="-1498334893" label="ExperimentalVRFeatures:enabled"/>
+ <int value="-1497450774" label="TreatUnsafeDownloadsAsActive:disabled"/>
<int value="-1497338981" label="disable-accelerated-overflow-scroll"/>
<int value="-1492934655" label="TabSwitcherOnReturn:enabled"/>
<int value="-1492589689" label="ContentSuggestionsCategories:enabled"/>
@@ -32750,6 +33582,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1488744539" label="QuickUnlockFingerprint:enabled"/>
<int value="-1487243228" label="NewUsbBackend:disabled"/>
<int value="-1486198877" label="VrIconInDaydreamHome:disabled"/>
+ <int value="-1485461805" label="EnterpriseReportingInBrowser:enabled"/>
<int value="-1482730792" label="stop-in-background:enabled"/>
<int value="-1482685863" label="enable-request-tablet-site"/>
<int value="-1481990501" label="Windows10CustomTitlebar:disabled"/>
@@ -32761,6 +33594,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1473878093" label="HideArcMediaNotifications:disabled"/>
<int value="-1473668019" label="token-binding:disabled"/>
<int value="-1473136627" label="enable-web-payments"/>
+ <int value="-1472825316" label="ContextualSearchLongpressResolve:enabled"/>
<int value="-1471021059"
label="OmniboxUIExperimentShowSuggestionFavicons:disabled"/>
<int value="-1469536698" label="ChromeHomeDoodle:enabled"/>
@@ -32779,6 +33613,9 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1456627355" label="EnableEmojiContextMenu:disabled"/>
<int value="-1456004000" label="VrShell:disabled"/>
<int value="-1455852875" label="WebAuthentication:disabled"/>
+ <int value="-1455559065"
+ label="OmniboxUIExperimentShowPlaceholderWhenCaretShowing:disabled"/>
+ <int value="-1454479680" label="FileHandlingAPI:enabled"/>
<int value="-1454397907" label="OptimizationHints:disabled"/>
<int value="-1451644187" label="OverviewSwipeToClose:enabled"/>
<int value="-1450576851" label="OmniboxUIExperimentVerticalLayout:enabled"/>
@@ -32833,6 +33670,8 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1385221197"
label="AllowSignedHTTPExchangeCertsWithoutExtension:enabled"/>
<int value="-1383597259" label="SyncUserConsentSeparateType:disabled"/>
+ <int value="-1383145700"
+ label="AutofillDoNotMigrateUnsupportedLocalCards:enabled"/>
<int value="-1382671832" label="OmniboxUIExperimentVerticalMargin:enabled"/>
<int value="-1377186702" label="DesktopIOSPromotion:disabled"/>
<int value="-1376510363" label="ServiceWorkerScriptFullCodeCache:disabled"/>
@@ -32875,14 +33714,18 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1327676774" label="disable-accelerated-mjpeg-decode"/>
<int value="-1326463296" label="SSLCommittedInterstitials:disabled"/>
<int value="-1325887476" label="NewPrintPreview:enabled"/>
+ <int value="-1324029365" label="EnableTLS13EarlyData:enabled"/>
<int value="-1322882747" label="disable-datasaver-prompt"/>
<int value="-1319688939" label="ignore-gpu-blacklist"/>
<int value="-1318914924" label="OverflowIconsForMediaControls:enabled"/>
<int value="-1314603238" label="ChromeHomePullToRefreshIphAtTop:enabled"/>
+ <int value="-1313810940" label="StrictOriginIsolation:disabled"/>
<int value="-1311575452"
label="AutofillEnforceMinRequiredFieldsForUpload:disabled"/>
<int value="-1311133348" label="VrBrowsingNativeAndroidUi:enabled"/>
<int value="-1310737697" label="MaterialDesignSettings:enabled"/>
+ <int value="-1309828996"
+ label="AutofillSaveCreditCardUsesImprovedMessaging:enabled"/>
<int value="-1308600417" label="NewNetErrorPageUI:disabled"/>
<int value="-1304957199" label="OfflinePagesShowAlternateDinoPage:enabled"/>
<int value="-1304758527" label="SyncSendTabToSelf:disabled"/>
@@ -32892,6 +33735,8 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1294050129" label="ContentFullscreen:disabled"/>
<int value="-1292615467"
label="OmniboxSuggestionTransparencyOptions:disabled"/>
+ <int value="-1290471006"
+ label="EnableHistoryFaviconsGoogleServerQuery:enabled"/>
<int value="-1290053302"
label="OfflinePagesInDownloadHomeOpenInCct:disabled"/>
<int value="-1289678848" label="SystemDownloadManager:enabled"/>
@@ -32939,11 +33784,13 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1235586511" label="enable-datasaver-prompt"/>
<int value="-1234740672" label="UsePdfCompositorServiceForPrint:disabled"/>
<int value="-1232629319" label="ResamplingScrollEvents:disabled"/>
+ <int value="-1230610048" label="SyncWifiConfigurations:disabled"/>
<int value="-1227660915" label="WebContentsOcclusion:disabled"/>
<int value="-1225629234" label="SyncPseudoUSSFavicons:enabled"/>
<int value="-1225198073" label="ReaderModeInCCT:disabled"/>
<int value="-1224962996" label="PwaImprovedSplashScreen:disabled"/>
<int value="-1222805155" label="PdfIsolation:enabled"/>
+ <int value="-1222556118" label="VirtualDesks:disabled"/>
<int value="-1218608640" label="disable-offline-load-stale-cache"/>
<int value="-1217462552"
label="OmniboxUIExperimentHideSteadyStateUrlTrivialSubdomains:disabled"/>
@@ -32964,6 +33811,7 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1201183153" label="enable-centered-app-list"/>
<int value="-1199159971"
label="ContextualSuggestionsIPHReverseScroll:enabled"/>
+ <int value="-1197245070" label="CookieDeprecationMessages:disabled"/>
<int value="-1197035323" label="ZeroSuggestRedirectToChrome:disabled"/>
<int value="-1195194959" label="XGEOVisibleNetworks:disabled"/>
<int value="-1190174011" label="enable-hdr"/>
@@ -32989,11 +33837,13 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1160941363" label="AffiliationBasedMatching:disabled"/>
<int value="-1160026273" label="enable-web-notification-custom-layouts"/>
<int value="-1159563774" label="enable-accessibility-script-injection"/>
+ <int value="-1159369873" label="TabGroupsUiImprovementsAndroid:disabled"/>
<int value="-1158993534" label="PrintScaling:enabled"/>
<int value="-1156179600" label="OmniboxRichEntitySuggestions:enabled"/>
<int value="-1155543191" label="CopylessPaste:disabled"/>
<int value="-1154343236" label="VrBrowsingTabsView:disabled"/>
<int value="-1151766565" label="enable-fullscreen-tab-detaching"/>
+ <int value="-1145905507" label="SendTabToSelfWhenSignedIn:disabled"/>
<int value="-1145702446" label="ChromeHomeInactivitySheetExpansion:enabled"/>
<int value="-1145246849" label="ThirdPartyDoodles:enabled"/>
<int value="-1144501989" label="UserActivityPredictionMlService:disabled"/>
@@ -33003,7 +33853,6 @@ Called by update_gpu_driver_bug_workaround_entries.py.-->
<int value="-1137696948" label="enable-chromeos-account-manager"/>
<int value="-1137442543" label="enable-slimming-paint"/>
<int value="-1136627751" label="ignore-autocomplete-off-autofill"/>
- <int value="-1136602572" label="AwaitOptimization:disabled"/>
<int value="-1136509631" label="ssl-interstitial-v1"/>
<int value="-1134307340" label="stop-loading-in-background:enabled"/>
<int value="-1132704128" label="AndroidPaymentAppsFilter:disabled"/>
@@ -33055,6 +33904,9 @@ from previous Chrome versions.
<int value="-1069453905" label="CCTModuleUseIntentExtras:disabled"/>
<int value="-1067635248" label="SpeculativeResourcePrefetching:disabled"/>
<int value="-1064733740" label="ui-show-composited-layer-borders"/>
+ <int value="-1064302126"
+ label="OmniboxAlternateMatchDescriptionSeparator:enabled"/>
+ <int value="-1064082797" label="WebAssemblyCodeGC:disabled"/>
<int value="-1062119671" label="enable-password-force-saving"/>
<int value="-1060395248" label="PasswordSearchMobile:enabled"/>
<int value="-1056310158" label="disable-memory-pressure-chromeos"/>
@@ -33099,6 +33951,7 @@ from previous Chrome versions.
<int value="-996673716" label="enable-web-app-frame"/>
<int value="-994558985" label="EnableNotificationIndicator:disabled"/>
<int value="-994088375" label="VrBrowsingExperimentalRendering:enabled"/>
+ <int value="-993476089" label="AutoScreenBrightness:disabled"/>
<int value="-992785453" label="ExplicitLanguageAsk:disabled"/>
<int value="-991253797"
label="OmniboxSpeculativeServiceWorkerStartOnQueryInput:disabled"/>
@@ -33136,13 +33989,16 @@ from previous Chrome versions.
<int value="-933377608"
label="OmniboxUIExperimentHideSteadyStateUrlScheme:enabled"/>
<int value="-933316841" label="enable-permissions-blacklist"/>
+ <int value="-932474660" label="VirtualDesks:enabled"/>
<int value="-929944930"
label="AutofillRationalizeRepeatedServerPredictions:disabled"/>
<int value="-928138978" label="IPH_DemoMode:disabled"/>
<int value="-926422468" label="disable-embedded-shared-worker"/>
+ <int value="-926236394" label="SendTabToSelfHistory:enabled"/>
<int value="-920204598" label="ScrollAnchorSerialization:enabled"/>
<int value="-918900957" label="AutofillCreditCardAssist:disabled"/>
<int value="-918618075" label="enable-service-worker"/>
+ <int value="-915035507" label="ArcPrintSpoolerExperiment:enabled"/>
<int value="-914210146" label="enable-web-based-signin"/>
<int value="-913294939" label="DriveFS:enabled"/>
<int value="-912456561" label="MidiManagerWinrt:enabled"/>
@@ -33183,6 +34039,7 @@ from previous Chrome versions.
<int value="-860534647" label="SiteDetails:enabled"/>
<int value="-856915246" label="enable-new-audio-rendering-mixing-strategy"/>
<int value="-856016114" label="NTPOfflinePages:disabled"/>
+ <int value="-855277252" label="CookiesWithoutSameSiteMustBeSecure:disabled"/>
<int value="-855130893" label="enable-touch-calibration-setting"/>
<int value="-854716639" label="TranslateAndroidManualTrigger:enabled"/>
<int value="-853594220" label="disable-new-avatar-menu"/>
@@ -33204,6 +34061,7 @@ from previous Chrome versions.
<int value="-820041355" label="enable-transition-compositing"/>
<int value="-816984237" label="OfflinePagesAsyncDownload:enabled"/>
<int value="-816895294" label="DiscoverApp:disabled"/>
+ <int value="-815213125" label="SplitSettings:enabled"/>
<int value="-814097014" label="disable-session-crashed-bubble"/>
<int value="-813753274" label="VrBrowsing:disabled"/>
<int value="-813474479" label="site-per-process"/>
@@ -33220,6 +34078,7 @@ from previous Chrome versions.
<int value="-797310986" label="CSSFragmentIdentifiers:disabled"/>
<int value="-795600188" label="disable-async-dns"/>
<int value="-793921836" label="ShowAllDialogsWithViewsToolkit:disabled"/>
+ <int value="-793383355" label="StrictOriginIsolation:enabled"/>
<int value="-792079435" label="EnableAppsGridGapFeature:disabled"/>
<int value="-790036192" label="overscroll-start-threshold"/>
<int value="-788074946"
@@ -33261,7 +34120,9 @@ from previous Chrome versions.
<int value="-735084806" label="NewTabLoadingAnimation:enabled"/>
<int value="-734301625"
label="AutofillImportNonFocusableCreditCardForms:disabled"/>
+ <int value="-731502579" label="CupsPrintersUiOverhaul:disabled"/>
<int value="-731133967" label="AutofillSettingsCardTypeSplit:disabled"/>
+ <int value="-728461030" label="AutofillPruneSuggestions:disabled"/>
<int value="-727860269" label="WebAuthenticationBle:disabled"/>
<int value="-726892130" label="AndroidMessagesIntegration:disabled"/>
<int value="-723224470" label="enable-password-force-saving:enabled"/>
@@ -33274,6 +34135,7 @@ from previous Chrome versions.
<int value="-716953514" label="disable-password-separated-signin-flow"/>
<int value="-716272467" label="AssistantAppSupport:disabled"/>
<int value="-715733307" label="force-effective-connection-type"/>
+ <int value="-715552057" label="GridLayoutForNtpShortcuts:disabled"/>
<int value="-714712077" label="ClickToOpenPDFPlaceholder:disabled"/>
<int value="-714710496" label="VideoFullscreenOrientationLock:disabled"/>
<int value="-714543772" label="enable-gpu-service-logging"/>
@@ -33304,6 +34166,7 @@ from previous Chrome versions.
<int value="-673804828" label="EnablePlayStoreAppSearch:disabled"/>
<int value="-671992446" label="TranslateRankerEnforcement:disabled"/>
<int value="-670188266" label="enable-zip-archiver-unpacker"/>
+ <int value="-669761849" label="SplitSettings:disabled"/>
<int value="-667517406" label="overscroll-history-navigation"/>
<int value="-667018797"
label="OmniboxUIExperimentBlueTitlesAndGrayUrlsOnPageSuggestions:disabled"/>
@@ -33336,10 +34199,12 @@ from previous Chrome versions.
<int value="-620030047" label="CrosCompUpdates:disabled"/>
<int value="-619740638" label="ListAllDisplayModes:enabled"/>
<int value="-617452890" label="media-router"/>
+ <int value="-616818899" label="SameSiteByDefaultCookies:enabled"/>
<int value="-612633819" label="NotificationScrollBar:disabled"/>
<int value="-612480090" label="FasterLocationReload:enabled"/>
<int value="-610411643" label="enable-printer-app-search"/>
<int value="-606898702" label="MaterialDesignSettings:disabled"/>
+ <int value="-606696801" label="TabGroupsUiImprovementsAndroid:enabled"/>
<int value="-606431158" label="DrawVerticallyEdgeToEdge:enabled"/>
<int value="-604814313" label="enable-pinch"/>
<int value="-604269405"
@@ -33357,6 +34222,7 @@ from previous Chrome versions.
<int value="-592331266" label="ForegroundNotificationManager:enabled"/>
<int value="-589096918" label="ash-enable-fullscreen-app-list"/>
<int value="-579192400" label="disable-input-view"/>
+ <int value="-577982497" label="CupsPrintersUiOverhaul:enabled"/>
<int value="-572112724" label="DialogTouchBar:disabled"/>
<int value="-572012175" label="AssistantEnableStereoAudioInput:disabled"/>
<int value="-571236436" label="AppManagement:disabled"/>
@@ -33370,6 +34236,7 @@ from previous Chrome versions.
<int value="-557742250" label="ContentSuggestionsCategories:disabled"/>
<int value="-548082154" label="protect-sync-credential:disabled"/>
<int value="-547301855" label="SyncPseudoUSSSupervisedUsers:enabled"/>
+ <int value="-544629557" label="CSSBackdropFilter:enabled"/>
<int value="-541611402" label="OfflinePagesPrefetching:enabled"/>
<int value="-540150399" label="TapVisualizerApp:enabled"/>
<int value="-539105193" label="SendTabToSelfBroadcast:disabled"/>
@@ -33439,7 +34306,10 @@ from previous Chrome versions.
<int value="-457174225" label="Av1Decoder:enabled"/>
<int value="-456321929" label="ForceEnableSystemAec:disabled"/>
<int value="-455203267" label="use_new_features_summary"/>
+ <int value="-450976085"
+ label="AutofillSaveCreditCardUsesImprovedMessaging:disabled"/>
<int value="-449465495" label="disable-browser-task-scheduler"/>
+ <int value="-438379844" label="SwapSideVolumeButtonsForOrientation:enabled"/>
<int value="-436470115" label="TouchpadAndWheelScrollLatching:enabled"/>
<int value="-435914745" label="ClipboardContentSetting:disabled"/>
<int value="-430360431" label="disable-password-generation"/>
@@ -33448,6 +34318,7 @@ from previous Chrome versions.
<int value="-424701311" label="SignedHTTPExchange:disabled"/>
<int value="-424544273"
label="enable-experimental-accessibility-chromevox-rich-text-indication"/>
+ <int value="-424134004" label="WebPaymentsExperimentalFeatures:disabled"/>
<int value="-418868128" label="enable-experimental-web-platform-features"/>
<int value="-416660617" label="EnforceTLS13Downgrade:disabled"/>
<int value="-415186532" label="AndroidSiteSettingsUIRefresh:enabled"/>
@@ -33471,6 +34342,8 @@ from previous Chrome versions.
<int value="-385337473" label="enable-fast-unload"/>
<int value="-384589459" label="disable-supervised-user-safesites"/>
<int value="-381181808" label="DragAppsInTabletMode:enabled"/>
+ <int value="-379809954"
+ label="AutofillDoNotMigrateUnsupportedLocalCards:disabled"/>
<int value="-378218969" label="VaapiJpegImageDecodeAcceleration:disabled"/>
<int value="-378180863" label="disable-panels"/>
<int value="-378033324" label="disable-win32k-renderer-lockdown"/>
@@ -33522,6 +34395,7 @@ from previous Chrome versions.
<int value="-322937746" label="disable-desktop-capture-picker-new-ui"/>
<int value="-322827131" label="tab-management-experiment-type-basil"/>
<int value="-320820051" label="enable-zero-copy"/>
+ <int value="-319002650" label="ArcUsbStorageUI:enabled"/>
<int value="-315604713" label="WebUSB:enabled"/>
<int value="-314910380" label="disable-distance-field-text"/>
<int value="-314605926" label="protect-sync-credential-on-reauth:enabled"/>
@@ -33532,11 +34406,14 @@ from previous Chrome versions.
<int value="-299841473" label="top-document-isolation:enabled"/>
<int value="-297716805"
label="CrossOriginMediaPlaybackRequiresUserGesture:disabled"/>
+ <int value="-296179618" label="CookiesWithoutSameSiteMustBeSecure:enabled"/>
<int value="-290672626" label="enable-asm-wasm"/>
+ <int value="-290329565" label="CrosVmCupsProxy:disabled"/>
<int value="-288316828" label="enable-delegated-renderer"/>
<int value="-286603268" label="hide-android-files-in-files-app"/>
<int value="-284547865" label="UnifiedConsent:enabled"/>
<int value="-283388027" label="ManualFallbacksFilling:disabled"/>
+ <int value="-283024110" label="WebXRPlaneDetection:disabled"/>
<int value="-281844827" label="AutofillCreditCardAblationExperiment:enabled"/>
<int value="-279920685" label="affiliation-based-matching:enabled"/>
<int value="-279493876" label="WebVRExperimentalRendering:enabled"/>
@@ -33615,7 +34492,6 @@ from previous Chrome versions.
<int value="-158549277" label="enable-embeddedsearch-api"/>
<int value="-152677714" label="AsmJsToWebAssembly:enabled"/>
<int value="-152632720" label="RuntimeHostPermissions:enabled"/>
- <int value="-152047399" label="AutocompleteRetentionPolicyEnabled:enabled"/>
<int value="-147283486" label="enable-network-portal-notification"/>
<int value="-146552997" label="enable-affiliation-based-matching"/>
<int value="-144134779" label="AndroidPayIntegrationV2:disabled"/>
@@ -33630,6 +34506,7 @@ from previous Chrome versions.
label="OmniboxUIExperimentBoldUserTextOnSearchSuggestions:disabled"/>
<int value="-135223364" label="AutofillShowTypePredictions:disabled"/>
<int value="-133098377" label="SyncPseudoUSSSearchEngines:disabled"/>
+ <int value="-131673218" label="FileHandlingAPI:disabled"/>
<int value="-128687277"
label="OmniboxUIExperimentHideSteadyStateUrlPathQueryAndRef:disabled"/>
<int value="-127666141" label="TabGroups:disabled"/>
@@ -33638,9 +34515,11 @@ from previous Chrome versions.
<int value="-120521482" label="DirectManipulationStylus:enabled"/>
<int value="-120091289" label="CrostiniAppSearch:enabled"/>
<int value="-119055644" label="GenericSensor:enabled"/>
+ <int value="-116692797" label="HTTPAuthCommittedInterstitials:enabled"/>
<int value="-115834377" label="EnableUnifiedMultiDeviceSetup:disabled"/>
<int value="-114768488" label="ImmersiveFullscreen:enabled"/>
<int value="-112459802" label="WebXrRenderPath:enabled"/>
+ <int value="-112335255" label="FormControlsRefresh:enabled"/>
<int value="-110756896"
label="NTPArticleSuggestionsExpandableHeader:enabled"/>
<int value="-110726049" label="KeyboardLockAPI:disabled"/>
@@ -33657,6 +34536,7 @@ from previous Chrome versions.
<int value="-88273414" label="ContentSuggestionsShowSummary:enabled"/>
<int value="-86788587" label="allow-autofill-sync-credential"/>
<int value="-86243376" label="LayoutNG:enabled"/>
+ <int value="-82530769" label="WebXRPlaneDetection:enabled"/>
<int value="-80501013" label="AutofillOffNoServerData:enabled"/>
<int value="-80353187" label="disable-display-color-calibration"/>
<int value="-79327236" label="ModeSpecificPowerButton:enabled"/>
@@ -33679,6 +34559,7 @@ from previous Chrome versions.
<int value="-59401847" label="ContentSuggestionsLargeThumbnail:disabled"/>
<int value="-58242474" label="ash-disable-swipe-to-close-in-overview-mode"/>
<int value="-57986995" label="DisablePostScriptPrinting:enabled"/>
+ <int value="-57383646" label="UseSearchClickForRightClick:disabled"/>
<int value="-56235502" label="WebRtcHideLocalIpsWithMdns:enabled"/>
<int value="-55944747" label="disable-child-account-detection"/>
<int value="-55592344" label="SyncPseudoUSSDictionary:disabled"/>
@@ -33725,7 +34606,9 @@ from previous Chrome versions.
<int value="0" label="BAD_FLAG_FORMAT">
Command-line flag doesn't start with two dashes.
</int>
+ <int value="1343197" label="UseSearchClickForRightClick:enabled"/>
<int value="1558582" label="ResamplingInputEvents:enabled"/>
+ <int value="5654819" label="CrostiniGpuSupport:disabled"/>
<int value="7444737" label="NTPSuggestionsStandaloneUI:disabled"/>
<int value="7533886" label="disable-offer-store-unmasked-wallet-cards"/>
<int value="10458238" label="disable-print-preview-simplify"/>
@@ -33738,7 +34621,9 @@ from previous Chrome versions.
<int value="27507364" label="apps-keep-chrome-alive"/>
<int value="29212695" label="OfflineIndicator:enabled"/>
<int value="31848187" label="ViewsTaskManager:disabled"/>
+ <int value="32057053" label="EnterpriseReportingInBrowser:disabled"/>
<int value="32488630" label="EphemeralTab:enabled"/>
+ <int value="32557641" label="HTTPAuthCommittedInterstitials:disabled"/>
<int value="33778663" label="OriginTrials:enabled"/>
<int value="36422284"
label="AutofillSaveCardDialogUnlabeledExpirationDate:enabled"/>
@@ -33787,6 +34672,8 @@ from previous Chrome versions.
<int value="92327255" label="DisplayMoveWindowAccels:disabled"/>
<int value="93832899" label="NtpCustomizationMenuV2:enabled"/>
<int value="98134240" label="material-design-ink-drop-animation-speed"/>
+ <int value="98218116" label="ContextualSearchLongpressResolve:disabled"/>
+ <int value="99177659" label="OmniboxUICuesForSearchHistoryMatches:disabled"/>
<int value="103932290" label="show-autofill-type-predictions"/>
<int value="105046382" label="ParallelDownloading:disabled"/>
<int value="106840653" label="mus"/>
@@ -33794,6 +34681,8 @@ from previous Chrome versions.
<int value="109577361" label="ForbidSyncXHRInPageDismissal:enabled"/>
<int value="115915570"
label="OmniboxUIExperimentHideSteadyStateUrlPathQueryAndRef:enabled"/>
+ <int value="116287989"
+ label="ignore-litepage-redirect-optimization-blacklist"/>
<int value="118991027" label="enable-accelerated-fixed-root-background"/>
<int value="119185738"
label="OmniboxUIExperimentMaxAutocompleteMatches:disabled"/>
@@ -33810,25 +34699,32 @@ from previous Chrome versions.
label="OmniboxUIExperimentHideSteadyStateUrlScheme:disabled"/>
<int value="133482330" label="AppNotificationStatusMessaging:enabled"/>
<int value="143725809" label="DownloadProgressInfoBar:enabled"/>
+ <int value="146229312" label="WebPaymentsExperimentalFeatures:enabled"/>
<int value="147342055" label="ChromeHomeClearUrlOnOpen:disabled"/>
<int value="147373243" label="enable-deferred-image-decoding"/>
<int value="149914698" label="SearchReadyOmnibox:disabled"/>
<int value="151022756" label="ArcAvailableForChildAccount:disabled"/>
<int value="151101719" label="HtmlBaseUsernameDetector:enabled"/>
+ <int value="153347646" label="SmartDimModelV3:disabled"/>
<int value="157217034" label="enable-tab-for-desktop-share"/>
<int value="157318016" label="AutomaticTabDiscarding:enabled"/>
+ <int value="160838658" label="SmartDimModelV3:enabled"/>
+ <int value="161409456" label="AutofillUseMobileLabelDisambiguation:disabled"/>
<int value="161694478" label="OmniboxNewAnswerLayout:enabled"/>
<int value="173288154" label="PrintPdfAsImage:enabled"/>
<int value="178337215" label="enable-md-history"/>
<int value="180074362" label="memory-pressure-thresholds"/>
+ <int value="181150000" label="CrosVmCupsProxy:enabled"/>
<int value="183208826" label="TabGroups:enabled"/>
<int value="185991204" label="enable-webrtc-srtp-encrypted-headers"/>
<int value="188610022" label="NewMessageListView:enabled"/>
<int value="189728101" label="FasterLocationReload:disabled"/>
+ <int value="189777537" label="DisableInitialMostVisitedFadeIn:enabled"/>
<int value="191737931" label="enable-mark-http-as"/>
<int value="192167036" label="LogJsConsoleMessages:disabled"/>
<int value="194573877" label="MacViewsNativeDialogs:disabled"/>
<int value="194895489" label="passive-listeners-default"/>
+ <int value="195335115" label="AudioWorkletRealtimeThread:disabled"/>
<int value="195570937" label="EnableHomeLauncher:disabled"/>
<int value="200347243" label="WebVRExperimentalRendering:disabled"/>
<int value="201343576" label="enable-password-change-support:enabled"/>
@@ -33893,6 +34789,7 @@ from previous Chrome versions.
<int value="313253630" label="AutofillRefreshStyleAndroid:enabled"/>
<int value="313303258" label="WebPaymentsModifiers:disabled"/>
<int value="316182183" label="MediaDocumentDownloadButton:disabled"/>
+ <int value="317432596" label="DisplayLocking:disabled"/>
<int value="319683583" label="ContentSuggestionsDebugLog:enabled"/>
<int value="320121752" label="DelegateOverscrollSwipes:disabled"/>
<int value="323605372" label="ui-disable-compositor-animation-timelines"/>
@@ -33914,7 +34811,7 @@ from previous Chrome versions.
<int value="341152650" label="SoundContentSetting:enabled"/>
<int value="345664265" label="BlinkHeapIncrementalMarking:disabled"/>
<int value="346711293" label="enable-save-password-bubble"/>
- <int value="348043155" label="AwaitOptimization:enabled"/>
+ <int value="347981012" label="TabToGTSAnimation:disabled"/>
<int value="348115702" label="new-password-form-parsing-for-saving:enabled"/>
<int value="348854923" label="v8-cache-strategies-for-cache-storage"/>
<int value="350399958" label="ModuleScriptsImportMetaUrl:disabled"/>
@@ -33929,6 +34826,7 @@ from previous Chrome versions.
<int value="360391863" label="NTPOfflineBadge:enabled"/>
<int value="360599302" label="enable-gpu-rasterization"/>
<int value="362644448" label="memlog-in-process"/>
+ <int value="365068212" label="PiexWasm:disabled"/>
<int value="365467768" label="prefetch-search-results"/>
<int value="367063319" label="PasswordImport:disabled"/>
<int value="368854020" label="ash-screen-rotation-animation"/>
@@ -33957,6 +34855,8 @@ from previous Chrome versions.
<int value="393704200" label="account-consistency"/>
<int value="398903399" label="GenericSensorExtraClasses:disabled"/>
<int value="399039205" label="enable-webrtc-hw-vp9-encoding"/>
+ <int value="399398207"
+ label="OmniboxUIExperimentVerticalMarginLimitToNonTouchOnly:enabled"/>
<int value="400272381" label="LazyFrameLoading:disabled"/>
<int value="400322063" label="ash-disable-screen-orientation-lock"/>
<int value="401983950" label="enable-spdy4"/>
@@ -33977,6 +34877,7 @@ from previous Chrome versions.
<int value="422307097" label="PhysicalWeb:disabled"/>
<int value="423615350" label="enable-tab-audio-muting"/>
<int value="423855924" label="enable-tab-switcher-theme-colors"/>
+ <int value="425072496" label="GridLayoutForNtpShortcuts:enabled"/>
<int value="430959979" label="SyncStandaloneTransport:disabled"/>
<int value="431691805" label="MediaDocumentDownloadButton:enabled"/>
<int value="434033638" label="PwaPersistentNotification:disabled"/>
@@ -34022,6 +34923,7 @@ from previous Chrome versions.
<int value="510066229"
label="AutofillEnforceMinRequiredFieldsForQuery:enabled"/>
<int value="510814146" label="OfflineBookmarks:enabled"/>
+ <int value="511179195" label="ShoppingAssist:disabled"/>
<int value="513356954" label="InstantTethering:disabled"/>
<int value="513372959" label="ViewsProfileChooser:enabled"/>
<int value="517429103" label="AutofillImportDynamicForms:enabled"/>
@@ -34038,6 +34940,8 @@ from previous Chrome versions.
<int value="546043947" label="ImplicitRootScroller:enabled"/>
<int value="546520086" label="enable-data-reduction-proxy-savings-promo"/>
<int value="546710806" label="disable-easy-signin"/>
+ <int value="547170394"
+ label="OmniboxAlternateMatchDescriptionSeparator:disabled"/>
<int value="549483647" label="EnableUnifiedMultiDeviceSettings:disabled"/>
<int value="550378029" label="reset-app-list-install-state"/>
<int value="550387510" label="NTPAssetDownloadSuggestions:disabled"/>
@@ -34120,6 +35024,7 @@ from previous Chrome versions.
<int value="656864700" label="FillOnAccountSelectHttp:disabled"/>
<int value="659086147" label="OverlayScrollbarFlashWhenMouseEnter:enabled"/>
<int value="663027937" label="NewTabPageCustomLinks:enabled"/>
+ <int value="663069508" label="TabToGTSAnimation:enabled"/>
<int value="663294302" label="ForceUseAPDownloadProtection:disabled"/>
<int value="664363259" label="SiteCharacteristicsDatabase:enabled"/>
<int value="664591021" label="EnableContinueReading:enabled"/>
@@ -34170,6 +35075,7 @@ from previous Chrome versions.
<int value="728656094" label="PasswordForceSaving:disabled"/>
<int value="730024226" label="enable-out-of-process-pdf"/>
<int value="730750097" label="PermissionsBlacklist:disabled"/>
+ <int value="731318054" label="WebAssemblySimd:enabled"/>
<int value="731757746" label="ArcEnableDocumentsProviderInFilesApp:disabled"/>
<int value="731775657" label="DownloadsAutoResumptionNative:disabled"/>
<int value="731779469" label="BlinkHeapUnifiedGarbageCollection:enabled"/>
@@ -34245,6 +35151,7 @@ from previous Chrome versions.
<int value="849980462" label="RemoveNtpFakebox:disabled"/>
<int value="850779988" label="allow-popups-during-page-unload"/>
<int value="851085848" label="enable-settings-window"/>
+ <int value="851616920" label="EnableTLS13EarlyData:disabled"/>
<int value="852313529" label="RTCUnifiedPlanByDefault:disabled"/>
<int value="854730848" label="disable-app-info-dialog-mac"/>
<int value="855746780" label="disable-physical-keyboard-autocorrect"/>
@@ -34321,8 +35228,10 @@ from previous Chrome versions.
<int value="989062160" label="ModuleScriptsImportMetaUrl:enabled"/>
<int value="994317727"
label="AutofillSaveCreditCardUsesStrikeSystem:disabled"/>
+ <int value="996637686" label="NativeFileSystemAPI:enabled"/>
<int value="996643125" label="EnableAppShortcutSearch:disabled"/>
<int value="996701528" label="SystemKeyboardLock:enabled"/>
+ <int value="1000045846" label="OverlayNewLayout:disabled"/>
<int value="1000587036" label="OfflinePagesDescriptiveFailStatus:disabled"/>
<int value="1000706989" label="AutomaticTabDiscarding:disabled"/>
<int value="1002585107" label="emphasize-titles-in-omnibox-dropdown"/>
@@ -34343,6 +35252,7 @@ from previous Chrome versions.
<int value="1019623058" label="ash-enable-shelf-model-synchronization"/>
<int value="1019857902"
label="disable-hide-inactive-stacked-tab-close-buttons"/>
+ <int value="1022424308" label="SignedExchangeSubresourcePrefetch:enabled"/>
<int value="1022992701" label="enable-origin-chip-always"/>
<int value="1027252926" label="SyncSupportSecondaryAccount:enabled"/>
<int value="1033148287" label="NTPShortcuts:disabled"/>
@@ -34351,6 +35261,8 @@ from previous Chrome versions.
<int value="1036068554" label="enable-android-pay-integration-v2"/>
<int value="1043291220" label="OverviewSwipeToClose:disabled"/>
<int value="1043334401" label="disable-slimming-paint-invalidation"/>
+ <int value="1044928476"
+ label="AllowDownloadResumptionWithoutStrongValidators:enabled"/>
<int value="1046878091" label="PasswordForceSaving:enabled"/>
<int value="1046981538" label="OfflinePagesShowAlternateDinoPage:disabled"/>
<int value="1049885154" label="OfflinePagesPrefetching:disabled"/>
@@ -34370,9 +35282,11 @@ from previous Chrome versions.
<int value="1064288458" label="OfflineRecentPages:enabled"/>
<int value="1067618884" label="enable-experimental-input-view-features"/>
<int value="1067990299" label="enable-ui-devtools"/>
+ <int value="1069325321" label="CrostiniGpuSupport:enabled"/>
<int value="1070164693" label="MidiManagerDynamicInstantiation:disabled"/>
<int value="1070300488" label="disable-webgl"/>
<int value="1070449228" label="ContextualSuggestionsCarousel:enabled"/>
+ <int value="1070840417" label="ChromeColors:enabled"/>
<int value="1071520357" label="WebAuthenticationTouchId:enabled"/>
<int value="1072010558" label="NTPModernLayout:disabled"/>
<int value="1074359194" label="UseSuggestionsEvenIfFew:enabled"/>
@@ -34408,6 +35322,7 @@ from previous Chrome versions.
<int value="1118109174" label="enable-launcher-search-provider-api"/>
<int value="1120428727" label="TabGridLayoutAndroid:enabled"/>
<int value="1126061778" label="CaptureThumbnailOnLoadFinished:enabled"/>
+ <int value="1127085005" label="TreatUnsafeDownloadsAsActive:enabled"/>
<int value="1127183523" label="PassiveEventListenersDueToFling:enabled"/>
<int value="1127427821" label="OmniboxEntitySuggestions:disabled"/>
<int value="1129542111" label="CastAllowAllIPs:disabled"/>
@@ -34435,6 +35350,7 @@ from previous Chrome versions.
<int value="1167350114" label="AndroidNightMode:enabled"/>
<int value="1167613030" label="enable-permission-action-reporting"/>
<int value="1169418814" label="ManualFallbacksFilling:enabled"/>
+ <int value="1173244409" label="AutofillUseMobileLabelDisambiguation:enabled"/>
<int value="1174088940" label="enable-wasm"/>
<int value="1177120582" label="InstallableInkDrop:disabled"/>
<int value="1179013979"
@@ -34477,6 +35393,7 @@ from previous Chrome versions.
<int value="1222017136" label="WebRtcUseEchoCanceller3:disabled"/>
<int value="1222032915"
label="kAutofillRationalizeRepeatedServerPredictions:enabled"/>
+ <int value="1222808563" label="DisableInitialMostVisitedFadeIn:disabled"/>
<int value="1226624874" label="Mus:disabled"/>
<int value="1228115769" label="SiteCharacteristicsDatabase:disabled"/>
<int value="1229299518" label="SingleTabMode:disabled"/>
@@ -34501,6 +35418,7 @@ from previous Chrome versions.
label="SyncPseudoUSSHistoryDeleteDirectives:disabled"/>
<int value="1260186484" label="spurious-power-button-screen-accel"/>
<int value="1261713150" label="ChromeHomeOptOutSnackbar:disabled"/>
+ <int value="1266156008" label="IdentityDisc:disabled"/>
<int value="1266525177"
label="AutofillUpstreamUseGooglePayOnAndroidBranding:disabled"/>
<int value="1266886673" label="delay-reload-stop-button-change"/>
@@ -34515,6 +35433,7 @@ from previous Chrome versions.
<int value="1277386636" label="QueryInOmnibox:disabled"/>
<int value="1279584261" label="enable-carrier-switching"/>
<int value="1280614081" label="show-overdraw-feedback"/>
+ <int value="1281471853" label="UseButtonTranslateBubbleUI:disabled"/>
<int value="1283908088" label="ImprovedLanguageSettings:disabled"/>
<int value="1283956865" label="force-tablet-mode"/>
<int value="1283960113" label="disable-fixed-position-compositing"/>
@@ -34545,9 +35464,11 @@ from previous Chrome versions.
<int value="1319068611" label="SecondaryUiMd:disabled"/>
<int value="1319725131" label="enable-distance-field-text"/>
<int value="1320201920" label="enable-touchpad-three-finger-click"/>
+ <int value="1320450434" label="ArcUsbStorageUI:disabled"/>
<int value="1324623677"
label="SessionRestorePrioritizesBackgroundUseCases:enabled"/>
<int value="1330264457" label="OmniboxUIExperimentVerticalLayout:disabled"/>
+ <int value="1331098784" label="ReducedReferrerGranularity:enabled"/>
<int value="1332120969" label="ChromeDuet:disabled"/>
<int value="1333847867" label="NoScriptPreviews:enabled"/>
<int value="1338356182" label="AutofillAssistantChromeEntry:disabled"/>
@@ -34556,6 +35477,7 @@ from previous Chrome versions.
<int value="1340690624" label="WebPaymentsMethodSectionOrderV2:disabled"/>
<int value="1343050930" label="ContextualSearchUnityIntegration:enabled"/>
<int value="1343516821" label="ignore-previews-blocklist"/>
+ <int value="1343713259" label="ArcPrintSpoolerExperiment:disabled"/>
<int value="1344833841" label="ImeThread:enabled"/>
<int value="1346994602" label="SyncPseudoUSSDictionary:enabled"/>
<int value="1351830811" label="do-not-ignore-autocomplete-off"/>
@@ -34613,6 +35535,7 @@ from previous Chrome versions.
label="AutofillLocalCardMigrationUsesStrikeSystemV2:enabled"/>
<int value="1413158119" label="WebRtcRemoteEventLog:disabled"/>
<int value="1413948819" label="NupPrinting:enabled"/>
+ <int value="1415806054" label="WebAssemblyCodeGC:enabled"/>
<int value="1416309272" label="only-new-password-form-parsing:enabled"/>
<int value="1416592483" label="ash-enable-mirrored-screen"/>
<int value="1418054870" label="SpecialLocale:enabled"/>
@@ -34643,6 +35566,7 @@ from previous Chrome versions.
<int value="1466502102" label="DelayNavigation:disabled"/>
<int value="1469407485" label="disable-accelerated-2d-canvas"/>
<int value="1473838479" label="EnableVirtualKeyboardMdUi:disabled"/>
+ <int value="1473967338" label="OmniboxShortBookmarkSuggestions:enabled"/>
<int value="1474861626" label="disable-multi-mirroring"/>
<int value="1479248574" label="disable-voice-input"/>
<int value="1481562816" label="disable-password-link"/>
@@ -34683,6 +35607,7 @@ from previous Chrome versions.
<int value="1530177325" label="LanguagesPreference:disabled"/>
<int value="1531164533" label="SyncPseudoUSSFavicons:disabled"/>
<int value="1534222388" label="EnableEphemeralFlashPermission:enabled"/>
+ <int value="1534386287" label="SendTabToSelfWhenSignedIn:enabled"/>
<int value="1536921097" label="NavigationMojoResponse:disabled"/>
<int value="1538685213" label="DownloadHomeV2:enabled"/>
<int value="1538690515" label="OneGoogleBarOnLocalNtp:enabled"/>
@@ -34713,6 +35638,7 @@ from previous Chrome versions.
<int value="1593917165" label="SimplifiedNTP:disabled"/>
<int value="1594247626" label="ContentSuggestionsSettings:enabled"/>
<int value="1594664550" label="NTPModernLayout:enabled"/>
+ <int value="1595208893" label="AudioWorkletRealtimeThread:enabled"/>
<int value="1597880096" label="FocusMode:disabled"/>
<int value="1600850069" label="MobileIdentityConsistency:disabled"/>
<int value="1600926040" label="TranslateCompactUI:enabled"/>
@@ -34730,6 +35656,7 @@ from previous Chrome versions.
label="OmniboxUIExperimentWhiteBackgroundOnBlur:disabled"/>
<int value="1617187093" label="enable-improved-a2hs"/>
<int value="1618633341" label="MashOopViz:enabled"/>
+ <int value="1620369597" label="enable-unsafe-webgpu"/>
<int value="1621298798" label="VrBrowserKeyboard:enabled"/>
<int value="1622131033" label="ozone-test-single-overlay-support"/>
<int value="1626824478" label="ExperimentalAppBanners:disabled"/>
@@ -34768,6 +35695,7 @@ from previous Chrome versions.
<int value="1677167062" label="AutomaticPasswordGeneration:enabled"/>
<int value="1677258310" label="DragAppsInTabletMode:disabled"/>
<int value="1679558835" label="ArcAvailableForChildAccount:enabled"/>
+ <int value="1684043382" label="AssistantKeyRemapping:enabled"/>
<int value="1688075820" label="OmniboxExperimentalKeywordMode:disabled"/>
<int value="1689123607" label="enable-app-link"/>
<int value="1689183477" label="enable-merge-key-char-events"/>
@@ -34784,6 +35712,7 @@ from previous Chrome versions.
<int value="1701972870" label="NTPSnippetsIncreasedVisibility:enabled"/>
<int value="1702090999" label="ClearOldBrowsingData:disabled"/>
<int value="1702821235" label="WebAssembly:enabled"/>
+ <int value="1703927420" label="PiexWasm:enabled"/>
<int value="1705724232" label="use-android-midi-api"/>
<int value="1707283026" label="SyncPseudoUSSExtensions:disabled"/>
<int value="1708118086" label="TextFragmentAnchor:disabled"/>
@@ -34813,6 +35742,8 @@ from previous Chrome versions.
<int value="1750822869" label="CrostiniBackup:disabled"/>
<int value="1752168018" label="enable-stale-while-revalidate"/>
<int value="1755024316" label="HostWindowsInAppShimProcess:disabled"/>
+ <int value="1758262950"
+ label="OmniboxUIExperimentVerticalMarginLimitToNonTouchOnly:disabled"/>
<int value="1760946944" label="MacViewsAutofillPopup:disabled"/>
<int value="1762320532" label="AutofillKeyboardAccessory:enabled"/>
<int value="1766676896" label="affiliation-based-matching:disabled"/>
@@ -34841,17 +35772,22 @@ from previous Chrome versions.
<int value="1803470125" label="SyncUSSSessions:enabled"/>
<int value="1807374811" label="CCTModuleCache:enabled"/>
<int value="1809940714" label="SpeculativeLaunchServiceWorker:disabled"/>
+ <int value="1810258949" label="DisplayLocking:enabled"/>
<int value="1810311887" label="WebAssemblyThreads:enabled"/>
<int value="1812368073" label="enable-new-app-list-mixer"/>
<int value="1814671708" label="disable-password-manager-reauthentication"/>
<int value="1816843861" label="ServiceWorkerServicification:enabled"/>
<int value="1817312143" label="num-raster-threads"/>
+ <int value="1818829958" label="IdentityDisc:enabled"/>
<int value="1819256299" label="disable-webrtc-hw-decoding"/>
<int value="1819536169" label="disable-cast-streaming-hw-encoding"/>
<int value="1820317896" label="NTPShowGoogleGInOmnibox:disabled"/>
<int value="1820451991" label="enable-offline-auto-reload"/>
<int value="1821723343" label="disable-saml-signin"/>
<int value="1823102966" label="disable-ipc-flooding-protection"/>
+ <int value="1823337908" label="SmartDim20190221:enabled"/>
+ <int value="1824931483"
+ label="EnableHistoryFaviconsGoogleServerQuery:disabled"/>
<int value="1825940786" label="ChromeHomePromo:disabled"/>
<int value="1827369558" label="AndroidPayIntegrationV1:disabled"/>
<int value="1828660283" label="enable-webfonts-intervention-trigger"/>
@@ -34870,6 +35806,7 @@ from previous Chrome versions.
<int value="1849379463" label="OfflinePagesCTV2:enabled"/>
<int value="1849580433" label="disable-oop-rasterization"/>
<int value="1851358497" label="enable-ash-sidebar"/>
+ <int value="1851746253" label="ReducedReferrerGranularity:disabled"/>
<int value="1852630189" label="NTPBookmarkSuggestions:disabled"/>
<int value="1854226565" label="AutofillNoLocalSaveOnUnmaskSuccess:enabled"/>
<int value="1855524566" label="allow-insecure-websocket-from-https-origin"/>
@@ -34931,6 +35868,7 @@ from previous Chrome versions.
<int value="1931309368" label="fill-on-account-select:disabled"/>
<int value="1932204471" label="SyncPseudoUSSThemes:disabled"/>
<int value="1932732886" label="OpenVR:enabled"/>
+ <int value="1933282728" label="OmniboxUICuesForSearchHistoryMatches:enabled"/>
<int value="1936810062" label="WebVrVsyncAlign:enabled"/>
<int value="1938279796" label="PromosOnLocalNtp:disabled"/>
<int value="1939413645" label="enable-invalid-cert-collection"/>
@@ -34942,6 +35880,7 @@ from previous Chrome versions.
<int value="1949019439"
label="AutofillRestrictUnownedFieldsToFormlessCheckout:disabled"/>
<int value="1949908940" label="disable-zip-archiver-unpacker"/>
+ <int value="1950191981" label="OverlayNewLayout:enabled"/>
<int value="1951466218" label="enable-data-reduction-proxy-lite-page"/>
<int value="1951645673" label="PasswordsKeyboardAccessory:disabled"/>
<int value="1955238689" label="OmniboxMaxURLMatches:disabled"/>
@@ -34961,6 +35900,7 @@ from previous Chrome versions.
<int value="1972232935" label="DisplayMoveWindowAccels:enabled"/>
<int value="1972720114" label="WebPaymentsJustInTimePaymentApp:enabled"/>
<int value="1974565950" label="enable-experimental-accessibility-labels"/>
+ <int value="1976644015" label="enable-forbid-sync-xhr-in-page-dismissal"/>
<int value="1979222611" label="XRSandbox:disabled"/>
<int value="1980011075" label="debug-packed-apps"/>
<int value="1980648371" label="PointerEventV1SpecCapturing:enabled"/>
@@ -34978,11 +35918,8 @@ from previous Chrome versions.
<int value="1993258379" label="enable-icon-ntp"/>
<int value="1994431722" label="MaterialDesignUserMenu:disabled"/>
<int value="1995322219" label="EmojiHandwritingVoiceInput:enabled"/>
- <int value="1995879122" label="AutocompleteRetentionPolicyEnabled:disabled"/>
<int value="1996125159" label="AutoplayMutedVideos:enabled"/>
<int value="1997047666" label="NTPSnippetsIncreasedVisibility:disabled"/>
- <int value="1999081349"
- label="AutofillSaveCardSignInAfterLocalSave:disabled"/>
<int value="2000091128" label="enable-touch-hover"/>
<int value="2001562962"
label="enable-manual-fallback-for-password-saving:enabled"/>
@@ -34991,6 +35928,7 @@ from previous Chrome versions.
<int value="2003811018" label="enable-touch-support-for-screen-magnifier"/>
<int value="2004483175" label="multi-instance-merge-tabs"/>
<int value="2004604350" label="AutofillGetPaymentsIdentityFromSync:enabled"/>
+ <int value="2004651603" label="NativeFileSystemAPI:disabled"/>
<int value="2004829262" label="enable-webgl-draft-extensions"/>
<int value="2005614493" label="tab-management-experiment-type-dill"/>
<int value="2006413281"
@@ -35036,6 +35974,7 @@ from previous Chrome versions.
<int value="2077917024"
label="enable-supervised-user-managed-bookmarks-folder"/>
<int value="2079672348" label="ExperimentalKeyboardLockUI:disabled"/>
+ <int value="2081154375" label="AssistantKeyRemapping:disabled"/>
<int value="2084638930"
label="AutofillEnforceMinRequiredFieldsForUpload:enabled"/>
<int value="2085186092" label="BulkPrinters:disabled"/>
@@ -35067,6 +36006,8 @@ from previous Chrome versions.
<int value="2129929643" label="enable-use-zoom-for-dsf"/>
<int value="2134480727" label="MediaSessionAccelerators:disabled"/>
<int value="2135408204" label="OverscrollHistoryNavigation:disabled"/>
+ <int value="2137113620"
+ label="ProcessSharingWithStrictSiteInstances:enabled"/>
<int value="2137347307" label="enable-drive-apps-in-app-list"/>
<int value="2137599770" label="enable-win32k-renderer-lockdown"/>
<int value="2138146331" label="OmniboxVoiceSearchAlwaysVisible:enabled"/>
@@ -35218,6 +36159,15 @@ from previous Chrome versions.
<int value="6" label="IME tray"/>
</enum>
+<enum name="LoginSessionExitType">
+ <int value="0" label="NormalExit">
+ Session ended normally, or for a reason not listed below.
+ </int>
+ <int value="1" label="LoginCrashLoop">
+ Session ended because Chrome crashed repeatedly.
+ </int>
+</enum>
+
<enum name="LoginStateKeyGenerationStatus">
<summary>The result of a state key generation operation.</summary>
<int value="0" label="GENERATION_METHOD_IDENTIFIER_HASH">
@@ -35667,6 +36617,13 @@ from previous Chrome versions.
<int value="1999" label="Unknown CBError code"/>
</enum>
+<enum name="MacThermalState">
+ <int value="0" label="Nominal"/>
+ <int value="1" label="Fair"/>
+ <int value="2" label="Serious"/>
+ <int value="3" label="Critical"/>
+</enum>
+
<enum name="MainFrameDownloadSandboxGesture">
<obsolete>
Deprecated as of 03/2019.
@@ -36419,6 +37376,7 @@ Called by update_use_counter_css.py.-->
<int value="634" label="inset-inline-end"/>
<int value="635" label="inset-inline"/>
<int value="636" label="inset"/>
+ <int value="637" label="color-scheme"/>
</enum>
<enum name="MappedEditingCommands">
@@ -37617,12 +38575,11 @@ Called by update_use_counter_css.py.-->
resource based on CORB (e.g., same vs cross origin postMessage).
</summary>
<int value="0" label="DidCreateMimeHandlerViewContainerBase">
- A new MimeHandlerViewContainerBase is created; this is in response to
- attaching a plugin element whose resource is handled by MimeHandlerView.
+ Emitted once a new BrowserPlugin-based MimeHandlerView is created.
</int>
<int value="1" label="DidLoadExtension">
- Recorded when a MimeHandlerViewContainer is created and notified that the
- extension handling the resource is loaded in guest process.
+ Emitted once the embedder process is notified that the extension's document
+ has loaded.
</int>
<int value="2" label="AccessibleInvalid">
Invalid message string/object posted to an accessible resource.
@@ -37654,6 +38611,26 @@ Called by update_use_counter_css.py.-->
Any message posted to a MimeHandlerViewContainerBase that is embedded; i.e.,
is not created as a result of navigating a frame to the resource.
</int>
+ <int value="11" label="PostMessageInternal">
+ Emitted when an internal postMesasge to 'print' is issued from C++ code.
+ </int>
+ <int value="12" label="CreateFrameContainer">
+ Emitted when a MimeHandlerViewFrameContainer is instantiated to support post
+ messaging to a MimeHandlerViewGuest in plugin's content frame.
+ </int>
+ <int value="13" label="ReuseFrameContainer">
+ Emitted when a plugin update results in reusing a
+ MimeHandlerViewFrameContainer.
+ </int>
+ <int value="14" label="RemoveFrameContainerUpdatePlugin">
+ Emitted once a MimeHandlerViewFrameContainer is removed in UpdatePlugin
+ phase.
+ </int>
+ <int value="15" label="RemoveFrameContainerUnexpectedFrames">
+ Emitted once a MimeHandlerViewFrameContainer is removed as a result of
+ observing mismatch between routing IDs of frames inside and those that are
+ expected.
+ </int>
</enum>
<enum name="MissingStartType">
@@ -37797,6 +38774,52 @@ Called by update_use_counter_css.py.-->
<int value="4" label="Infobar dismissed after tab closed"/>
</enum>
+<enum name="MobileMessagesBadgeState">
+ <int value="0" label="Inactive"/>
+ <int value="1" label="Active"/>
+</enum>
+
+<enum name="MobileMessagesBannerDismissType">
+ <int value="0" label="TimedOut"/>
+ <int value="1" label="SwipedUp"/>
+ <int value="2" label="ExpandedToModal"/>
+ <int value="3" label="TappedToModal"/>
+</enum>
+
+<enum name="MobileMessagesBannerEvent">
+ <int value="0" label="Accepted"/>
+ <int value="1" label="Handled"/>
+ <int value="2" label="Dismissed"/>
+ <int value="3" label="Presented"/>
+ <int value="4" label="ReturnedToOrigin"/>
+</enum>
+
+<enum name="MobileMessagesModalEvent">
+ <int value="0" label="Accepted"/>
+ <int value="1" label="Canceled"/>
+ <int value="2" label="Dismissed"/>
+ <int value="3" label="Presented"/>
+ <int value="4" label="SettingsOpened"/>
+</enum>
+
+<enum name="MobileMessagesPasswordsModalDismiss">
+ <int value="0" label="TappedNeverForThisSite"/>
+ <int value="1" label="SavedCredentials"/>
+ <int value="2" label="UpdatedCredentials"/>
+</enum>
+
+<enum name="MobileMessagesPasswordsModalEvent">
+ <int value="0" label="EditedUserName"/>
+ <int value="1" label="EditedPassword"/>
+ <int value="2" label="UnmaskedPassword"/>
+ <int value="3" label="MaskedPassword"/>
+</enum>
+
+<enum name="MobileMessagesPasswordsModalPresent">
+ <int value="0" label="PresentedAfterSaveBanner"/>
+ <int value="1" label="PresentedAfterUpdateBanner"/>
+</enum>
+
<enum name="MobileSessionCallerApp">
<int value="0" label="Google Search"/>
<int value="1" label="Gmail"/>
@@ -37857,6 +38880,16 @@ Called by update_use_counter_css.py.-->
<int value="3" label="After first pageload finished"/>
</enum>
+<enum name="ModeChangeKeyAction">
+ <summary>Result of pressing the mode change key</summary>
+ <int value="0" label="Show indicator">
+ Showed the indicator for the current input method.
+ </int>
+ <int value="1" label="Switch to next IME">
+ Switched to the next input method.
+ </int>
+</enum>
+
<enum name="ModuleBlacklistCacheReadResult">
<int value="0" label="Success"/>
<int value="1" label="Failed to open the file"/>
@@ -38373,6 +39406,7 @@ Called by update_use_counter_css.py.-->
<int value="10" label="Operation aborted"/>
<int value="11" label="I/O error"/>
<int value="12" label="Too many opened"/>
+ <int value="13" label="Invalid URL format with SSO authentication"/>
</enum>
<enum name="NatTypeCounters">
@@ -38426,6 +39460,7 @@ Called by update_use_counter_css.py.-->
<int value="0" label="kRequestedByClient"/>
<int value="1" label="kRestoreSession"/>
<int value="2" label="kCopyStateFrom"/>
+ <int value="3" label="kCrashedSubframe"/>
</enum>
<enum name="NavigationPredictorAccuracyActionTaken">
@@ -38559,6 +39594,13 @@ Called by update_use_counter_css.py.-->
<int value="3" label="NO_ENTRY"/>
</enum>
+<enum name="NetCertificateNameNormalization">
+ <int value="0" label="Error parsing certificate chain"/>
+ <int value="1" label="Byte equal Names"/>
+ <int value="2" label="Normalized Names"/>
+ <int value="3" label="Chain contained only one certificate"/>
+</enum>
+
<enum name="NetConnectivityProtocolStatus">
<int value="0" label="SUCCESS"/>
<int value="1" label="IP_STRING_PARSE_FAILED"/>
@@ -39068,6 +40110,22 @@ Called by update_net_error_codes.py.-->
<int value="8" label="subresource and used"/>
</enum>
+<enum name="NetReportingAndNelBackingStoreUpdateOutcome">
+ <int value="0" label="Success: Committing all operations succeeded"/>
+ <int value="1"
+ label="Trouble: Committing some operations failed but committing batch
+ succeeded"/>
+ <int value="2" label="Failure: Committing batch failed"/>
+</enum>
+
+<enum name="NetReportingAndNelInitializeDbOutcome">
+ <int value="0" label="Failed: Path does not exist"/>
+ <int value="1" label="Failed: Open DB problem"/>
+ <int value="2" label="Failed: Migrate DB problem"/>
+ <int value="3" label="Succeeded: New DB file created"/>
+ <int value="4" label="Succeeded: Existing DB file loaded"/>
+</enum>
+
<enum name="NetReportingHeaderEndpointGroupOutcome">
<int value="0" label="Discarded: not a dictionary"/>
<int value="1" label="Discarded: group not a string"/>
@@ -39077,6 +40135,8 @@ Called by update_net_error_codes.py.-->
<int value="5" label="Discarded: endpoints missing"/>
<int value="6" label="Discarded: endpoints not a list"/>
<int value="7" label="Parsed"/>
+ <int value="8" label="Removed: TTL zero"/>
+ <int value="9" label="Removed: empty"/>
</enum>
<enum name="NetReportingHeaderEndpointOutcome">
@@ -39087,10 +40147,11 @@ Called by update_net_error_codes.py.-->
<int value="4" label="Discarded: URL insecure"/>
<int value="5" label="Discarded: priority not an integer"/>
<int value="6" label="Discarded: weight not an integer"/>
- <int value="7" label="Discarded: weight not positive"/>
- <int value="8" label="Removed (max-age = 0)"/>
+ <int value="7" label="Discarded: weight negative"/>
+ <int value="8" label="Removed (max-age = 0) (obsolete)"/>
<int value="9" label="Set rejected by delegate (max-age &gt; 0)"/>
<int value="10" label="Set (max-age &gt; 0)"/>
+ <int value="11" label="Discarded: priority negative"/>
</enum>
<enum name="NetReportingHeaderOutcome">
@@ -39100,6 +40161,7 @@ Called by update_net_error_codes.py.-->
<int value="3" label="Discarded: JSON too big"/>
<int value="4" label="Discarded: JSON invalid"/>
<int value="5" label="Parsed"/>
+ <int value="6" label="Removed: empty"/>
</enum>
<enum name="NetReportingReportOutcome">
@@ -40127,6 +41189,48 @@ Called by update_net_trust_anchors.py.-->
label="cbad7b1d384849df0946b7ee8e7f5f7ce3aed876fda7bc9d30d8b16f29ff2c53"/>
<int value="493"
label="e0c780c629903e126f1d919570dce7c496f85f33aae66b9a3147ee75f8d1620a"/>
+ <int value="494"
+ label="376a1a7082a593dccc20d561d119e9ab8d30f11cc321d0a37fa41f0df284e01c"/>
+ <int value="495"
+ label="8d417db2dd8bf5e3084d1e3f196d583849d81bdd4c00c70b9d39369e96b8c782"/>
+ <int value="496"
+ label="b7408b4d2be0238ba37004dd34e276c6019bd2f24c9db7d4980f5f6c359a4bcc"/>
+ <int value="497"
+ label="eabc185c4e82d942b1a5978ba3c0181487d6b3b9974e5c49f72f6d0bd9637150"/>
+ <int value="498"
+ label="2541e53ba5b3b07acbe7097ac4a03e040c11cf7a6d4a67cb213d558b50167a06"/>
+ <int value="499"
+ label="68ded9a203ff6e367e12aa49977cd200f7127a800faa6f859f0bafed8286a4fb"/>
+ <int value="500"
+ label="36d7c79f3d089a0ff79972d90923dea5ca76b4ccbaf7c2751cb152e9494f52d0"/>
+ <int value="501"
+ label="be3280c6863c770a33c9040bd97d5540b216d1d91db8b088ceac1197dae1d660"/>
+ <int value="502"
+ label="c5750bf85f459fb70e2b6cd1898d375e92d7938e47a6e034cce0c12d30372ccd"/>
+ <int value="503"
+ label="22a36994f28f2fa3b16ae872a79dbb12a982da5b824d7ae434f96178ac540351"/>
+ <int value="504"
+ label="f26cdaa1c48e2d369eaf24993a424f8290983af7094a5bde9c7d44341f2e2428"/>
+ <int value="505"
+ label="c372f6d18ebee5aa23d9e919f3e6be98488ec01607df3162fc192e4b1346afb3"/>
+ <int value="506"
+ label="68aa635451d83962167e88fb08f8678d73aec66fc559462137cff9d1bc3d3871"/>
+ <int value="507"
+ label="b2f7298b52bf2c3cac4ddfe72de4d682ac58957595982f2b62301af597c699c5"/>
+ <int value="508"
+ label="35f53ce1264611e03340fe37e1ec7d4cc986c5613dca70fd04aa44545f2daf28"/>
+ <int value="509"
+ label="9091e31fe92546a5f5e1b3ed4071f4440b840c1e80dbfcba7a7ec6d5825f0b24"/>
+ <int value="510"
+ label="786ffa578618c3b9a311175e50816f4dda0605c3869f296ebc5943bf09f4e904"/>
+ <int value="511"
+ label="828b0eeff24654e8ff5841a29dd5d4e3ed30952ca43425a79283407208d39d16"/>
+ <int value="512"
+ label="497128fc90656b87290482b223efb72240fe9c421e79938de5f8110cb0be9056"/>
+ <int value="513"
+ label="2e06cae1fc20b200e6fb748557a4444bec9317dfff2e4151669e0f7944f0a9e0"/>
+ <int value="514"
+ label="122312c081949106b7049f3febf199c010ada13e3281cd358a41e7bd09c829d7"/>
</enum>
<enum name="Network3GGobiError">
@@ -40171,6 +41275,19 @@ Called by update_net_trust_anchors.py.-->
</int>
</enum>
+<enum name="NetworkCellularActivationState">
+ <int value="0" label="Activated"/>
+ <int value="1" label="Activating"/>
+ <int value="2" label="NotActivated"/>
+ <int value="3" label="PartiallyActivated"/>
+ <int value="4" label="Unknown"/>
+</enum>
+
+<enum name="NetworkCellularConnectionState">
+ <int value="0" label="Connected"/>
+ <int value="1" label="Disconnected"/>
+</enum>
+
<enum name="NetworkCellularOutOfCreditsReason">
<int value="0" label="Connect-Disconnect Loop"/>
<int value="1" label="TX-Queue Congestion"/>
@@ -40190,6 +41307,12 @@ Called by update_net_trust_anchors.py.-->
<int value="9" label="Unknown"/>
</enum>
+<enum name="NetworkCellularUsage">
+ <int value="0" label="ConnectAndOnlyNetwork"/>
+ <int value="1" label="ConnectWithOtherNetwork"/>
+ <int value="2" label="NotConnected"/>
+</enum>
+
<enum name="NetworkCellularUsageRequestStatus">
<summary>
Status code that we received in response to a cellular usage API request.
@@ -41418,6 +42541,20 @@ Called by update_net_trust_anchors.py.-->
The attempt resulted in a retriable loading failure. We encountered an error
page (e.g. 404 page).
</int>
+ <int value="21" label="Loading deferred (retriable, auto-fetch exclusive)">
+ Background loading of the page was deferred because its URL matches the one
+ on the active tab URL. The attempt will be retried later.
+ </int>
+ <int value="22" label="Page has certificate error">
+ The loaded page has a HTTPS certificate error. The request was aborted.
+ </int>
+ <int value="23" label="Page is blocked by SafeBrowsing">
+ The loaded page is blocked by SafeBrowsing. The request was aborted.
+ </int>
+ <int value="24" label="Page is an interstitial or error page">
+ The loaded page is a Chrome interstitial or an error page. The request was
+ aborted.
+ </int>
</enum>
<enum name="OfflinePagesBackgroundSavePageResult">
@@ -41627,17 +42764,17 @@ Called by update_net_trust_anchors.py.-->
Certain pages like file URL or NTP will not be saved because they're already
available offline.
</int>
- <int value="8" label="Security certificate error">
- Save operation failed because the page resulted in a security certificate
- error.
+ <int value="8" label="Deprecated: Security certificate error">
+ Deprecated: Save operation failed because the page resulted in a security
+ certificate error.
</int>
- <int value="9" label="Error page detected">
- Save operation failed because an error page (i.e. offline dino page) was
- detected.
+ <int value="9" label="Deprecated: Error page detected">
+ Deprecated: Save operation failed because an error page (i.e. offline dino
+ page) was detected.
</int>
- <int value="10" label="Interstitial page detected">
- Save operation failed because an interstitial page (i.e. page warning of
- expired certificates or improper dev signatures) was detected.
+ <int value="10" label="Deprecated: Interstitial page detected">
+ Deprecated: Save operation failed because an interstitial page (i.e. page
+ warning of expired certificates or improper dev signatures) was detected.
</int>
<int value="11" label="Digest calculation failure">
Failed to compute the digest of an archive file.
@@ -42025,8 +43162,7 @@ Called by update_net_trust_anchors.py.-->
<int value="3" label="the user's home page"/>
<int value="4" label="other (typically an arbitrary URL)"/>
<int value="5" label="obsolete: instant new tab page"/>
- <int value="6"
- label="obsolete: search results page with search term replacement"/>
+ <int value="6" label="search results page with search term replacement"/>
<int value="7" label="new tab page with omnibox as starting focus"/>
<int value="8" label="new tab page with fakebox as starting focus"/>
<int value="9" label="search results page without search term replacement"/>
@@ -42229,6 +43365,10 @@ Called by update_net_trust_anchors.py.-->
<int value="46" label="Yandex"/>
<int value="47" label="Zoznam"/>
<int value="48" label="360"/>
+ <int value="49" label="CocCoc"/>
+ <int value="50" label="DuckDuckGo"/>
+ <int value="51" label="Parsijoo"/>
+ <int value="52" label="Qwant"/>
</enum>
<enum name="OmniboxSuggestRequests">
@@ -42596,34 +43736,17 @@ Called by update_net_trust_anchors.py.-->
<enum name="OtherSessionsActions">
<int value="0" label="Menu initialized"/>
- <int value="1" label="Menu shown"/>
+ <int value="1" label="Menu shown (deprecated)"/>
<int value="2" label="Link clicked"/>
<int value="3" label="Link context menu shown"/>
- <int value="4" label="Device context menu shown"/>
+ <int value="4" label="Device context menu shown (deprecated)"/>
<int value="5" label="Unused/previous device context menu shown"/>
<int value="6" label="Collapse Session"/>
<int value="7" label="Expand Session"/>
<int value="8" label="Open All"/>
<int value="9" label="Has foreign data"/>
<int value="10" label="Hide for now"/>
-</enum>
-
-<enum name="OutOfProcessHeapProfilingMode">
- <int value="0" label="None"/>
- <int value="1" label="Minimal"/>
- <int value="2" label="All"/>
- <int value="3" label="Browser"/>
- <int value="4" label="Gpu"/>
- <int value="5" label="Renderer Sampling"/>
- <int value="6" label="All renderers"/>
- <int value="7" label="Manual"/>
-</enum>
-
-<enum name="OutOfProcessHeapProfilingProcessType">
- <int value="0" label="Other"/>
- <int value="1" label="Browser"/>
- <int value="2" label="Renderer"/>
- <int value="3" label="GPU"/>
+ <int value="11" label="Opened link via context menu"/>
</enum>
<enum name="OutputDeviceStatus">
@@ -42837,6 +43960,9 @@ Called by update_net_trust_anchors.py.-->
</enum>
<enum name="PageLoadMetricsAMPViewType">
+ <obsolete>
+ Deprecated 5/2019
+ </obsolete>
<int value="0" label="None"/>
<int value="1" label="AMP Cache"/>
<int value="2" label="Google Search AMP Viewer"/>
@@ -43053,6 +44179,13 @@ Called by update_net_trust_anchors.py.-->
<int value="4" label="Both candidates match initiator"/>
</enum>
+<enum name="PaintHoldingCommitTrigger">
+ <int value="0" label="Feature Disabled"/>
+ <int value="1" label="Disallowed"/>
+ <int value="2" label="First Contentful Paint"/>
+ <int value="3" label="Timeout"/>
+</enum>
+
<enum name="PaletteModeCancelType">
<int value="0" label="Palette laser pointer mode is cancelled."/>
<int value="1" label="Palette laser pointer mode is switched out of"/>
@@ -43148,6 +44281,14 @@ Called by update_net_trust_anchors.py.-->
<int value="1" label="DocumentLevelTouchPreventDefaultCalled"/>
</enum>
+<enum name="PasswordAddLoginSyncError">
+ <int value="0" label="None"/>
+ <int value="1" label="DB Not Available"/>
+ <int value="2" label="Constraint Violation"/>
+ <int value="3" label="Encryption Service Failure"/>
+ <int value="4" label="DB Error"/>
+</enum>
+
<enum name="PasswordApplySyncChangesState">
<int value="0" label="Apply OK"/>
<int value="1" label="Apply ADD failed"/>
@@ -43186,6 +44327,13 @@ Called by update_net_trust_anchors.py.-->
<int value="5" label="Weak signature algorithm"/>
</enum>
+<enum name="PasswordDecryptionResult">
+ <int value="0" label="Failed"/>
+ <int value="1" label="Succeeded"/>
+ <int value="2" label="Succeeded by skipping"/>
+ <int value="3" label="Succeeded by ignoring failure"/>
+</enum>
+
<enum name="PasswordDropdownSelectedOption">
<int value="0" label="Password"/>
<int value="1" label="Manage passwords"/>
@@ -44267,6 +45415,9 @@ Called by update_net_trust_anchors.py.-->
<int value="3" label="Server failed"/>
<int value="4" label="Cleanup failed"/>
<int value="5" label="Decryption failed"/>
+ <int value="6" label="Add failed"/>
+ <int value="7" label="Update failed"/>
+ <int value="8" label="Metadata persistence failed"/>
</enum>
<enum name="PaymentRequestAbortReason">
@@ -44468,7 +45619,7 @@ Called by update_net_trust_anchors.py.-->
<int value="36133501" label="PPB_MediaStreamVideoTrack;1.0"/>
<int value="37307420" label="PPB_Scrollbar(Dev);0.5"/>
<int value="59327104" label="PPB_Messaging;1.2"/>
- <int value="62905097" label="PPB_TrueTypeFont(Removed);0.1"/>
+ <int value="62905097" label="PPB_TrueTypeFont(Dev);0.1"/>
<int value="79708274" label="PPB_TCPSocket;1.1"/>
<int value="110360074" label="PPB_Var;1.1"/>
<int value="125017713" label="PPB_CameraCapabilities_Private;0.1"/>
@@ -44735,6 +45886,14 @@ Called by update_net_trust_anchors.py.-->
<int value="9" label="PERMISSION_VIDEO_CAPTURE"/>
<int value="10" label="PERMISSION_BACKGROUND_SYNC"/>
<int value="11" label="PERMISSION_FLASH"/>
+ <int value="12" label="PERMISSION_SENSORS"/>
+ <int value="13" label="PERMISSION_ACCESSIBILITY_EVENTS"/>
+ <int value="14" label="PERMISSION_CLIPBOARD_READ"/>
+ <int value="15" label="PERMISSION_CLIPBOARD_WRITE"/>
+ <int value="16" label="PERMISSION_PAYMENT_HANDLER"/>
+ <int value="17" label="PERMISSION_BACKGROUND_FETCH"/>
+ <int value="18" label="PERMISSION_IDLE_DETECTION"/>
+ <int value="19" label="PERMISSION_PERIODIC_BACKGROUND_SYNC"/>
</enum>
<enum name="PersistedLogsLogReadStatus">
@@ -45116,6 +46275,21 @@ Called by update_net_trust_anchors.py.-->
<int value="5" label="Unthrottled by Omnibox icon"/>
</enum>
+<enum name="PluginVmLaunchResult">
+ <int value="0" label="Success"/>
+ <int value="1" label="Error"/>
+</enum>
+
+<enum name="PluginVmSetupResult">
+ <int value="0" label="Success"/>
+ <int value="1" label="Plugin VM is not allowed for this user"/>
+ <int value="2" label="Error while downloading Plugin VM image"/>
+ <int value="3" label="Error while importing Plugin VM image"/>
+ <int value="4"
+ label="User cancelled setup while downloading Plugin VM image"/>
+ <int value="5" label="User cancelled setup while importing Plugin VM image"/>
+</enum>
+
<enum name="PNaClOptionsOptLevelEnum">
<int value="0" label="0"/>
<int value="1" label="1"/>
@@ -45137,6 +46311,48 @@ Called by update_net_trust_anchors.py.-->
<int value="5" label="5"/>
</enum>
+<enum name="PolicyAtomicGroups">
+<!-- Generated from components/policy/resources/policy_templates.json -->
+
+ <int value="1" label="Homepage"/>
+ <int value="2" label="RemoteAccess"/>
+ <int value="3" label="PasswordManager"/>
+ <int value="4" label="Proxy"/>
+ <int value="5" label="Extensions"/>
+ <int value="6" label="RestoreOnStartupGroup"/>
+ <int value="7" label="DefaultSearchProvider"/>
+ <int value="8" label="ImageSettings"/>
+ <int value="9" label="CookiesSettings"/>
+ <int value="10" label="JavascriptSettings"/>
+ <int value="11" label="PluginsSettings"/>
+ <int value="12" label="PopupsSettings"/>
+ <int value="13" label="KeygenSettings"/>
+ <int value="14" label="NotificationsSettings"/>
+ <int value="15" label="WebUsbSettings"/>
+ <int value="16" label="NativeMessaging"/>
+ <int value="17" label="Drive"/>
+ <int value="18" label="Attestation"/>
+ <int value="19" label="ContentPack"/>
+ <int value="20" label="SupervisedUsers"/>
+ <int value="21" label="GoogleCast"/>
+ <int value="22" label="QuickUnlock"/>
+ <int value="23" label="PinUnlock"/>
+ <int value="24" label="SafeBrowsing"/>
+ <int value="25" label="PasswordProtection"/>
+ <int value="26" label="NetworkFileShares"/>
+ <int value="27" label="ChromeReportingExtension"/>
+ <int value="28" label="BrowserSwitcher"/>
+ <int value="29" label="PluginVm"/>
+ <int value="30" label="DeviceSAML"/>
+ <int value="31" label="DeviceLoginScreenOrigins"/>
+ <int value="32" label="UserAndDeviceReporting"/>
+ <int value="33" label="DeviceWiFi"/>
+ <int value="34" label="Kiosk"/>
+ <int value="35" label="DateAndTime"/>
+ <int value="36" label="Display"/>
+ <int value="37" label="ActiveDirectoryManagement"/>
+</enum>
+
<enum name="PolicyLoadStatus">
<int value="0" label="Success"/>
<int value="1" label="No Policy File"/>
@@ -46008,6 +47224,7 @@ Called by update_net_trust_anchors.py.-->
label="URL contained Basic Authentication, i.e.: a username or
password."/>
<int value="17" label="Optimization hints not loaded."/>
+ <int value="18" label="The navigation URL had an excluded media suffix."/>
</enum>
<enum name="PreviewsHintCacheLevelDBStoreLoadMetadataResult">
@@ -46028,6 +47245,9 @@ Called by update_net_trust_anchors.py.-->
</enum>
<enum name="PreviewsInfoBarAction">
+ <obsolete>
+ Removed in M76.
+ </obsolete>
<int value="0" label="Infobar shown"/>
<int value="1" label="Infobar 'Load original' clicked"/>
<int value="2" label="Infobar dismissed by user"/>
@@ -46094,7 +47314,7 @@ Called by update_net_trust_anchors.py.-->
</enum>
<enum name="PreviewsServerLitePageBlacklistReason">
- <int value="0" label="Path suffix"/>
+ <int value="0" label="(DEPRECATED IN M76) Path suffix"/>
<int value="1" label="Navigation to Previews Domain"/>
<int value="2" label="Navigation to Private Domain"/>
<int value="3" label="Host was blacklisted in a previous server request"/>
@@ -46114,6 +47334,7 @@ Called by update_net_trust_anchors.py.-->
label="Exceeded maximum number of navigation restarts or a redirect
loop was detected"/>
<int value="10" label="(DEPRECATED IN M74) Disallowed by PreviewsState"/>
+ <int value="11" label="The chrome-proxy header is invalid"/>
</enum>
<enum name="PreviewsServerLitePageServerResponse">
@@ -46190,6 +47411,7 @@ Called by update_net_trust_anchors.py.-->
<int value="4" label="Can't configure native printers due to policy"/>
<int value="5" label="Invalid values are used to update printer"/>
<int value="6" label="Could not install component"/>
+ <int value="7" label="Edit success"/>
<int value="10" label="PPD exceeds size limit"/>
<int value="11" label="PPD Rejected by cupstestppd"/>
<int value="12" label="Could not find PPD"/>
@@ -47812,11 +49034,43 @@ Called by update_net_trust_anchors.py.-->
<int value="9" label="DownloadError"/>
</enum>
+<enum name="RecurrenceRankerConfigurationError">
+ <int value="0" label="HashMismatch"/>
+ <int value="1" label="InvalidParameter"/>
+ <int value="2" label="InvalidPredictor"/>
+ <int value="3" label="FakePredictorUsed"/>
+</enum>
+
+<enum name="RecurrenceRankerSerializationError">
+ <int value="0" label="ModelReadError"/>
+ <int value="1" label="ModelWriteError"/>
+ <int value="2" label="FromProtoError"/>
+ <int value="3" label="ToProtoError"/>
+ <int value="4" label="PredictorMissingError"/>
+ <int value="5" label="TargetsMissingError"/>
+ <int value="6" label="ConditionsMissingError"/>
+ <int value="7" label="FakePredictorLoadingError"/>
+ <int value="8" label="ZeroStateFrecencyPredictorLoadingError"/>
+ <int value="9" label="ZeroStateHourBinnedPredictorLoadingError"/>
+</enum>
+
+<enum name="RecurrenceRankerUsageError">
+ <int value="0" label="InvalidTrainCall"/>
+ <int value="1" label="InvalidRankCall"/>
+</enum>
+
<enum name="RecurrentErrorAction">
<int value="0" label="Recurrent error interstitial shown"/>
<int value="1" label="User proceeded through recurrent error interstitial"/>
</enum>
+<enum name="RedirectPosition">
+ <int value="0" label="Only URL in redirect chain"/>
+ <int value="1" label="First URL in redirect chain"/>
+ <int value="2" label="Any middle URL in redirect chain"/>
+ <int value="3" label="Last redirect in URL chain"/>
+</enum>
+
<enum name="RefcountOperation">
<int value="0" label="Decrement"/>
<int value="1" label="Increment"/>
@@ -48043,7 +49297,7 @@ Called by update_net_trust_anchors.py.-->
<int value="33" label="InternalInspector"/>
<int value="34" label="InternalAnimation"/>
<int value="35" label="InternalAccessibility"/>
- <int value="36" label="InternalWorker"/>
+ <int value="36" label="InternalWorker (obsolete)"/>
<int value="37" label="MainThreadTaskQueueV8"/>
<int value="38" label="MainThreadTaskQueueCompositor"/>
<int value="39" label="MainThreadTaskQueueDefault"/>
@@ -48107,6 +49361,9 @@ Called by update_net_trust_anchors.py.-->
</enum>
<enum name="RendererUnresponsiveCause">
+ <obsolete>
+ Removed 4/2019.
+ </obsolete>
<int value="0" label="Navigation commit timeout"/>
<int value="1" label="Input event ack timeout"/>
</enum>
@@ -48623,11 +49880,12 @@ Called by update_net_trust_anchors.py.-->
<int value="6" label="SVG"/>
<int value="7" label="XSL"/>
<int value="8" label="Link prefetch"/>
- <int value="9" label="Link subresource"/>
- <int value="10" label="Text track"/>
- <int value="11" label="ImportResource"/>
- <int value="12" label="Media"/>
+ <int value="9" label="Text track"/>
+ <int value="10" label="ImportResource"/>
+ <int value="11" label="Audio"/>
+ <int value="12" label="Video"/>
<int value="13" label="Manifest"/>
+ <int value="14" label="Mock"/>
</enum>
<enum name="RestoredCachedStyleSheet">
@@ -49541,6 +50799,29 @@ Called by update_net_trust_anchors.py.-->
<int value="362" label="CONFIGPROFILE"/>
<int value="363" label="INTERNETCONNECT"/>
<int value="364" label="NETWORKCONNECT"/>
+ <int value="365" label="BMP"/>
+ <int value="366" label="CSS"/>
+ <int value="367" label="EHTML"/>
+ <int value="368" label="FLAC"/>
+ <int value="369" label="ICO"/>
+ <int value="370" label="JFIF"/>
+ <int value="371" label="M4A"/>
+ <int value="372" label="M4V"/>
+ <int value="373" label="MPEG"/>
+ <int value="374" label="MPG"/>
+ <int value="375" label="OGA"/>
+ <int value="376" label="OGG"/>
+ <int value="377" label="OGM"/>
+ <int value="378" label="OGV"/>
+ <int value="379" label="OPUS"/>
+ <int value="380" label="PJP"/>
+ <int value="381" label="PJPEG"/>
+ <int value="382" label="SVGZ"/>
+ <int value="383" label="TEXT"/>
+ <int value="384" label="TIFF"/>
+ <int value="385" label="WEBA"/>
+ <int value="386" label="WEBM"/>
+ <int value="387" label="XBM"/>
</enum>
<enum name="SBClientDownloadIsSignedBinary">
@@ -49739,6 +51020,9 @@ Called by update_net_trust_anchors.py.-->
</enum>
<enum name="SCTCanBeChecked">
+ <obsolete>
+ Deprecated after 2019-04.
+ </obsolete>
<int value="0" label="No valid STH"/>
<int value="1" label="Requires newer STH"/>
<int value="2" label="Can be checked for inclusion"/>
@@ -50054,9 +51338,20 @@ Called by update_net_trust_anchors.py.-->
<int value="2" label="Duplicate"/>
</enum>
+<enum name="SendTabToSelfApplySyncChanges">
+ <int value="0" label="Total number of EntityChanges."/>
+ <int value="1" label="Number of EntityChanges that are deletions."/>
+ <int value="2" label="Number of EntityChanges that are invaled."/>
+ <int value="3" label="Number of EntityChanges that are expired."/>
+ <int value="4" label="Number of EntityChanges that are added."/>
+ <int value="5" label="Number of EntityChanges that are opened."/>
+ <int value="6" label="Number of EntityChanges that are removed."/>
+</enum>
+
<enum name="SendTabToSelfClickResult">
- <int value="0" label="SendTabToSelf menu item is shown."/>
- <int value="1" label="SendTabToSelf menu item is clicked."/>
+ <int value="0" label="SendTabToSelf entry point is shown."/>
+ <int value="1" label="SendTabToSelf target device is clicked."/>
+ <int value="2" label="SendTabToSelf device list is shown."/>
</enum>
<enum name="SendTabToSelfNotification">
@@ -50066,6 +51361,11 @@ Called by update_net_trust_anchors.py.-->
<int value="3" label="DismissedRemotely"/>
</enum>
+<enum name="SendTabToSelfNotifyLocalDevice">
+ <int value="0" label="Local"/>
+ <int value="1" label="Remote"/>
+</enum>
+
<enum name="ServiceProcessEventType">
<int value="0" label="SERVICE_EVENT_INITIALIZE"/>
<int value="1" label="SERVICE_EVENT_ENABLED_ON_LAUNCH"/>
@@ -50252,7 +51552,9 @@ Called by update_net_trust_anchors.py.-->
<int value="28" label="CAN_MAKE_PAYMENT"/>
<int value="29" label="ABORT_PAYMENT"/>
<int value="30" label="COOKIE_CHANGE"/>
- <int value="31" label="BACKGROUND_FETCH_SUCCESS"/>
+ <int value="31" label="LONG_RUNNING_MESSAGE"/>
+ <int value="32" label="BACKGROUND_FETCH_SUCCESS"/>
+ <int value="33" label="PERIODIC_SYNC"/>
</enum>
<enum name="ServiceWorkerPreparationType">
@@ -50916,14 +52218,17 @@ Called by update_net_trust_anchors.py.-->
<enum name="SignedExchangeSignatureVerificationResult">
<int value="0" label="Success"/>
- <int value="1" label="No certificate"/>
- <int value="2" label="No cert-sha256"/>
+ <int value="1" label="No certificate (deprecated)"/>
+ <int value="2" label="No cert-sha256 (deprecated)"/>
<int value="3" label="cert-sha256 mismatch"/>
- <int value="4" label="Failed to reconstruct signed message"/>
+ <int value="4" label="Failed to reconstruct signed message (deprecated)"/>
<int value="5" label="Failed to verify signature"/>
<int value="6" label="Invalid integrity scheme"/>
- <int value="7" label="Invalid timestamp"/>
+ <int value="7" label="Invalid timestamp (deprecated)"/>
<int value="8" label="Unsupported certificate type"/>
+ <int value="9" label="Validity period is loo long"/>
+ <int value="10" label="Signature is not yet valid"/>
+ <int value="11" label="Signature is expired"/>
</enum>
<enum name="SignedExchangeValidityPingResult">
@@ -51172,6 +52477,383 @@ Called by update_net_trust_anchors.py.-->
<int value="12" label="Unknown"/>
</enum>
+<enum name="SigninSSOAuthGetIdentitiesErrorCode">
+ <int value="-67898" label="errSecTimestampRevocationNotification"/>
+ <int value="-67897" label="errSecTimestampRevocationWarning"/>
+ <int value="-67896" label="errSecTimestampWaiting"/>
+ <int value="-67895" label="errSecTimestampRejection"/>
+ <int value="-67894" label="errSecSigningTimeMissing"/>
+ <int value="-67893" label="errSecTimestampSystemFailure"/>
+ <int value="-67892" label="errSecTimestampAddInfoNotAvailable"/>
+ <int value="-67891" label="errSecTimestampUnacceptedExtension"/>
+ <int value="-67890" label="errSecTimestampUnacceptedPolicy"/>
+ <int value="-67889" label="errSecTimestampTimeNotAvailable"/>
+ <int value="-67888" label="errSecTimestampBadDataFormat"/>
+ <int value="-67887" label="errSecTimestampBadRequest"/>
+ <int value="-67886" label="errSecTimestampBadAlg"/>
+ <int value="-67885" label="errSecTimestampServiceNotAvailable"/>
+ <int value="-67884" label="errSecTimestampNotTrusted"/>
+ <int value="-67883" label="errSecTimestampInvalid"/>
+ <int value="-67882" label="errSecTimestampMissing"/>
+ <int value="-67881" label="errSecExtendedKeyUsageNotCritical"/>
+ <int value="-67880" label="errSecMissingRequiredExtension"/>
+ <int value="-67879" label="errSecInvalidModifyMode"/>
+ <int value="-67878" label="errSecInvalidNewOwner"/>
+ <int value="-67877" label="errSecInvalidIndexInfo"/>
+ <int value="-67876" label="errSecInvalidAccessRequest"/>
+ <int value="-67875" label="errSecInvalidDBLocation"/>
+ <int value="-67874" label="errSecUnsupportedOperator"/>
+ <int value="-67873" label="errSecUnsupportedNumSelectionPreds"/>
+ <int value="-67872" label="errSecUnsupportedQueryLimits"/>
+ <int value="-67871" label="errSecMissingValue"/>
+ <int value="-67870" label="errSecDatastoreIsOpen"/>
+ <int value="-67869" label="errSecDatabaseLocked"/>
+ <int value="-67868" label="errSecInvalidParsingModule"/>
+ <int value="-67867" label="errSecIncompatibleFieldFormat"/>
+ <int value="-67866" label="errSecFieldSpecifiedMultiple"/>
+ <int value="-67865" label="errSecUnsupportedNumRecordTypes"/>
+ <int value="-67864" label="errSecUnsupportedNumIndexes"/>
+ <int value="-67863" label="errSecUnsupportedNumAttributes"/>
+ <int value="-67862" label="errSecUnsupportedLocality"/>
+ <int value="-67861" label="errSecUnsupportedIndexInfo"/>
+ <int value="-67860" label="errSecUnsupportedFieldFormat"/>
+ <int value="-67859" label="errSecNoFieldValues"/>
+ <int value="-67858" label="errSecInvalidCRLIndex"/>
+ <int value="-67857" label="errSecInvalidBundleInfo"/>
+ <int value="-67856" label="errSecRequestDescriptor"/>
+ <int value="-67855" label="errSecInvalidRequestor"/>
+ <int value="-67854" label="errSecInvalidValidityPeriod"/>
+ <int value="-67853" label="errSecInvalidEncoding"/>
+ <int value="-67852" label="errSecInvalidTupleCredendtials"/>
+ <int value="-67851" label="errSecInvalidBaseACLs"/>
+ <int value="-67850" label="errSecInvalidTupleGroup"/>
+ <int value="-67849" label="errSecUnsupportedService"/>
+ <int value="-67848" label="errSecUnsupportedAddressType"/>
+ <int value="-67847" label="errSecRequestRejected"/>
+ <int value="-67846" label="errSecRequestLost"/>
+ <int value="-67845" label="errSecRejectedForm"/>
+ <int value="-67844" label="errSecNoDefaultAuthority"/>
+ <int value="-67843" label="errSecNotTrusted"/>
+ <int value="-67842" label="errSecMultipleValuesUnsupported"/>
+ <int value="-67841" label="errSecInvalidTuple"/>
+ <int value="-67840" label="errSecInvalidStopOnPolicy"/>
+ <int value="-67839" label="errSecInvalidResponseVector"/>
+ <int value="-67838" label="errSecInvalidRequestInputs"/>
+ <int value="-67837" label="errSecInvalidReason"/>
+ <int value="-67836" label="errSecInvalidTimeString"/>
+ <int value="-67835" label="errSecInvalidPolicyIdentifiers"/>
+ <int value="-67834" label="errSecInvalidIndex"/>
+ <int value="-67833" label="errSecInvalidIdentifier"/>
+ <int value="-67832" label="errSecInvalidID"/>
+ <int value="-67831" label="errSecInvalidFormType"/>
+ <int value="-67830" label="errSecInvalidCRL"/>
+ <int value="-67829" label="errSecInvalidCRLType"/>
+ <int value="-67828" label="errSecInvalidCRLEncoding"/>
+ <int value="-67827" label="errSecInvaldCRLAuthority"/>
+ <int value="-67826" label="errSecInvalidCertAuthority"/>
+ <int value="-67825" label="errSecVerifyActionFailed"/>
+ <int value="-67824" label="errSecInvalidAuthority"/>
+ <int value="-67823" label="errSecInvalidAction"/>
+ <int value="-67822" label="errSecInsufficientCredentials"/>
+ <int value="-67821" label="errSecCertificateSuspended"/>
+ <int value="-67820" label="errSecCertificateRevoked"/>
+ <int value="-67819" label="errSecCertificateNotValidYet"/>
+ <int value="-67818" label="errSecCertificateExpired"/>
+ <int value="-67817" label="errSecCertificateCannotOperate"/>
+ <int value="-67816" label="errSecInvalidCRLGroup"/>
+ <int value="-67815" label="errSecInvalidDigestAlgorithm"/>
+ <int value="-67814" label="errSecAlreadyLoggedIn"/>
+ <int value="-67813" label="errSecInvalidLoginName"/>
+ <int value="-67812" label="errSecDeviceVerifyFailed"/>
+ <int value="-67811" label="errSecPublicKeyInconsistent"/>
+ <int value="-67810" label="errSecBlockSizeMismatch"/>
+ <int value="-67809" label="errSecQuerySizeUnknown"/>
+ <int value="-67808" label="errSecVerifyFailed"/>
+ <int value="-67807" label="errSecStagedOperationNotStarted"/>
+ <int value="-67806" label="errSecStagedOperationInProgress"/>
+ <int value="-67805" label="errSecMissingAttributeWrappedKeyFormat"/>
+ <int value="-67804" label="errSecInvalidAttributeWrappedKeyFormat"/>
+ <int value="-67803" label="errSecMissingAttributeSymmetricKeyFormat"/>
+ <int value="-67802" label="errSecInvalidAttributeSymmetricKeyFormat"/>
+ <int value="-67801" label="errSecMissingAttributePrivateKeyFormat"/>
+ <int value="-67800" label="errSecInvalidAttributePrivateKeyFormat"/>
+ <int value="-67799" label="errSecMissingAttributePublicKeyFormat"/>
+ <int value="-67798" label="errSecInvalidAttributePublicKeyFormat"/>
+ <int value="-67797" label="errSecMissingAttributeAccessCredentials"/>
+ <int value="-67796" label="errSecInvalidAttributeAccessCredentials"/>
+ <int value="-67795" label="errSecMissingAttributeDLDBHandle"/>
+ <int value="-67794" label="errSecInvalidAttributeDLDBHandle"/>
+ <int value="-67793" label="errSecMissingAttributeIterationCount"/>
+ <int value="-67792" label="errSecInvalidAttributeIterationCount"/>
+ <int value="-67791" label="errSecMissingAttributeSubprime"/>
+ <int value="-67790" label="errSecInvalidAttributeSubprime"/>
+ <int value="-67789" label="errSecMissingAttributeBase"/>
+ <int value="-67788" label="errSecInvalidAttributeBase"/>
+ <int value="-67787" label="errSecMissingAttributePrime"/>
+ <int value="-67786" label="errSecInvalidAttributePrime"/>
+ <int value="-67785" label="errSecMissingAttributeVersion"/>
+ <int value="-67784" label="errSecInvalidAttributeVersion"/>
+ <int value="-67783" label="errSecMissingAttributeEndDate"/>
+ <int value="-67782" label="errSecInvalidAttributeEndDate"/>
+ <int value="-67781" label="errSecMissingAttributeStartDate"/>
+ <int value="-67780" label="errSecInvalidAttributeStartDate"/>
+ <int value="-67779" label="errSecMissingAttributeEffectiveBits"/>
+ <int value="-67778" label="errSecInvalidAttributeEffectiveBits"/>
+ <int value="-67777" label="errSecMissingAttributeMode"/>
+ <int value="-67776" label="errSecInvalidAttributeMode"/>
+ <int value="-67775" label="errSecMissingAttributeKeyType"/>
+ <int value="-67774" label="errSecInvalidAttributeKeyType"/>
+ <int value="-67773" label="errSecMissingAttributeLabel"/>
+ <int value="-67772" label="errSecInvalidAttributeLabel"/>
+ <int value="-67771" label="errSecMissingAlgorithmParms"/>
+ <int value="-67770" label="errSecInvalidAlgorithmParms"/>
+ <int value="-67769" label="errSecMissingAttributeRounds"/>
+ <int value="-67768" label="errSecInvalidAttributeRounds"/>
+ <int value="-67767" label="errSecMissingAttributeOutputSize"/>
+ <int value="-67766" label="errSecInvalidAttributeOutputSize"/>
+ <int value="-67765" label="errSecMissingAttributeBlockSize"/>
+ <int value="-67764" label="errSecInvalidAttributeBlockSize"/>
+ <int value="-67763" label="errSecMissingAttributeKeyLength"/>
+ <int value="-67762" label="errSecInvalidAttributeKeyLength"/>
+ <int value="-67761" label="errSecMissingAttributePassphrase"/>
+ <int value="-67760" label="errSecInvalidAttributePassphrase"/>
+ <int value="-67759" label="errSecMissingAttributeSeed"/>
+ <int value="-67758" label="errSecInvalidAttributeSeed"/>
+ <int value="-67757" label="errSecMissingAttributeRandom"/>
+ <int value="-67756" label="errSecInvalidAttributeRandom"/>
+ <int value="-67755" label="errSecMissingAttributePadding"/>
+ <int value="-67754" label="errSecInvalidAttributePadding"/>
+ <int value="-67753" label="errSecMissingAttributeSalt"/>
+ <int value="-67752" label="errSecInvalidAttributeSalt"/>
+ <int value="-67751" label="errSecMissingAttributeInitVector"/>
+ <int value="-67750" label="errSecInvalidAttributeInitVector"/>
+ <int value="-67749" label="errSecMissingAttributeKey"/>
+ <int value="-67748" label="errSecInvalidAttributeKey"/>
+ <int value="-67747" label="errSecInvalidAlgorithm"/>
+ <int value="-67746" label="errSecInvalidContext"/>
+ <int value="-67745" label="errSecInvalidOutputVector"/>
+ <int value="-67744" label="errSecInvalidInputVector"/>
+ <int value="-67743" label="errSecUnsupportedVectorOfBuffers"/>
+ <int value="-67742" label="errSecInvalidKeyFormat"/>
+ <int value="-67741" label="errSecUnsupportedKeyLabel"/>
+ <int value="-67740" label="errSecInvalidKeyLabel"/>
+ <int value="-67739" label="errSecUnsupportedKeyAttributeMask"/>
+ <int value="-67738" label="errSecInvalidKeyAttributeMask"/>
+ <int value="-67737" label="errSecUnsupportedKeyUsageMask"/>
+ <int value="-67736" label="errSecInvalidKeyUsageMask"/>
+ <int value="-67735" label="errSecUnsupportedKeySize"/>
+ <int value="-67734" label="errSecUnsupportedKeyFormat"/>
+ <int value="-67733" label="errSecKeyHeaderInconsistent"/>
+ <int value="-67732" label="errSecKeyBlobTypeIncorrect"/>
+ <int value="-67731" label="errSecKeyUsageIncorrect"/>
+ <int value="-67730" label="errSecAlgorithmMismatch"/>
+ <int value="-67729" label="errSecNotLoggedIn"/>
+ <int value="-67728" label="errSecAttachHandleBusy"/>
+ <int value="-67727" label="errSecDeviceError"/>
+ <int value="-67726" label="errSecPrivilegeNotSupported"/>
+ <int value="-67725" label="errSecOutputLengthError"/>
+ <int value="-67724" label="errSecInputLengthError"/>
+ <int value="-67723" label="errSecEventNotificationCallbackNotFound"/>
+ <int value="-67722" label="errSecModuleManagerNotFound"/>
+ <int value="-67721" label="errSecModuleManagerInitializeFailed"/>
+ <int value="-67720" label="errSecAttributeNotInContext"/>
+ <int value="-67719" label="errSecInvalidSubServiceID"/>
+ <int value="-67718" label="errSecModuleNotLoaded"/>
+ <int value="-67717" label="errSecInvalidServiceMask"/>
+ <int value="-67716" label="errSecInvalidAddinFunctionTable"/>
+ <int value="-67715" label="errSecLibraryReferenceNotFound"/>
+ <int value="-67714" label="errSecAddinUnloadFailed"/>
+ <int value="-67713" label="errSecInvalidKeyHierarchy"/>
+ <int value="-67712" label="errSecInvalidKeyRef"/>
+ <int value="-67711" label="errSecAddinLoadFailed"/>
+ <int value="-67710" label="errSecEMMUnloadFailed"/>
+ <int value="-67709" label="errSecEMMLoadFailed"/>
+ <int value="-67708" label="errSecInvalidPVC"/>
+ <int value="-67707" label="errSecPVCAlreadyConfigured"/>
+ <int value="-67706" label="errSecInvalidScope"/>
+ <int value="-67705" label="errSecPrivilegeNotGranted"/>
+ <int value="-67704" label="errSecIncompatibleVersion"/>
+ <int value="-67703" label="errSecInvalidSampleValue"/>
+ <int value="-67702" label="errSecInvalidACL"/>
+ <int value="-67701" label="errSecInvalidRecord"/>
+ <int value="-67700" label="errSecInvalidAccessCredentials"/>
+ <int value="-67699" label="errSecACLChangeFailed"/>
+ <int value="-67698" label="errSecACLAddFailed"/>
+ <int value="-67697" label="errSecACLReplaceFailed"/>
+ <int value="-67696" label="errSecACLDeleteFailed"/>
+ <int value="-67695" label="errSecCallbackFailed"/>
+ <int value="-67694" label="errSecInvalidValue"/>
+ <int value="-67693" label="errSecInvalidQuery"/>
+ <int value="-67692" label="errSecTagNotFound"/>
+ <int value="-67691" label="errSecInvalidCertificateGroup"/>
+ <int value="-67690" label="errSecInvalidCertificateRef"/>
+ <int value="-67689" label="errSecInvalidName"/>
+ <int value="-67688" label="errSecInvalidSignature"/>
+ <int value="-67687" label="errSecUnknownTag"/>
+ <int value="-67686" label="errSecVerificationFailure"/>
+ <int value="-67685" label="errSecInvalidNumberOfFields"/>
+ <int value="-67684" label="errSecCRLAlreadySigned"/>
+ <int value="-67683" label="errSecInvalidNetworkAddress"/>
+ <int value="-67682" label="errSecInvalidPassthroughID"/>
+ <int value="-67681" label="errSecInvalidDBList"/>
+ <int value="-67680" label="errSecInvalidHandle"/>
+ <int value="-67679" label="errSecInvalidGUID"/>
+ <int value="-67678" label="errSecModuleManifestVerifyFailed"/>
+ <int value="-67677" label="errSecFunctionFailed"/>
+ <int value="-67676" label="errSecSelfCheckFailed"/>
+ <int value="-67675" label="errSecInvalidPointer"/>
+ <int value="-67674" label="errSecMDSError"/>
+ <int value="-67673" label="errSecInvalidData"/>
+ <int value="-67672" label="errSecMemoryError"/>
+ <int value="-67671" label="errSecInternalError"/>
+ <int value="-67670" label="errSecFunctionIntegrityFail"/>
+ <int value="-67669" label="errSecPVCReferentNotFound"/>
+ <int value="-67668" label="errSecInvalidHandleUsage"/>
+ <int value="-67667" label="errSecNotInitialized"/>
+ <int value="-67666" label="errSecMobileMeFailedConsistencyCheck"/>
+ <int value="-67665" label="errSecMobileMeCSRVerifyFailure"/>
+ <int value="-67664" label="errSecMobileMeNoRequestPending"/>
+ <int value="-67663" label="errSecMobileMeRequestAlreadyPending"/>
+ <int value="-67662" label="errSecMobileMeServerServiceErr"/>
+ <int value="-67661" label="errSecMobileMeServerAlreadyExists"/>
+ <int value="-67660" label="errSecMobileMeServerNotAvailable"/>
+ <int value="-67659" label="errSecMobileMeServerError"/>
+ <int value="-67658" label="errSecMobileMeRequestRedirected"/>
+ <int value="-67657" label="errSecMobileMeRequestQueued"/>
+ <int value="-67656" label="errSecUnknownQualifiedCertStatement"/>
+ <int value="-67655" label="errSecInvalidSubjectName"/>
+ <int value="-67654" label="errSecTrustSettingDeny"/>
+ <int value="-67653" label="errSecResourceSignBadExtKeyUsage"/>
+ <int value="-67652" label="errSecResourceSignBadCertChainLength"/>
+ <int value="-67651" label="errSecCodeSigningDevelopment"/>
+ <int value="-67650" label="errSecCodeSigningNoExtendedKeyUsage"/>
+ <int value="-67649" label="errSecCodeSigningBadPathLengthConstraint"/>
+ <int value="-67648" label="errSecCodeSigningNoBasicConstraints"/>
+ <int value="-67647" label="errSecCodeSigningBadCertChainLength"/>
+ <int value="-67646" label="errSecOCSPResponseNonceMismatch"/>
+ <int value="-67645" label="errSecOCSPResponderUnauthorized"/>
+ <int value="-67644" label="errSecOCSPResponderSignatureRequired"/>
+ <int value="-67643" label="errSecOCSPResponderTryLater"/>
+ <int value="-67642" label="errSecOCSPResponderInternalError"/>
+ <int value="-67641" label="errSecOCSPResponderMalformedReq"/>
+ <int value="-67640" label="errSecOCSPNoSigner"/>
+ <int value="-67639" label="errSecOCSPSignatureError"/>
+ <int value="-67638" label="errSecRecordModified"/>
+ <int value="-67637" label="errSecOCSPNotTrustedToAnchor"/>
+ <int value="-67636" label="errSecNetworkFailure"/>
+ <int value="-67635" label="errSecIncompleteCertRevocationCheck"/>
+ <int value="-67634" label="errSecEndOfData"/>
+ <int value="-67633" label="errSecOCSPStatusUnrecognized"/>
+ <int value="-67632" label="errSecOCSPUnavailable"/>
+ <int value="-67631" label="errSecOCSPBadRequest"/>
+ <int value="-67630" label="errSecOCSPBadResponse"/>
+ <int value="-67629" label="errSecSSLBadExtendedKeyUsage"/>
+ <int value="-67628" label="errSecSMIMESubjAltNameNotCritical"/>
+ <int value="-67627" label="errSecSMIMENoEmailAddress"/>
+ <int value="-67626" label="errSecSMIMEKeyUsageNotCritical"/>
+ <int value="-67625" label="errSecSMIMEBadKeyUsage"/>
+ <int value="-67624" label="errSecSMIMEBadExtendedKeyUsage"/>
+ <int value="-67623" label="errSecSMIMEEmailAddressesNotFound"/>
+ <int value="-67622" label="errSecIDPFailure"/>
+ <int value="-67621" label="errSecCRLPolicyFailed"/>
+ <int value="-67620" label="errSecCRLNotTrusted"/>
+ <int value="-67619" label="errSecUnknownCRLExtension"/>
+ <int value="-67618" label="errSecUnknownCertExtension"/>
+ <int value="-67617" label="errSecCRLBadURI"/>
+ <int value="-67616" label="errSecCRLServerDown"/>
+ <int value="-67615" label="errSecCRLNotFound"/>
+ <int value="-67614" label="errSecCRLNotValidYet"/>
+ <int value="-67613" label="errSecCRLExpired"/>
+ <int value="-67612" label="errSecInvalidRoot"/>
+ <int value="-67611" label="errSecPathLengthConstraintExceeded"/>
+ <int value="-67610" label="errSecInvalidIDLinkage"/>
+ <int value="-67609" label="errSecInvalidExtendedKeyUsage"/>
+ <int value="-67608" label="errSecInvalidKeyUsageForPolicy"/>
+ <int value="-67607" label="errSecInvalidSubjectKeyID"/>
+ <int value="-67606" label="errSecInvalidAuthorityKeyID"/>
+ <int value="-67605" label="errSecNoBasicConstraintsCA"/>
+ <int value="-67604" label="errSecNoBasicConstraints"/>
+ <int value="-67603" label="errSecUnknownCriticalExtensionFlag"/>
+ <int value="-67602" label="errSecHostNameMismatch"/>
+ <int value="-67601" label="errSecIncompatibleKeyBlob"/>
+ <int value="-67600" label="errSecIncompatibleDatabaseBlob"/>
+ <int value="-67599" label="errSecInvalidKeyBlob"/>
+ <int value="-67598" label="errSecInvalidDatabaseBlob"/>
+ <int value="-67597" label="errSecFileTooBig"/>
+ <int value="-67596" label="errSecQuotaExceeded"/>
+ <int value="-67595" label="errSecAppleSSLv2Rollback"/>
+ <int value="-67594" label="errSecConversionError"/>
+ <int value="-67593" label="errSecAppleInvalidKeyEndDate"/>
+ <int value="-67592" label="errSecAppleInvalidKeyStartDate"/>
+ <int value="-67591" label="errSecAppleSignatureMismatch"/>
+ <int value="-67590" label="errSecApplePublicKeyIncomplete"/>
+ <int value="-67589" label="errSecAppleAddAppACLSubject"/>
+ <int value="-67588" label="errSecDeviceFailed"/>
+ <int value="-67587" label="errSecDeviceReset"/>
+ <int value="-67586" label="errSecInsufficientClientID"/>
+ <int value="-67585" label="errSecServiceNotAvailable"/>
+ <int value="-34018" label="errSecMissingEntitlement"/>
+ <int value="-26275" label="errSecDecode"/>
+ <int value="-26267" label="errSecNotSigner"/>
+ <int value="-25320" label="errSecInDarkWake"/>
+ <int value="-25319" label="errSecInvalidPrefsDomain"/>
+ <int value="-25318" label="errSecCreateChainFailed"/>
+ <int value="-25317" label="errSecDataNotModifiable"/>
+ <int value="-25316" label="errSecDataNotAvailable"/>
+ <int value="-25315" label="errSecInteractionRequired"/>
+ <int value="-25314" label="errSecNoPolicyModule"/>
+ <int value="-25313" label="errSecNoCertificateModule"/>
+ <int value="-25312" label="errSecNoStorageModule"/>
+ <int value="-25311" label="errSecKeySizeNotAllowed"/>
+ <int value="-25310" label="errSecWrongSecVersion"/>
+ <int value="-25309" label="errSecReadOnlyAttr"/>
+ <int value="-25308" label="errSecInteractionNotAllowed"/>
+ <int value="-25307" label="errSecNoDefaultKeychain"/>
+ <int value="-25306" label="errSecNoSuchClass"/>
+ <int value="-25305" label="errSecInvalidSearchRef"/>
+ <int value="-25304" label="errSecInvalidItemRef"/>
+ <int value="-25303" label="errSecNoSuchAttr"/>
+ <int value="-25302" label="errSecDataTooLarge"/>
+ <int value="-25301" label="errSecBufferTooSmall"/>
+ <int value="-25300" label="errSecItemNotFound"/>
+ <int value="-25299" label="errSecDuplicateItem"/>
+ <int value="-25298" label="errSecInvalidCallback"/>
+ <int value="-25297" label="errSecDuplicateCallback"/>
+ <int value="-25296" label="errSecDuplicateKeychain"/>
+ <int value="-25295" label="errSecInvalidKeychain"/>
+ <int value="-25294" label="errSecNoSuchKeychain"/>
+ <int value="-25293" label="errSecAuthFailed"/>
+ <int value="-25292" label="errSecReadOnly"/>
+ <int value="-25291" label="errSecNotAvailable"/>
+ <int value="-25264" label="errSecPkcs12VerifyFailure"/>
+ <int value="-25263" label="errSecNoTrustSettings"/>
+ <int value="-25262" label="errSecInvalidTrustSettings"/>
+ <int value="-25261" label="errSecInvalidPasswordRef"/>
+ <int value="-25260" label="errSecPassphraseRequired"/>
+ <int value="-25259" label="errSecMultiplePrivKeys"/>
+ <int value="-25258" label="errSecKeyIsSensitive"/>
+ <int value="-25257" label="errSecUnknownFormat"/>
+ <int value="-25256" label="errSecUnsupportedFormat"/>
+ <int value="-25245" label="errSecTrustNotAvailable"/>
+ <int value="-25244" label="errSecInvalidOwnerEdit"/>
+ <int value="-25243" label="errSecNoAccessForItem"/>
+ <int value="-25242" label="errSecInvalidTrustSetting"/>
+ <int value="-25241" label="errSecPolicyNotFound"/>
+ <int value="-25240" label="errSecACLNotSimple"/>
+ <int value="-4960" label="errSecCoreFoundationUnknown"/>
+ <int value="-2070" label="errSecInternalComponent"/>
+ <int value="-909" label="errSecBadReq"/>
+ <int value="-128" label="errSecUserCanceled"/>
+ <int value="-108" label="errSecAllocate"/>
+ <int value="-61" label="errSecWrPerm"/>
+ <int value="-50" label="errSecParam"/>
+ <int value="-49" label="errSecOpWr"/>
+ <int value="-36" label="errSecIO"/>
+ <int value="-34" label="errSecDiskFull"/>
+ <int value="-4" label="errSecUnimplemented"/>
+ <int value="0" label="errSecSuccess"/>
+</enum>
+
<enum name="SigninSSOWKWebViewGetAllCookiesRequest">
<int value="0" label="Started"/>
<int value="1" label="Finished"/>
@@ -51513,6 +53195,7 @@ Called by update_net_trust_anchors.py.-->
<int value="2" label="JSON"/>
<int value="3" label="Plain"/>
<int value="4" label="Others"/>
+ <int value="5" label="NeverSniffed"/>
</enum>
<enum name="SiteIsolationResponseAction">
@@ -51786,6 +53469,9 @@ Called by update_net_trust_anchors.py.-->
</enum>
<enum name="SoftwareReporterRebootPromptType">
+ <obsolete>
+ Deprecated on 2019-05-29.
+ </obsolete>
<int value="1" label="SettingsPageOpened"/>
<int value="2" label="ModalDialogShown"/>
<int value="3" label="NonModalDialogShown"/>
@@ -53378,6 +55064,18 @@ would be helpful to identify which type is being sent.
<int value="12" label="Play install"/>
</enum>
+<enum name="SuggestionIconOrFaviconType">
+ <summary>Type of icon shown beside omnibox suggestion.</summary>
+ <int value="0" label="Invalid (unknown type)"/>
+ <int value="1" label="Bookmark"/>
+ <int value="2" label="History"/>
+ <int value="3" label="Globe"/>
+ <int value="4" label="Magnifying Glass"/>
+ <int value="5" label="Voice"/>
+ <int value="6" label="Calculator"/>
+ <int value="7" label="Favicon"/>
+</enum>
+
<enum name="SuggestionsResponseState">
<int value="0" label="Empty response received from the server."/>
<int value="1" label="Invalid response received from the server."/>
@@ -54030,6 +55728,16 @@ would be helpful to identify which type is being sent.
<int value="1" label="Unknown reason"/>
</enum>
+<enum name="SyncMissingBookmarkPermanentNodes">
+ <int value="0" label="Bookmark Bar"/>
+ <int value="1" label="Other Bookmarks"/>
+ <int value="2" label="Mobile Bookmarks"/>
+ <int value="3" label="Bookmark Bar and Other Bookmarks"/>
+ <int value="4" label="Bookmarks Bar and Mobile Bookmarks"/>
+ <int value="5" label="Other Bookmarks and Mobile Bookmarks"/>
+ <int value="6" label="Bookmark Bar and Other Bookmarks and Mobile Bookmarks"/>
+</enum>
+
<enum name="SyncModelTypes">
<int value="0" label="Unspecified"/>
<int value="1" label="Top Level Folder"/>
@@ -54075,6 +55783,7 @@ would be helpful to identify which type is being sent.
<int value="41" label="User Consents"/>
<int value="42" label="Send Tab"/>
<int value="43" label="Security Events"/>
+ <int value="44" label="Wi-Fi Configurations"/>
</enum>
<enum name="SyncModelTypeStoreInitResult">
@@ -54338,6 +56047,13 @@ would be helpful to identify which type is being sent.
<int value="3" label="Background (app in background)"/>
</enum>
+<enum name="TabletModeVolumeAdjustType">
+ <int value="0" label="Accidental adjust with swap enabled"/>
+ <int value="1" label="Normal adjust with swap enabled"/>
+ <int value="2" label="Accidental adjust with swap disabled"/>
+ <int value="3" label="Normal adjust with swap disabled"/>
+</enum>
+
<enum name="TabLoadingState">
<int value="0" label="Tab is not loading"/>
<int value="1" label="Tab is loading"/>
@@ -54434,6 +56150,12 @@ would be helpful to identify which type is being sent.
<int value="1" label="Revisit"/>
</enum>
+<enum name="TabSwitchResult">
+ <int value="0" label="Success"/>
+ <int value="1" label="Tab hidden before a frame is presented"/>
+ <int value="2" label="Presentation failure"/>
+</enum>
+
<enum name="TabUnderAction">
<int value="0" label="Navigation started"/>
<int value="1" label="Tab-under blocked"/>
@@ -55300,6 +57022,7 @@ Full version information for the fingerprint enum values:
<int value="91664959" label="CROS Cr50 0.0.16"/>
<int value="113099773" label="CROS Cr50 0.0.23 Eve Flags 0x7f00(prod)"/>
<int value="157181839" label="IFX 9655 rev 41 fw 4.34 build 03f2"/>
+ <int value="228456405" label="CROS Cr50 0.3.11"/>
<int value="230386903" label="CROS Cr50 0.0.24 Eve Flags 0x7f00(prod)"/>
<int value="276176597" label="CROS Cr50 0.1.0 Flags 0x10(pre-pvt)"/>
<int value="305524852" label="IFX 9655 rev 41 fw 4.32 build 036f"/>
@@ -55316,25 +57039,35 @@ Full version information for the fingerprint enum values:
<int value="847042924" label="IFX 9645 rev 78 fw 133.33 build 00e3"/>
<int value="893364096" label="CROS Cr50 0.3.3"/>
<int value="928190862" label="CROS Cr50 0.0.17"/>
+ <int value="969849518" label="CROS Cr50 0.4.9 Flags 0x10(pre-pvt)"/>
<int value="987235505" label="CROS Cr50 0.0.20"/>
<int value="987973414" label="IFX 9670 rev 15 fw 6.40 build 00be"/>
+ <int value="1001367086" label="CROS Cr50 0.3.15"/>
<int value="1013730596" label="CROS Cr50 0.0.26 Flags 0x10(pre-pvt)"/>
+ <int value="1039624416" label="CROS Cr50 0.3.10"/>
<int value="1065916186" label="CROS Cr50 0.0.19"/>
<int value="1123680979" label="CROS Cr50 0.3.4"/>
<int value="1190683265" label="CROS Cr50 0.0.14"/>
+ <int value="1290177221" label="CROS Cr50 0.4.6 Flags 0x10(pre-pvt)"/>
<int value="1311411160" label="WEC 345"/>
<int value="1353576267" label="IFX 9635 fw 3.18 build 0009"/>
+ <int value="1395572841" label="CROS Cr50 0.4.15 Flags 0x10(pre-pvt)"/>
<int value="1437720528" label="IFX 9645 rev 78 fw 133.32 build 0050"/>
<int value="1451134301" label="IFX 9635 147.18 build 000f"/>
<int value="1490841853" label="IFX 9645 rev 49 fw 133.32 build 0050"/>
+ <int value="1521866659" label="CROS Cr50 0.4.13 Flags 0x10(pre-pvt)"/>
+ <int value="1607230944" label="CROS Cr50 0.4.5 Flags 0x10(pre-pvt)"/>
<int value="1632371059" label="CROS Cr50 0.0.22"/>
<int value="1716634300" label="IFX 9645 rev 45 fw 133.32 build 0050"/>
+ <int value="1717226620" label="CROS Cr50 0.4.14 Flags 0x10(pre-pvt)"/>
<int value="1733077393" label="IFX 9645 rev 49 fw 133.33 build 00e3"/>
<int value="1774347833" label="CROS Cr50 0.0.15"/>
<int value="1828625721" label="IFX 9655 rev 32 fw 4.31 build 02c2"/>
+ <int value="1848357394" label="CROS Cr50 0.4.11 Flags 0x10(pre-pvt)"/>
<int value="1861735666" label="CROS Cr50 0.2.1 Flags 0x10(pre-pvt)"/>
<int value="1865292977" label="CROS Cr50 0.0.24 aka 0.3.0"/>
<int value="1887455524" label="CROS Cr50 0.0.21"/>
+ <int value="1903933708" label="CROS Cr50 0.4.3 Flags 0x10(pre-pvt)"/>
<int value="1941011596" label="IFX 9655 rev 35 fw 4.34 build 03f2"/>
<int value="1953654937" label="IFX 9645 rev 45 fw 133.33 build 00e3"/>
<int value="2024714959" label="IFX 9655 rev 32 fw 4.34 build 03f2"/>
@@ -55561,6 +57294,9 @@ Full version information for the fingerprint enum values:
</enum>
<enum name="TunnelRedirectHistogramValue">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<int value="0" label="Subresource fetched using an explicit proxy"/>
<int value="1" label="Mainframe fetched using an explicit proxy"/>
<int value="2" label="Subresource fetched using an auto-detected proxy"/>
@@ -55760,6 +57496,10 @@ Full version information for the fingerprint enum values:
<int value="3" label="Group not reported and trial was disabled"/>
</enum>
+<enum name="UninstallCounterReasonEnum">
+ <int value="0" label="User"/>
+</enum>
+
<enum name="UnlockType">
<int value="0" label="Password"/>
<int value="1" label="Pin"/>
@@ -56344,6 +58084,7 @@ Full version information for the fingerprint enum values:
<enum name="UsbPrinterSetupSource">
<int value="0" label="Settings"/>
<int value="1" label="Print Preview"/>
+ <int value="2" label="Automatic"/>
</enum>
<enum name="UsedInDraw">
@@ -56624,6 +58365,10 @@ Full version information for the fingerprint enum values:
<int value="0" label="VAAPI_ERROR"/>
</enum>
+<enum name="VAJDAWorkerDecoderFailure">
+ <int value="0" label="kVaapiError"/>
+</enum>
+
<enum name="VAJEAEncoderResult">
<int value="0" label="VAAPI_SUCCESS"/>
<int value="1" label="VAAPI_ERROR"/>
@@ -57326,6 +59071,14 @@ Full version information for the fingerprint enum values:
<int value="64" label=".gdoc"/>
<int value="65" label=".gsheet"/>
<int value="66" label=".gslides"/>
+ <int value="67" label=".arw"/>
+ <int value="68" label=".cr2"/>
+ <int value="69" label=".dng"/>
+ <int value="70" label=".nef"/>
+ <int value="71" label=".nrw"/>
+ <int value="72" label=".orf"/>
+ <int value="73" label=".raf"/>
+ <int value="74" label=".rw2"/>
</enum>
<enum name="VirtualKeyboardContainerType">
@@ -57654,6 +59407,8 @@ Full version information for the fingerprint enum values:
<int value="20" label="OPENVR_UNKNOWN"/>
<int value="21" label="OPENVR_VIVE"/>
<int value="22" label="OPENVR_RIFT_CV1"/>
+ <int value="40" label="OCULUS_UNKNOWN"/>
+ <int value="60" label="WINDOWS_MIXED_REALITY_UNKNOWN"/>
</enum>
<enum name="VRVoiceSearchEndState">
@@ -57958,6 +59713,7 @@ Full version information for the fingerprint enum values:
<int value="7" label="UserInstallDeclined"/>
<int value="8" label="InstallManagerDestroyed"/>
<int value="9" label="WindowOpened"/>
+ <int value="10" label="NotValidManifestForWebApp"/>
</enum>
<enum name="WebAppInstallSource">
@@ -58237,6 +59993,120 @@ Full version information for the fingerprint enum values:
<int value="5" label="Unknown"/>
</enum>
+<enum name="WebRequest.RequestHeader">
+ <int value="0" label="kNone"/>
+ <int value="1" label="kOther"/>
+ <int value="2" label="kAccept"/>
+ <int value="3" label="kAcceptCharset"/>
+ <int value="4" label="kAcceptEncoding"/>
+ <int value="5" label="kAcceptLanguage"/>
+ <int value="6" label="kAccessControlRequestHeaders"/>
+ <int value="7" label="kAccessControlRequestMethod"/>
+ <int value="8" label="kAuthorization"/>
+ <int value="9" label="kCacheControl"/>
+ <int value="10" label="kConnection"/>
+ <int value="11" label="kContentEncoding"/>
+ <int value="12" label="kContentLanguage"/>
+ <int value="13" label="kContentLength"/>
+ <int value="14" label="kContentLocation"/>
+ <int value="15" label="kContentType"/>
+ <int value="16" label="kCookie"/>
+ <int value="17" label="kDate"/>
+ <int value="18" label="kDnt"/>
+ <int value="19" label="kEarlyData"/>
+ <int value="20" label="kExpect"/>
+ <int value="21" label="kForwarded"/>
+ <int value="22" label="kFrom"/>
+ <int value="23" label="kHost"/>
+ <int value="24" label="kIfMatch"/>
+ <int value="25" label="kIfModifiedSince"/>
+ <int value="26" label="kIfNoneMatch"/>
+ <int value="27" label="kIfRange"/>
+ <int value="28" label="kIfUnmodifiedSince"/>
+ <int value="29" label="kKeepAlive"/>
+ <int value="30" label="kOrigin"/>
+ <int value="31" label="kPragma"/>
+ <int value="32" label="kProxyAuthorization"/>
+ <int value="33" label="kProxyConnection"/>
+ <int value="34" label="kRange"/>
+ <int value="35" label="kReferer"/>
+ <int value="36" label="kSecOriginPolicy"/>
+ <int value="37" label="kTe"/>
+ <int value="38" label="kTransferEncoding"/>
+ <int value="39" label="kUpgrade"/>
+ <int value="40" label="kUpgradeInsecureRequests"/>
+ <int value="41" label="kUserAgent"/>
+ <int value="42" label="kVia"/>
+ <int value="43" label="kWarning"/>
+ <int value="44" label="kXForwardedFor"/>
+ <int value="45" label="kXForwardedHost"/>
+ <int value="46" label="kXForwardedProto"/>
+</enum>
+
+<enum name="WebRequest.ResponseHeader">
+ <int value="0" label="kNone"/>
+ <int value="1" label="kOther"/>
+ <int value="2" label="kAcceptPatch"/>
+ <int value="3" label="kAcceptRanges"/>
+ <int value="4" label="kAccessControlAllowCredentials"/>
+ <int value="5" label="kAccessControlAllowHeaders"/>
+ <int value="6" label="kAccessControlAllowMethods"/>
+ <int value="7" label="kAccessControlAllowOrigin"/>
+ <int value="8" label="kAccessControlExposeHeaders"/>
+ <int value="9" label="kAccessControlMaxAge"/>
+ <int value="10" label="kAge"/>
+ <int value="11" label="kAllow"/>
+ <int value="12" label="kAltSvc"/>
+ <int value="13" label="kCacheControl"/>
+ <int value="14" label="kClearSiteData"/>
+ <int value="15" label="kConnection"/>
+ <int value="16" label="kContentDisposition"/>
+ <int value="17" label="kContentEncoding"/>
+ <int value="18" label="kContentLanguage"/>
+ <int value="19" label="kContentLength"/>
+ <int value="20" label="kContentLocation"/>
+ <int value="21" label="kContentRange"/>
+ <int value="22" label="kContentSecurityPolicy"/>
+ <int value="23" label="kContentSecurityPolicyReportOnly"/>
+ <int value="24" label="kContentType"/>
+ <int value="25" label="kDate"/>
+ <int value="26" label="kETag"/>
+ <int value="27" label="kExpectCT"/>
+ <int value="28" label="kExpires"/>
+ <int value="29" label="kFeaturePolicy"/>
+ <int value="30" label="kKeepAlive"/>
+ <int value="31" label="kLargeAllocation"/>
+ <int value="32" label="kLastModified"/>
+ <int value="33" label="kLocation"/>
+ <int value="34" label="kPragma"/>
+ <int value="35" label="kProxyAuthenticate"/>
+ <int value="36" label="kProxyConnection"/>
+ <int value="37" label="kPublicKeyPins"/>
+ <int value="38" label="kPublicKeyPinsReportOnly"/>
+ <int value="39" label="kReferrerPolicy"/>
+ <int value="40" label="kRefresh"/>
+ <int value="41" label="kRetryAfter"/>
+ <int value="42" label="kSecWebSocketAccept"/>
+ <int value="43" label="kServer"/>
+ <int value="44" label="kServerTiming"/>
+ <int value="45" label="kSetCookie"/>
+ <int value="46" label="kSourceMap"/>
+ <int value="47" label="kStrictTransportSecurity"/>
+ <int value="48" label="kTimingAllowOrigin"/>
+ <int value="49" label="kTk"/>
+ <int value="50" label="kTrailer"/>
+ <int value="51" label="kTransferEncoding"/>
+ <int value="52" label="kUpgrade"/>
+ <int value="53" label="kVary"/>
+ <int value="54" label="kVia"/>
+ <int value="55" label="kWarning"/>
+ <int value="56" label="kWWWAuthenticate"/>
+ <int value="57" label="kXContentTypeOptions"/>
+ <int value="58" label="kXDNSPrefetchControl"/>
+ <int value="59" label="kXFrameOptions"/>
+ <int value="60" label="kXXSSProtection"/>
+</enum>
+
<enum name="WebRequestEventListenerFlag">
<int value="0" label="Total"/>
<int value="1" label="None"/>
@@ -58950,6 +60820,11 @@ Full version information for the fingerprint enum values:
<int value="1" label="onReceivedClientCertRequest"/>
<int value="2" label="onReceivedHttpAuthRequest"/>
<int value="3" label="onDownloadStart"/>
+ <int value="4" label="onPageStarted"/>
+ <int value="5" label="onPageFinished"/>
+ <int value="6" label="onLoadResource"/>
+ <int value="7" label="onPageCommitVisible"/>
+ <int value="8" label="shouldOverrideUrlLoading"/>
</enum>
<enum name="WebViewClientErrorCode">
@@ -59614,6 +61489,7 @@ Full version information for the fingerprint enum values:
<int value="11" label="Windows 10 RS3"/>
<int value="12" label="Windows 10 RS4"/>
<int value="13" label="Windows 10 RS5"/>
+ <int value="14" label="Windows 10 19H1"/>
</enum>
<enum name="WindowType">
@@ -60293,6 +62169,25 @@ Full version information for the fingerprint enum values:
<int value="1" label="Invalidated"/>
</enum>
+<enum name="XRDeviceId">
+ <int value="0" label="WEB_TEST_DEVICE_ID"/>
+ <int value="1" label="FAKE_DEVICE_ID"/>
+ <int value="2" label="ORIENTATION_DEVICE_ID"/>
+ <int value="3" label="GVR_DEVICE_ID"/>
+ <int value="4" label="OPENVR_DEVICE_ID"/>
+ <int value="5" label="OCULUS_DEVICE_ID"/>
+ <int value="6" label="WINDOWS_MIXED_REALITY_ID"/>
+ <int value="7" label="ARCORE_DEVICE_ID"/>
+</enum>
+
+<enum name="XRReferenceSpaceType">
+ <int value="0" label="Viewer"/>
+ <int value="1" label="Local"/>
+ <int value="2" label="LocalFloor"/>
+ <int value="3" label="BoundedFloor"/>
+ <int value="4" label="Unbounded"/>
+</enum>
+
<enum name="XRRenderPath">
<int value="0" label="ClientWait"/>
<int value="1" label="GpuFence"/>
@@ -60304,6 +62199,13 @@ Full version information for the fingerprint enum values:
<int value="1" label="OpenVR"/>
</enum>
+<enum name="XRSessionRequestDialogAction">
+ <int value="0" label="UserConsented"/>
+ <int value="1" label="UserDenied"/>
+ <int value="2" label="UserAbortedConsentFlow"/>
+ <int value="3" label="UserConsentedAfterBounce"/>
+</enum>
+
<enum name="YoungGenerationHandling">
<int value="0" label="Regular Scavenge"/>
<int value="1" label="Scavenge using fast promotion mode"/>
diff --git a/chromium/tools/metrics/histograms/extract_histograms.py b/chromium/tools/metrics/histograms/extract_histograms.py
index aa0151a7d63..1395c13771a 100644
--- a/chromium/tools/metrics/histograms/extract_histograms.py
+++ b/chromium/tools/metrics/histograms/extract_histograms.py
@@ -53,6 +53,7 @@ XML below will generate the following five histograms:
"""
+import HTMLParser
import bisect
import copy
import datetime
@@ -78,7 +79,8 @@ class Error(Exception):
def _JoinChildNodes(tag):
"""Join child nodes into a single text.
- Applicable to leafs like 'summary' and 'detail'.
+ Applicable to leafs like 'summary' and 'detail'. Removes any comment in the
+ node.
Args:
tag: parent node
@@ -86,13 +88,15 @@ def _JoinChildNodes(tag):
Returns:
a string with concatenated nodes' text representation.
"""
- return ''.join(c.toxml() for c in tag.childNodes).strip()
+ return ''.join(c.toxml()
+ for c in tag.childNodes
+ if c.nodeType != xml.dom.minidom.Node.COMMENT_NODE).strip()
def _NormalizeString(s):
- """Replaces all whitespace sequences with a single space.
+ r"""Replaces all whitespace sequences with a single space.
- The function properly handles multi-line strings.
+ The function properly handles multi-line strings and XML escaped characters.
Args:
s: The string to normalize, (' \\n a b c\\n d ').
@@ -100,7 +104,11 @@ def _NormalizeString(s):
Returns:
The normalized string (a b c d).
"""
- return ' '.join(s.split())
+ singleline_value = ' '.join(s.split())
+
+ # Unescape using default ASCII encoding. Unescapes any HTML escaped character
+ # like &quot; etc.
+ return HTMLParser.HTMLParser().unescape(singleline_value)
def _NormalizeAllAttributeValues(node):
@@ -179,7 +187,7 @@ def _ExpandHistogramNameWithSuffixes(suffix_name, histogram_name,
return cluster + suffix_name + separator + remainder
-def _ExtractEnumsFromXmlTree(tree):
+def ExtractEnumsFromXmlTree(tree):
"""Extract all <enum> nodes in the tree into a dictionary."""
enums = {}
@@ -555,7 +563,7 @@ def ExtractHistogramsFromDom(tree):
"""
_NormalizeAllAttributeValues(tree)
- enums, enum_errors = _ExtractEnumsFromXmlTree(tree)
+ enums, enum_errors = ExtractEnumsFromXmlTree(tree)
histograms, histogram_errors = _ExtractHistogramsFromXmlTree(tree, enums)
update_errors = _UpdateHistogramsWithSuffixes(tree, histograms)
diff --git a/chromium/tools/metrics/histograms/extract_histograms_test.py b/chromium/tools/metrics/histograms/extract_histograms_test.py
index eb688c1d268..34ff8589895 100644
--- a/chromium/tools/metrics/histograms/extract_histograms_test.py
+++ b/chromium/tools/metrics/histograms/extract_histograms_test.py
@@ -46,7 +46,11 @@ class ExtractHistogramsTest(unittest.TestCase):
<histogram name="Test.Histogram" units="things">
<owner> Please list the metric's owners. Add more owner tags as needed.
</owner>
- <summary> This is a summary </summary>
+ <summary>
+ <!-- Comments are fine -->
+ This is a summary
+ <!-- Comments are fine -->
+ </summary>
</histogram>
</histograms>
</histogram-configuration>
@@ -55,6 +59,25 @@ class ExtractHistogramsTest(unittest.TestCase):
histogram_with_owner_placeholder, {})
self.assertFalse(have_errors)
+ def testHistogramWithEscapeCharacters(self):
+ histogram_with_owner_placeholder = xml.dom.minidom.parseString("""
+<histogram-configuration>
+<histograms>
+ <histogram name="Test.Histogram" units="things">
+ <owner> Please list the metric's owners. Add more owner tags as needed.
+ </owner>
+ <summary>This is a summary with &amp; and &quot; and &apos;</summary>
+ </histogram>
+</histograms>
+</histogram-configuration>
+""")
+ (hists, have_errors) = extract_histograms._ExtractHistogramsFromXmlTree(
+ histogram_with_owner_placeholder, {})
+ self.assertFalse(have_errors)
+ self.assertIn('Test.Histogram', hists)
+ self.assertIn('summary', hists['Test.Histogram'])
+ self.assertEquals('This is a summary with & and " and \'',
+ hists['Test.Histogram']['summary'])
if __name__ == "__main__":
logging.basicConfig(level=logging.ERROR + 1)
diff --git a/chromium/tools/metrics/histograms/histograms.xml b/chromium/tools/metrics/histograms/histograms.xml
index ef59ee61763..93132d843c5 100644
--- a/chromium/tools/metrics/histograms/histograms.xml
+++ b/chromium/tools/metrics/histograms/histograms.xml
@@ -322,7 +322,7 @@ uploading your change for review.
</histogram>
<histogram name="Accessibility.CrosSwitchAccessAfterChromeVox"
- enum="BooleanEnabled">
+ enum="BooleanEnabled" expires_after="M78">
<owner>anastasi@google.com</owner>
<owner>dtseng@chromium.org</owner>
<summary>
@@ -339,6 +339,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Accessibility.ImageLabels" enum="BooleanEnabled"
+ expires_after="2020-04-22">
+ <owner>katie@chromium.org</owner>
+ <owner>dmazzoni@chromium.org</owner>
+ <summary>
+ Whether the Chrome accessibility image label setting is on (checked once 45
+ secs after startup).
+ </summary>
+</histogram>
+
<histogram name="Accessibility.ImageLabels.ContextMenuOption"
enum="AccessibilityImageLabelMode" expires_after="2020-02-15">
<owner>katie@chromium.org</owner>
@@ -352,16 +362,6 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Accessibility.ImageLabels.Enabled" enum="BooleanEnabled"
- expires_after="2020-02-15">
- <owner>katie@chromium.org</owner>
- <owner>dmazzoni@chromium.org</owner>
- <summary>
- Whether the Chrome accessibility image label setting is on (checked once 45
- secs after startup).
- </summary>
-</histogram>
-
<histogram name="Accessibility.ImageLabels.FromSettings.ToggleSetting"
enum="BooleanEnabled" expires_after="2020-02-15">
<owner>katie@chromium.org</owner>
@@ -493,7 +493,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="Accessibility.ScreenReader.Image.MinSize"
- units="px" expires_after="M76">
+ units="px" expires_after="M80">
<!-- Name completed by histogram_suffixes
name="AccessibilityScreenReaderImage" -->
@@ -507,7 +507,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="Accessibility.ScreenReader.Image.SizeRatio"
- units="%" expires_after="M76">
+ units="%" expires_after="M80">
<!-- Name completed by histogram_suffixes
name="AccessibilityScreenReaderImage" -->
@@ -836,6 +836,9 @@ uploading your change for review.
</histogram>
<histogram name="Ads.Features.AdResourceIsIsolated" enum="AdIsolatedInfo">
+ <obsolete>
+ Removed April 2019
+ </obsolete>
<owner>csharrison@chromium.org</owner>
<owner>jkarlin@chromium.org</owner>
<summary>
@@ -846,6 +849,9 @@ uploading your change for review.
<histogram name="Ads.Features.ResourceIsSecure" enum="AdSecureInfo"
expires_after="M77">
+ <obsolete>
+ Removed April 2019
+ </obsolete>
<owner>csharrison@chromium.org</owner>
<owner>jkarlin@chromium.org</owner>
<summary>
@@ -1109,7 +1115,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="AnchorElementMetrics.Clicked.RatioInIframe_InIframe" units="%">
+<histogram name="AnchorElementMetrics.Clicked.RatioInIframe_InIframe" units="%"
+ expires_after="M78">
<owner>chelu@chromium.org</owner>
<owner>tbansal@chromium.org</owner>
<summary>
@@ -1130,7 +1137,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="AnchorElementMetrics.Clicked.RatioRootHeight" units="%">
+<histogram name="AnchorElementMetrics.Clicked.RatioRootHeight" units="%"
+ expires_after="M78">
<owner>chelu@chromium.org</owner>
<owner>tbansal@chromium.org</owner>
<summary>
@@ -1166,7 +1174,7 @@ uploading your change for review.
<histogram
name="AnchorElementMetrics.Clicked.RatioUrlIncremented_NotIncremented"
- units="%">
+ units="%" expires_after="M78">
<owner>chelu@chromium.org</owner>
<owner>tbansal@chromium.org</owner>
<summary>
@@ -1179,7 +1187,7 @@ uploading your change for review.
<histogram
name="AnchorElementMetrics.Clicked.RatioUrlIncremented_UrlIncremented"
- units="%">
+ units="%" expires_after="M78">
<owner>chelu@chromium.org</owner>
<owner>tbansal@chromium.org</owner>
<summary>
@@ -1408,6 +1416,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Android.AutofillAssistant.OnBoarding"
+ enum="AutofillAssistantOnBoarding" expires_after="2020-01-25">
+ <owner>lsuder@chromium.org</owner>
+ <owner>mcarlen@chromium.org</owner>
+ <summary>
+ Reports the basic user interactions that can happen in regard on boarding.
+ It is recorded on Autofill Assistant startup and during the on boarding.
+ </summary>
+</histogram>
+
<histogram name="Android.BackgroundTaskScheduler.TaskCanceled"
enum="BackgroundTaskId">
<owner>fgorski@chromium.org</owner>
@@ -1422,6 +1440,27 @@ uploading your change for review.
<summary>Records that a specific background task has loaded native.</summary>
</histogram>
+<histogram name="Android.BackgroundTaskScheduler.TaskLoadedNative.FullBrowser"
+ enum="BackgroundTaskId" expires_after="2020-05-14">
+ <owner>mheikal@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <owner>hnakashima@chromium.org</owner>
+ <summary>
+ Records that a specific background task has loaded native in Full Browser
+ Mode.
+ </summary>
+</histogram>
+
+<histogram name="Android.BackgroundTaskScheduler.TaskLoadedNative.ReducedMode"
+ enum="BackgroundTaskId" expires_after="2020-05-14">
+ <owner>mheikal@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <owner>hnakashima@chromium.org</owner>
+ <summary>
+ Records that a specific background task has loaded native in Reduced Mode.
+ </summary>
+</histogram>
+
<histogram name="Android.BackgroundTaskScheduler.TaskScheduled.Failure"
enum="BackgroundTaskId">
<owner>fgorski@chromium.org</owner>
@@ -2208,7 +2247,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Android.HistoryPage.RemoveSelected">
+<histogram name="Android.HistoryPage.RemoveSelected" expires_after="M78">
<owner>twellington@chromium.org</owner>
<summary>
The number of selected items the user removed from the native Android
@@ -2361,7 +2400,7 @@ uploading your change for review.
<histogram
name="Android.MainActivity.ExplicitMainViewIntentDispatched.OnCreate"
- enum="BooleanDispatched">
+ enum="BooleanDispatched" expires_after="M78">
<owner>wnwen@chromium.org</owner>
<summary>
Whether VIEW intent sent explicitly to .Main activity was dispatched by
@@ -2550,6 +2589,31 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Android.NativeBackgroundTask.TaskFinished.FullBrowser"
+ enum="BackgroundTaskId" expires_after="2020-05-14">
+ <owner>mheikal@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <owner>hnakashima@chromium.org</owner>
+ <summary>
+ Records that a specific native background task started in Full Browser Mode
+ has finished cleanly. See Android.NativeBackgroundTask.TaskFinished for more
+ details.
+ </summary>
+</histogram>
+
+<histogram name="Android.NativeBackgroundTask.TaskFinished.ReducedMode"
+ enum="BackgroundTaskId" expires_after="2020-05-14">
+ <owner>mheikal@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <owner>hnakashima@chromium.org</owner>
+ <summary>
+ Records that a specific native background task started in Reduced Mode has
+ finished cleanly. It is possible that Full Browser has launched while the
+ task was running. See Android.NativeBackgroundTask.TaskFinished for more
+ details.
+ </summary>
+</histogram>
+
<histogram name="Android.NativeBackgroundTask.TaskStarted"
enum="BackgroundTaskId" expires_after="2019-08-01">
<owner>mheikal@chromium.org</owner>
@@ -2563,6 +2627,28 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Android.NativeBackgroundTask.TaskStarted.FullBrowser"
+ enum="BackgroundTaskId" expires_after="2020-05-14">
+ <owner>mheikal@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <owner>hnakashima@chromium.org</owner>
+ <summary>
+ Records that a specific native background task has been started in Full
+ Browser Mode. See Android.NativeBackgroundTask.TaskStarted for more details.
+ </summary>
+</histogram>
+
+<histogram name="Android.NativeBackgroundTask.TaskStarted.ReducedMode"
+ enum="BackgroundTaskId" expires_after="2020-05-14">
+ <owner>mheikal@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <owner>hnakashima@chromium.org</owner>
+ <summary>
+ Records that a specific native background task has been started in Reduced
+ Mode. See Android.NativeBackgroundTask.TaskStarted for more details.
+ </summary>
+</histogram>
+
<histogram name="Android.NativeLibraryPreloader.Result.Browser"
enum="NativeLibraryPreloaderResult" expires_after="M77">
<owner>michaelbai@chromium.org</owner>
@@ -2581,6 +2667,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Android.NativeStartupBridge.LoadFullBrowser"
+ enum="BooleanRequested" expires_after="2020-06-01">
+ <owner>mheikal@chromium.org</owner>
+ <owner>hnakashima@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <summary>
+ The number of times full-browser mode is requested to be loaded from native
+ code (running in reduced mode).
+ </summary>
+</histogram>
+
<histogram name="Android.NTP.Impression" enum="NTPImpressionType">
<owner>finkm@chromium.org</owner>
<summary>
@@ -2837,16 +2934,6 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Android.ResourceBundle.LoadLocaleFailure"
- enum="AndroidResourceBundleLocaleFailures" expires_after="M75">
- <owner>asvitkine@chromium.org</owner>
- <summary>
- Logged when ResourceBundle::LoadLocaleResources() returns the empty string
- for the locale in one of the error cases. The enum specifies which error
- case was hit.
- </summary>
-</histogram>
-
<histogram name="Android.RestoreResult" enum="AndroidRestoreResult">
<owner>aberent@chromium.org</owner>
<summary>
@@ -2953,7 +3040,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Android.StrictMode.CheckGoogleSignedTime" units="ms">
+<histogram name="Android.StrictMode.CheckGoogleSignedTime" units="ms"
+ expires_after="M78">
<owner>estevenson@chromium.org</owner>
<owner>wnwen@chromium.org</owner>
<summary>
@@ -3329,6 +3417,23 @@ uploading your change for review.
</summary>
</histogram>
+<histogram
+ name="Android.WebView.ShouldInterceptRequest.NullInputStream.ResponseStatusCode"
+ enum="HttpResponseCode" expires_after="2020-06-14">
+ <owner>timvolodine@chromium.org</owner>
+ <owner>tobiasjs@chromium.org</owner>
+ <owner>ntfschr@chromium.org</owner>
+ <summary>
+ Records the custom response status code for the intercepted requests where
+ input stream is null. In case status code is invalid (or has not been
+ specified by the app) a zero status code is recorded. This UMA is needed in
+ order to track specific usages of request interception where the behavior
+ with network service enabled is different from the old code path (for more
+ details see go/wv-ns-behavior-differences). This data is recorded regardless
+ of whether the network service is enabled or disabled.
+ </summary>
+</histogram>
+
<histogram name="Android.WebView.SplitApkWorkaroundResult"
enum="SplitApkWorkaroundResult" expires_after="M72">
<owner>tiborg@chromium.org</owner>
@@ -3392,6 +3497,9 @@ uploading your change for review.
<histogram name="Android.WebView.VariationsEnableState"
enum="AndroidWebViewVariationsEnableState" expires_after="M69">
+ <obsolete>
+ Removed from code July 2018. Variations in WebView has launched.
+ </obsolete>
<owner>paulmiller@chromium.org</owner>
<owner>changwan@chromium.org</owner>
<summary>
@@ -3533,6 +3641,18 @@ uploading your change for review.
</histogram>
<histogram
+ name="Animation.AnimationWorklet.Dispatcher.AsynchronousMutateDuration"
+ units="microseconds" expires_after="M81">
+ <owner>majidvp@chromium.org</owner>
+ <owner>animations-dev@chromium.org</owner>
+ <summary>
+ The time it takes the WorkletMutatorDispatcher to complete an asynchronous
+ mutation request of animation worklet. The measured time is the total
+ elapsed time from when a request is queued until the results are received.
+ </summary>
+</histogram>
+
+<histogram
name="Animation.AnimationWorklet.Dispatcher.SynchronousMutateDuration"
units="microseconds" expires_after="M77">
<owner>majidvp@chromium.org</owner>
@@ -3542,7 +3662,7 @@ uploading your change for review.
animation worklet mutators synchronously. This includes the time that it
takes each AnimationWorkletGlobalScope to produce its output (which includes
V8 script execution) and also any queuing cost associated with posting
- mutation tasks and recieving responses.
+ mutation tasks and receiving responses.
</summary>
</histogram>
@@ -3944,6 +4064,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Apps.AppList.ZeroStateSuggestionOpenType"
+ enum="AppListSearchResult" expires_after="2019-12-31">
+ <owner>jennyz@chromium.org</owner>
+ <owner>newcomer@chromium.org</owner>
+ <summary>
+ The type of the app list suggestion that was opened by user in zero state.
+ </summary>
+</histogram>
+
<histogram name="Apps.AppListAppLaunched" enum="SuggestedAppListAppLaunched">
<obsolete>
Deprecated as of 04/2019 in favor Apps.AppListAppLaunchedV2.
@@ -3990,7 +4119,7 @@ uploading your change for review.
</histogram>
<histogram name="Apps.AppListAppTypeClicked" enum="AppListAppType"
- expires_after="2019-05-20">
+ expires_after="M82">
<owner>pdyson@chromium.org</owner>
<summary>
The type of app clicked in the launcher on ChromeOS, recorded after the icon
@@ -4091,6 +4220,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Apps.AppListLaunchRecorderError"
+ enum="AppListLaunchRecorderError" expires_after="2020-05-18">
+ <owner>tby@chromium.org</owner>
+ <owner>charleszhao@chromium.org</owner>
+ <summary>
+ Reports error states of the app list launch recorder system.
+ </summary>
+</histogram>
+
<histogram name="Apps.AppListPageOpened" enum="AppListPage">
<owner>calamity@chromium.org</owner>
<summary>
@@ -4100,8 +4238,11 @@ uploading your change for review.
</histogram>
<histogram name="Apps.AppListPageSwitcherSource"
- enum="AppListPageSwitcherSource">
+ enum="AppListPageSwitcherSource" expires_after="2020-05-01">
+<!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" -->
+
<owner>newcomer@chromium.org</owner>
+ <owner>mmourgos@chromium.org</owner>
<summary>
The source used to switch pages in the app list's app grid. Logged when the
page switch succeeds.
@@ -4125,12 +4266,31 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Apps.AppListPlayStoreAppLaunchedIndex" units="indices"
+ expires_after="2019-12-31">
+ <owner>jennyz@chromium.org</owner>
+ <owner>newcomer@chromium.org</owner>
+ <summary>
+ The index of the app within all play store apps displayed when it is
+ launched.
+ </summary>
+</histogram>
+
<histogram name="Apps.AppListPlayStoreQueryState"
enum="AppListPlayStoreQueryState">
<owner>hejq@chromium.org</owner>
<summary>The state of a Play Store app search request.</summary>
</histogram>
+<histogram name="Apps.AppListPlayStoreSearchAppsDisplayed" units="apss"
+ expires_after="2019-12-31">
+ <owner>jennyz@chromium.org</owner>
+ <owner>newcomer@chromium.org</owner>
+ <summary>
+ The number of the play store apps displayed to user for a query.
+ </summary>
+</histogram>
+
<histogram name="Apps.AppListRecommendedImpResultCountAfterOpen" units="shows"
expires_after="2019-12-31">
<owner>napper@chromium.org</owner>
@@ -4315,11 +4475,15 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Apps.AppListShowSource" enum="AppListShowSource">
+<histogram name="Apps.AppListShowSource" enum="AppListShowSource"
+ expires_after="2020-01-01">
<owner>newcomer@chromium.org</owner>
<summary>
The number of times the different sources for showing the app list are used.
- This is logged when the app list is shown.
+ This is logged when the app list is shown. Does not count the app list shown
+ when the last window is closed in tablet mode. This is not the total number
+ of times the app list is shown to the user; for that consult the user action
+ AppList_WindowFocused.
</summary>
</histogram>
@@ -4347,6 +4511,18 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Apps.AppListSuggestedChipOpenType" enum="AppListSearchResult"
+ expires_after="2020-01-01">
+<!-- Name completed by histogram_suffixes name="TabletOrClamshellMode" -->
+
+ <owner>newcomer@chromium.org</owner>
+ <owner>mmourgos@chromium.org</owner>
+ <summary>
+ The type of app list suggestion chip that was opened by the user. This is
+ gathered per SuggestionChip opened.
+ </summary>
+</histogram>
+
<histogram name="Apps.AppListTileLaunchIndexAndQueryLength">
<owner>tby@chromium.org</owner>
<owner>jiameng@chromium.org</owner>
@@ -4381,7 +4557,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Apps.AppShimErrorVersion">
+<histogram name="Apps.AppShimErrorVersion" expires_after="M78">
<owner>jackhou@chromium.org</owner>
<summary>
Counts which major milestone versions of app_mode_loader are sending
@@ -4442,6 +4618,22 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Apps.HomeLauncherTransition.AnimationSmoothness" units="%"
+ expires_after="2020-04-01">
+<!-- Name completed by histogram suffixes
+ name="AppListTabletModeTransition" -->
+
+ <owner>andrewxu@chromium.org</owner>
+ <owner>newcomer@chromium.org</owner>
+ <summary>
+ Relative smoothness of animations of launcher transitions in tablet mode.
+ 100% represents ideally smooth 60 frames per second. 50% represents only 30
+ frames per second is achieved during the animations. 0% should not happen.
+ This metric is recorded exactly once when the user triggers launcher
+ animation in tablet mode.
+ </summary>
+</histogram>
+
<histogram name="Apps.LockScreen.AppsProfile.Creation.Duration" units="ms"
expires_after="M77">
<owner>tbarzic@chromium.org</owner>
@@ -4596,7 +4788,7 @@ uploading your change for review.
</histogram>
<histogram name="Apps.LockScreen.NoteTakingApp.LockScreenAppUnloaded"
- enum="LockScreenAppUnloadStatus">
+ enum="LockScreenAppUnloadStatus" expires_after="M78">
<owner>tbarzic@chromium.org</owner>
<summary>
Reported when a note taking app is unloaded from the lock screen apps
@@ -4628,7 +4820,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Apps.LockScreen.NoteTakingApp.ReloadCountOnAppTermination">
+<histogram name="Apps.LockScreen.NoteTakingApp.ReloadCountOnAppTermination"
+ expires_after="M78">
<owner>tbarzic@chromium.org</owner>
<summary>
Reported when a note taking app is terminated in the lock screen apps
@@ -4669,6 +4862,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Apps.LogDisplayTypeClickedResultZeroState"
+ enum="AppListSearchResultDisplayType" expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <owner>thanhdng@chromium.org</owner>
+ <owner>tby@chromium.org</owner>
+ <summary>
+ Records number of clicks on search result for different display types in
+ zero-state.
+ </summary>
+</histogram>
+
<histogram name="Apps.NoteTakingApp.DefaultLaunchResult"
enum="NoteTakingAppLaunchResult">
<owner>derat@chromium.org</owner>
@@ -4822,6 +5026,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Arc.AppInstalledReason" enum="InstallationCounterReasonEnum">
+ <owner>robsc@chromium.org</owner>
+ <owner>napper@chromium.org</owner>
+ <summary>
+ Record a reason when an arc application completes installation successfully,
+ including policy based applications, default applications and user prompted
+ installations.
+ </summary>
+</histogram>
+
<histogram name="Arc.AppShortcuts.BuildMenuTime" units="ms">
<owner>warx@chromium.org</owner>
<summary>
@@ -4841,6 +5055,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Arc.AppUninstallReason" enum="UninstallCounterReasonEnum">
+ <owner>robsc@chromium.org</owner>
+ <owner>napper@chromium.org</owner>
+ <summary>
+ Record a reason why an application was uninstalled when uninstall is
+ completed.
+ </summary>
+</histogram>
+
<histogram name="Arc.boot_progress" units="ms">
<owner>elijahtaylor@google.com</owner>
<owner>shihuis@google.com</owner>
@@ -4937,8 +5160,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Arc.CupsPrinting.PageCount" expires_after="2019-06-20">
- <owner>skau@google.com</owner>
+<histogram name="Arc.CupsPrinting.PageCount" expires_after="2020-01-20">
+ <owner>skau@chromium.org</owner>
<owner>vkuzkokov@google.com</owner>
<summary>
The number of pages sent to a native printer by ARC. Reported for every
@@ -5316,6 +5539,33 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Arc.Runtime.Performance.CommitDeviation" units="microseconds"
+ expires_after="2020-07-01">
+<!-- Name completed by histogram_suffixes name="ArcPerformanceAppCategories" -->
+
+ <owner>khmel@google.com</owner>
+ <owner>skuhne@google.com</owner>
+ <summary>Standard deviation for commit time delta from ideal time.</summary>
+</histogram>
+
+<histogram name="Arc.Runtime.Performance.FPS" units="fps"
+ expires_after="2020-07-01">
+<!-- Name completed by histogram_suffixes name="ArcPerformanceAppCategories" -->
+
+ <owner>khmel@google.com</owner>
+ <owner>skuhne@google.com</owner>
+ <summary>Render frames per second.</summary>
+</histogram>
+
+<histogram name="Arc.Runtime.Performance.RenderQuality" units="%"
+ expires_after="2020-07-01">
+<!-- Name completed by histogram_suffixes name="ArcPerformanceAppCategories" -->
+
+ <owner>khmel@google.com</owner>
+ <owner>skuhne@google.com</owner>
+ <summary>Render quality with maximum 100%.</summary>
+</histogram>
+
<histogram name="Arc.SdkVersionUpgradeType" enum="ArcSdkVersionUpgradeType">
<owner>niwa@google.com</owner>
<owner>yusukes@google.com</owner>
@@ -5381,7 +5631,7 @@ uploading your change for review.
</histogram>
<histogram name="Arc.Supervision.Transition.Result"
- enum="ArcSupervisionTransitionResult" expires_after="M76">
+ enum="ArcSupervisionTransitionResult" expires_after="M85">
<owner>menegola@google.com</owner>
<owner>escordeiro@google.com</owner>
<owner>unichromeos-eng@google.com</owner>
@@ -5392,7 +5642,7 @@ uploading your change for review.
</histogram>
<histogram name="Arc.Supervision.Transition.Screen.Success.TimeDelta"
- units="ms" expires_after="M76">
+ units="ms" expires_after="M85">
<owner>brunoad@google.com</owner>
<owner>menegola@google.com</owner>
<owner>escordeiro@google.com</owner>
@@ -5404,7 +5654,7 @@ uploading your change for review.
</histogram>
<histogram name="Arc.Supervision.Transition.Screen.Successful"
- enum="BooleanSuccess" expires_after="M76">
+ enum="BooleanSuccess" expires_after="M85">
<owner>brunoad@google.com</owner>
<owner>menegola@google.com</owner>
<owner>escordeiro@google.com</owner>
@@ -5765,6 +6015,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Ash.InteractiveWindowResize.TimeToPresent.MaxLatency"
+ units="ms">
+ <owner>oshima@google.com</owner>
+ <owner>omrilio@google.com</owner>
+ <summary>
+ Maximum time between when the size of a window changes during an interactive
+ window resize and the results are drawn (presented) on screen. This is
+ recorded for each movement of the mouse/pointer that results in a resize.
+ </summary>
+</histogram>
+
<histogram name="Ash.Login.Lock.AuthMethod.Switched"
enum="AuthMethodSwitchType">
<owner>jdufault@google.com</owner>
@@ -5982,6 +6243,9 @@ uploading your change for review.
</histogram>
<histogram name="Ash.ProcessCreationToFirstPresent" units="ms">
+ <obsolete>
+ Removed 05/2019; no longer need to track this.
+ </obsolete>
<owner>sky@chromium.org</owner>
<summary>
The delta between when chrome main starts to when the Chrome OS system UI
@@ -6326,6 +6590,26 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Ash.TabletMode.AnimationSmoothness.Enter" units="%">
+ <owner>oshima@chromium.org</owner>
+ <owner>sammiequon@chromium.org</owner>
+ <summary>
+ Relative smoothness of animations when entering tablet mode, recorded when
+ the animation completes. 100% represents ideally smooth 60 frames per
+ second.
+ </summary>
+</histogram>
+
+<histogram name="Ash.TabletMode.AnimationSmoothness.Exit" units="%">
+ <owner>oshima@chromium.org</owner>
+ <owner>sammiequon@chromium.org</owner>
+ <summary>
+ Relative smoothness of animations when exiting tablet mode, recorded when
+ the animation completes. 100% represents ideally smooth 60 frames per
+ second.
+ </summary>
+</histogram>
+
<histogram name="Ash.TimeBetweenTaskSwitches" units="seconds">
<owner>bruthig@google.com</owner>
<owner>tdanderson@google.com</owner>
@@ -8537,7 +8821,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Autofill.CanLogUKM" enum="BooleanEnabled">
+<histogram name="Autofill.CanLogUKM" enum="BooleanEnabled" expires_after="M78">
<owner>dlkumar@google.com</owner>
<owner>chrome-autofill@google.com</owner>
<summary>
@@ -8907,6 +9191,89 @@ uploading your change for review.
<summary>The autofill state related to a submitted form.</summary>
</histogram>
+<histogram base="true" name="Autofill.Funnel.FillAfterSuggestion"
+ enum="BooleanAutofillFillAfterSuggestion" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts whether users accepted any autofill suggestion that was shown to them
+ for a given form.
+
+ This metric is only recorded if a suggestion for the given form type (see
+ histogram name) was shown at least once. This is recorded once per form. If
+ the user accepts one suggestion, this is reported as &quot;User chose to
+ fill&quot; once. It does not matter if the user clears the filled values nor
+ if the user accepts a different suggestion later.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Autofill.Funnel.InteractionAfterParsedAsType"
+ enum="BooleanAutofillInteractionAfterParsedAsType"
+ expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts whether users interacted with a form of a certain type.
+
+ Focusing a field is sufficient to consider a form as being interacted with.
+ The user does not need to type anything. Note that some forms may get
+ focused on page load.
+
+ This metric is recorded once per form observed by Autofill, but only for
+ forms that Autofill classifies to be of the type indicated by the histogram
+ name. If a form changes dynamically, Autofill interprets the forms before
+ and after the change as two different forms and records two values. If a
+ form did not have features that classify it as a form of a certain type
+ (e.g. an address form or payment form), then nothing is recorded.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Autofill.Funnel.ParsedAsType"
+ enum="BooleanAutofillParsedAsType" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts whether a form was parsed/interpreted to be of the type indicated in
+ the histogram name.
+
+ This metric is recorded once for each form observed by Autofill. If a form
+ changes dynamically, then Autofill treats the different versions of the form
+ as different forms.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Autofill.Funnel.SubmissionAfterFill"
+ enum="BooleanAutofillSubmissionAfterFill" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts whether users submitted a form that was filled via autofill.
+
+ This metric is recorded once for each form observed by Autofill but only for
+ forms that the user filled via Autofill.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Autofill.Funnel.SuggestionAfterInteraction"
+ enum="BooleanAutofillSuggestionAfterInteraction" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts whether users were shown suggestions to fill the form, given that
+ they have already interacted with the form.
+
+ This metric is recorded only for forms that users interacted with. It is
+ recorded only once per form, meaning that it does not matter how often the
+ user sees suggestions. If a form changes dynamically, then Autofill treats
+ the different versions of the form as different forms.
+ </summary>
+</histogram>
+
<histogram name="Autofill.HadUserOptedIn_To_WalletSyncTransportServerCards"
enum="BooleanOptedIn" expires_after="M77">
<owner>sebsg@chromium.org</owner>
@@ -8997,6 +9364,94 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="Autofill.KeyMetrics.FillingAcceptance"
+ enum="BooleanAutofillFillingAcceptance" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts for submitted forms whether users accepted the suggestion to fill
+ values. This is counted as 'yes' if the user accepted such a suggestion at
+ any time, regardless whether other suggestions were ignored or whether the
+ accepted suggestion was reverted afterwards.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Autofill.KeyMetrics.FillingAssistance"
+ enum="BooleanAutofillFillingAssistance" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts for submitted forms whether the user filled any fields via Autofill.
+
+ If the user reverts the filling, the form is still counted as filled.
+
+ This metric is different from Autofill.KeyMetrics.FillingAcceptance in the
+ sense that the latter is only recorded if the user has actually seen a
+ prompt to fill data.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Autofill.KeyMetrics.FillingCorrectness"
+ enum="BooleanAutofillFillingCorrectness" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts for submitted and autofilled forms whether users edited at least one
+ filled value before submitting the form.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Autofill.KeyMetrics.FillingReadiness"
+ enum="BooleanAutofillFillingReadiness" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts for submitted forms whether Chromium had any address or payments data
+ to fill.
+
+ It does not matter whether the user actually requested to fill the data. It
+ does not matter either whether the data available for filling corresponded
+ to the submitted data.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Autofill.KeyMetrics.FormSubmission.Autofilled"
+ enum="BooleanAutofillSubmission" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts for filled (by Autofill) forms whether users submitted those forms.
+
+ This is only recorded for forms that the user filled via Autofill. It does
+ not matter if the user reverted the filling afterwards.
+
+ This is recorded once Autofill stops tracking the form (e.g. due to a
+ navigation or due to removal from the DOM).
+ </summary>
+</histogram>
+
+<histogram base="true" name="Autofill.KeyMetrics.FormSubmission.NotAutofilled"
+ enum="BooleanAutofillSubmission" expires_after="2020-07-01">
+ <owner>battre@chromium.org</owner>
+ <owner>kolos@chromium.org</owner>
+ <owner>nepper@chromium.org</owner>
+ <summary>
+ Counts for not filled (by Autofill) forms whether users submitted those
+ forms.
+
+ This is only recorded for forms into which the user typed anything but did
+ not fill anything. It does not matter if the user reverted what they typed.
+
+ This is recorded once Autofill stops tracking the form (e.g. due to a
+ navigation or due to removal from the DOM).
+ </summary>
+</histogram>
+
<histogram name="Autofill.LocalCardMigrationBubbleOffer"
enum="AutofillLocalCardMigrationBubbleOffer">
<owner>siyua@chromium.org</owner>
@@ -9012,6 +9467,17 @@ uploading your change for review.
<summary>Record how bubble is closed by different user interactions.</summary>
</histogram>
+<histogram name="Autofill.LocalCardMigrationDecision"
+ enum="AutofillLocalCardMigrationDecisionMetric" expires_after="2019-11-30">
+ <owner>sujiezhu@google.com</owner>
+ <owner>siyua@chromium.org</owner>
+ <owner>jsaul@google.com</owner>
+ <summary>
+ Record the decisions made when determining if local card migration should be
+ offered.
+ </summary>
+</histogram>
+
<histogram name="Autofill.LocalCardMigrationDialogActiveDuration" units="ms">
<owner>siyua@chromium.org</owner>
<summary>
@@ -9291,6 +9757,17 @@ uploading your change for review.
<summary>The number of Autofill address profiles a user has.</summary>
</histogram>
+<histogram name="Autofill.ProfileSuggestionsMadeWithFormatter"
+ enum="BooleanCreated" expires_after="2019-08-16">
+ <owner>caitlinfischer@google.com</owner>
+ <owner>chrome-autofill@google.com</owner>
+ <summary>
+ This metric is recorded when the autofill-use-improved-label-disambiguation
+ experiment is enabled and profile suggestions are available. This metric
+ measures how often suggestions were created with and without a formatter.
+ </summary>
+</histogram>
+
<histogram name="AutoFill.Quality" enum="AutofillQuality"
expires_after="2013-03-30">
<obsolete>
@@ -9485,7 +9962,11 @@ uploading your change for review.
</histogram>
<histogram name="Autofill.ResetFullServerCards.SyncServiceStatusOnStateChanged"
- enum="SyncUploadState">
+ enum="SyncUploadState" expires_after="2019-04-23">
+ <obsolete>
+ Deprecated as of 04/2019 (M76). No longer necessary since we don't mask data
+ for USS Autofill Wallet anymore.
+ </obsolete>
<owner>sebsg@chromium.org</owner>
<summary>
Records the sync service state when OnStateChanged is called.
@@ -9512,6 +9993,10 @@ uploading your change for review.
<histogram name="Autofill.SaveCardReachedPersonalDataManager" enum="Boolean"
expires_after="2019-06-30">
+ <obsolete>
+ Deprecated as of 05/2019. Was a temporary metric to gauge the impact of
+ http://crbug.com/892299.
+ </obsolete>
<owner>jsaul@google.com</owner>
<owner>sebsg@chromium.org</owner>
<owner>mahmadi@chromium.org</owner>
@@ -9821,6 +10306,18 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Autofill.SubmittedValuePatterns" enum="AutofillValuePatterns"
+ expires_after="M88">
+ <owner>kolos@chromium.org</owner>
+ <owner>jsaul@google</owner>
+ <summary>
+ Metric to measure if a submitted form contains any recognizable value
+ patterns (e.g., Unified Payment Interface Virtual Payment address (UPI
+ VPA)). Reported for every submitted non-empty visible field observed by
+ Autofill.
+ </summary>
+</histogram>
+
<histogram name="Autofill.SuggestionAcceptedIndex" units="position">
<owner>mathp@chromium.org</owner>
<summary>The index of the accepted Autofill suggestion in the popup.</summary>
@@ -10119,6 +10616,9 @@ uploading your change for review.
<histogram base="true" name="Autofill.WalletAddresses2" units="addresses"
expires_after="2019-06-01">
+ <obsolete>
+ Deprecated as of 05/2019.
+ </obsolete>
<!-- Name completed by histogram_suffixes name="AutofillWalletCardsDiff" -->
<owner>sebsg@chromium.org</owner>
@@ -10204,6 +10704,9 @@ uploading your change for review.
<histogram base="true" name="Autofill.WalletCards2" units="credit cards"
expires_after="2019-06-01">
+ <obsolete>
+ Deprecated as of 05/2019.
+ </obsolete>
<!-- Name completed by histogram_suffixes name="AutofillWalletCardsDiff" -->
<owner>sebsg@chromium.org</owner>
@@ -10385,6 +10888,19 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true"
+ name="AutoScreenBrightness.AdapterDecisionAtUserChange.ModelIteration"
+ units="count" expires_after="2019-12-31">
+<!-- Name completed by histogram_suffixes name="AdapterDecision" -->
+
+ <owner>jiameng@chromium.org</owner>
+ <summary>
+ When user changes brightness manually, we will ask the model whether it also
+ thinks brightness should be changed. We also log the number of model
+ iterations if we've set to use personal curve only. Chrome OS only.
+ </summary>
+</histogram>
+
<histogram
name="AutoScreenBrightness.AdapterDecisionAtUserChange.NoBrightnessChange.Cause"
enum="AutoScreenBrightnessNoBrightnessChangeCause"
@@ -10419,6 +10935,12 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="AutoScreenBrightness.BrightnessChange.Cause"
+ enum="AutoScreenBrightnessBrightnessChangeCause" expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <summary>Reason for the model to change brightness. Chrome OS only.</summary>
+</histogram>
+
<histogram name="AutoScreenBrightness.BrightnessChange.ElapsedTime" units="ms"
expires_after="2019-12-31">
<owner>jiameng@chromium.org</owner>
@@ -10427,6 +10949,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="AutoScreenBrightness.BrightnessChange.ModelIteration"
+ units="count" expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <summary>
+ Number of model iterations when brightness is changed by a personal curve.
+ Chrome OS only.
+ </summary>
+</histogram>
+
<histogram name="AutoScreenBrightness.BrightnessMonitorStatus"
enum="AutoScreenBrightnessBrightnessMonitorStatus"
expires_after="2019-12-31">
@@ -10547,6 +11078,22 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="AutoScreenBrightness.ModelIterationCountAtInitialization"
+ units="count" expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <owner>napper@chromium.org</owner>
+ <summary>
+ Personal model iteration count when modeller is initialized. Chrome OS only.
+ </summary>
+</histogram>
+
+<histogram name="AutoScreenBrightness.ModelLoadingStatus"
+ enum="AutoScreenBrightnessModelLoadingStatus" expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <owner>napper@chromium.org</owner>
+ <summary>Status of the model loading from disk. Chrome OS only.</summary>
+</histogram>
+
<histogram name="AutoScreenBrightness.ModelTraining.BrightnessChange"
enum="AutoScreenBrightnessBoundedBrightnessChange"
expires_after="2019-12-31">
@@ -10566,6 +11113,28 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="AutoScreenBrightness.ModelTraining.Inaccuracy.NoUpdate"
+ units="%" expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <owner>napper@chromium.org</owner>
+ <summary>
+ When training data comes in, the model may or may not be updated. We measure
+ the error of the model as compared with the target value from training data.
+ This metric measures the error when model is not updated. Chrome OS only.
+ </summary>
+</histogram>
+
+<histogram name="AutoScreenBrightness.ModelTraining.Inaccuracy.Update"
+ units="%" expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <owner>napper@chromium.org</owner>
+ <summary>
+ When training data comes in, the model may or may not be updated. We measure
+ the error of the model as compared with the target value from training data.
+ This metric measures the error when model is updated. Chrome OS only.
+ </summary>
+</histogram>
+
<histogram name="AutoScreenBrightness.ModelTraining.ModelUserConsistent"
enum="Boolean" expires_after="2019-12-31">
<owner>jiameng@chromium.org</owner>
@@ -10723,7 +11292,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="BackgroundFetch.HasRequestsWithBody" enum="Boolean">
+<histogram name="BackgroundFetch.HasRequestsWithBody" enum="Boolean"
+ expires_after="M78">
<owner>nator@chromium.org</owner>
<owner>rayankans@chromium.org</owner>
<owner>peter@chromium.org</owner>
@@ -11008,7 +11578,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="BackgroundSync.NetworkObserver.HasPermission" enum="Boolean">
+<histogram name="BackgroundSync.NetworkObserver.HasPermission" enum="Boolean"
+ expires_after="M78">
<owner>iclelland@chromium.org</owner>
<summary>
Records whether the browser has sufficient permissions to create a
@@ -11061,7 +11632,7 @@ uploading your change for review.
</histogram>
<histogram name="BackgroundSync.Registration.OneShot.IsDuplicate"
- enum="BooleanRegistrationIsDuplicate">
+ enum="BooleanRegistrationIsDuplicate" expires_after="M78">
<owner>iclelland@chromium.org</owner>
<summary>
Records whether a one-shot sync registration exactly duplicates an existing
@@ -11116,11 +11687,9 @@ uploading your change for review.
</histogram>
<histogram name="BackgroundSync.Unregistration.Periodic"
- enum="BackgroundSyncStatus" expires_after="2016-01-25">
- <obsolete>
- Stopped recording as of 1/2016.
- </obsolete>
- <owner>iclelland@chromium.org</owner>
+ enum="BackgroundSyncStatus" expires_after="M87">
+ <owner>nator@chromium.org</owner>
+ <owner>platform-capabilities@chromium.org</owner>
<summary>
Records the result of attempting to unregister a periodic sync.
</summary>
@@ -11254,6 +11823,18 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Blink.Animation.CompositedAnimationFailureReason"
+ enum="CompositorAnimationsFailureReason" expires_after="2020-04-11">
+ <owner>animations-dev@chromium.org</owner>
+ <summary>
+ Reasons an Animation is not suitable for running on the compositor thread.
+
+ Note that a given Animation may have more than one reason, so this histogram
+ cannot be used to determine the overall rate of 'composited' vs
+ 'noncomposited' animations.
+ </summary>
+</histogram>
+
<histogram name="Blink.Binding.CreateV8ContextForMainFrame"
units="microseconds" expires_after="2019-04-16">
<obsolete>
@@ -11542,6 +12123,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Blink.Canvas.HasRendered" enum="Boolean"
+ expires_after="2020-10-24">
+ <owner>juanmihd@chromium.org</owner>
+ <owner>fserb@chromium.org</owner>
+ <summary>
+ Records if the canvas has been rendered at least once. Recorded on disposal.
+ </summary>
+</histogram>
+
<histogram name="Blink.Canvas.HibernationEvents" enum="CanvasHibernationEvent"
expires_after="2019-12-31">
<owner>fserb@chromium.org</owner>
@@ -11701,7 +12291,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="Blink.Canvas.ToBlob.IdleTaskStatus"
- enum="IdleTaskStatus">
+ enum="IdleTaskStatus" expires_after="M78">
<owner>fserb@chromium.org</owner>
<owner>davidqu@chromium.org</owner>
<summary>
@@ -12400,6 +12990,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="Blink.MainFrame.AnimateRatio" units="%"
+ expires_after="2020-3-1">
+ <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+ <summary>
+ The percentage of time between a BeginMainFrame and paint results commit in
+ Blink that is used for computing Main Frame animations and rAF callbacks.
+ </summary>
+</histogram>
+
<histogram base="true" name="Blink.MainFrame.CompositingCommitRatio" units="%"
expires_after="2020-3-1">
<owner>paint-dev@chromium.org</owner>
@@ -12434,6 +13035,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="Blink.MainFrame.HandleInputEventsRatio" units="%"
+ expires_after="2020-3-1">
+ <owner>paint-dev@chromium.org</owner>
+<!-- Name completed by histogram_suffixes name="BlinkMainFrameUpdateTimeSuffixes" -->
+
+ <summary>
+ The percentage of time between a BeginMainFrame and paint results commit in
+ Blink that is used for processing rAF aligned input.
+ </summary>
+</histogram>
+
<histogram base="true" name="Blink.MainFrame.IntersectionObservationRatio"
units="%" expires_after="2020-3-1">
<owner>paint-dev@chromium.org</owner>
@@ -12971,6 +13583,14 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Blink.SpatialNavigation.Advance" units="microseconds">
+ <owner>bokan@chromium.org</owner>
+ <summary>
+ Time it takes to find best candidate element, set focus or scroll for given
+ directional input.
+ </summary>
+</histogram>
+
<histogram name="Blink.StyleAndLayout.UpdateTime" units="microseconds"
expires_after="2020-3-1">
<owner>layout-dev@chromium.org</owner>
@@ -13098,6 +13718,18 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Blink.UseCounter.FeaturePolicy.AttributeAllowlistType"
+ enum="FeaturePolicyAllowlistType" expires_after="M79">
+ <owner>iclelland@chromium.org</owner>
+ <owner>feature-control@chromium.org</owner>
+ <summary>
+ Logs the type of allowlist used in a Feature-Policy &quot;allow&quot;
+ attribute; whether it is empty, or contains only a single keyword, is
+ composed only of keywords, or contains explicit tuple origins. Recorded at
+ the point that the attribute is parsed.
+ </summary>
+</histogram>
+
<histogram name="Blink.UseCounter.FeaturePolicy.Header"
enum="FeaturePolicyFeature" expires_after="2019-10-31">
<owner>iclelland@chromium.org</owner>
@@ -13107,6 +13739,18 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Blink.UseCounter.FeaturePolicy.HeaderAllowlistType"
+ enum="FeaturePolicyAllowlistType" expires_after="M79">
+ <owner>iclelland@chromium.org</owner>
+ <owner>feature-control@chromium.org</owner>
+ <summary>
+ Logs the type of allowlist used in a Feature-Policy header; whether it is
+ empty, or contains only a single keyword, is composed only of keywords, or
+ contains explicit tuple origins. Recorded at the point that the header is
+ parsed.
+ </summary>
+</histogram>
+
<histogram name="Blink.UseCounter.FeaturePolicy.ImageDownscalingRatio"
units="%" expires_after="M77">
<owner>loonybear@chromium.org</owner>
@@ -13297,8 +13941,17 @@ uploading your change for review.
</details>
</histogram>
-<histogram name="Blink.UseCounter.SVGImage.Features" enum="FeatureObserver">
- <owner>loonybear@chromium.org</owner>
+<histogram name="Blink.UseCounter.SVGImage.Features" enum="FeatureObserver"
+ expires_after="2019-05-15">
+ <obsolete>
+ Removed in 05/2019, M76. Every SVGImage has it's own Page instance and
+ multiple web pages can share the usage of a single SVGImage. Previously
+ Blink.UseCounter.Features was recorded on the Blink side per Page; metrics
+ from SVGImage needed to be recorded in a separate histogram. Now that
+ metrics are recorded on the browser side, feature usage from SVGImage is
+ measured via page load metrics, on Blink.UseCounter.Features, once per page
+ load. This histogram is no longer needed.
+ </obsolete>
<summary>
Like Blink.UseCounter.Features except specifically for the case of SVG
Images.
@@ -13443,7 +14096,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="BlinkGC.CommittedSize" units="MB">
+<histogram name="BlinkGC.CommittedSize" units="MB" expires_after="M78">
<owner>haraken@chromium.org</owner>
<summary>
The committed memory size in Blink GC. The value is reported when we see the
@@ -13539,7 +14192,7 @@ uploading your change for review.
<histogram
name="BlinkGC.SlowIncrementalMarkingFinalize.IncrementalMarkingFinalize"
- units="ms">
+ units="ms" expires_after="M78">
<owner>oilpan-reviews@chromium.org</owner>
<summary>
Duration of time for incremental marking finalization. Only recorded when
@@ -13567,7 +14220,7 @@ uploading your change for review.
<histogram
name="BlinkGC.SlowIncrementalMarkingFinalize.VisitCrossThreadPersistents"
- units="ms">
+ units="ms" expires_after="M78">
<owner>oilpan-reviews@chromium.org</owner>
<summary>
Duration of time taken to visit cross thread persistents. Only recorded when
@@ -13788,6 +14441,49 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Bluetooth.ChromeOS.Pairing.Result" enum="BooleanSuccess"
+ expires_after="2020-05-02">
+<!-- Name completed by histogram_suffixes name="BluetoothTransportTypes" -->
+
+ <owner>hansberry@chromium.org</owner>
+ <summary>
+ Records success or failure of a pairing attempt (initiated in the UI) to a
+ peripheral after the user taps that device in the list of discovered
+ peripherals in Bluetooth Settings or System Tray.
+
+ Suffixed by Bluetooth transport type. View the base histogram to see results
+ for all transport types aggregated together, and suffixed histograms for the
+ results of just that particular transport type.
+ </summary>
+</histogram>
+
+<histogram name="Bluetooth.ChromeOS.Pairing.TransportType"
+ enum="BluetoothTransportType" expires_after="2020-05-02">
+ <owner>hansberry@chromium.org</owner>
+ <summary>
+ An enumerated histogram which captures the transport type of devices which
+ are paired with. Reports of transport types other than classic, BLE, or dual
+ should be considered concerning and investigated.
+ </summary>
+</histogram>
+
+<histogram name="Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt.Result"
+ enum="BooleanSuccess" expires_after="2020-05-22">
+<!-- Name completed by histogram_suffixes name="BluetoothUISurfaces" -->
+
+ <owner>hansberry@chromium.org, jlklein@chromium.org</owner>
+ <summary>
+ Records success or failure of a reconnection attempt to an already paired
+ peripheral after the user taps that device in the list of peripherals in
+ Bluetooth Settings or System Tray. Explicitly excludes automatic
+ reconnection attempts initiated by Chrome OS.
+
+ Suffixed by Bluetooth UI surface. View the base histogram to see results for
+ all UI surfaces aggregated together, and suffixed histograms for the results
+ of just that particular UI surfaces.
+ </summary>
+</histogram>
+
<histogram name="Bluetooth.ConnectedDeviceCount" units="devices">
<owner>adlr@chromium.org</owner>
<summary>
@@ -14496,6 +15192,9 @@ uploading your change for review.
Logs when a user action triggers a command in the bookmark manager. Commands
can be triggered by keyboard shortcuts, menu items or other buttons in the
UI.
+
+ Revised in M-76 when the &quot;Open (double click/enter)&quot; bucket was
+ split into two separate buckets, one for bookmarks and one for folders.
</summary>
</histogram>
@@ -14504,6 +15203,9 @@ uploading your change for review.
<owner>calamity@chromium.org</owner>
<summary>
Logs when a keyboard shortcut triggers a command in the bookmark manager.
+
+ Revised in M-76 when the &quot;Open (double click/enter)&quot; bucket was
+ split into two separate buckets, one for bookmarks and one for folders.
</summary>
</histogram>
@@ -14677,7 +15379,10 @@ uploading your change for review.
</histogram>
<histogram name="BrotliFilter.GzipHeaderDetected" enum="BooleanPresent"
- expires_after="M77">
+ expires_after="M75">
+ <obsolete>
+ Removed in M76.
+ </obsolete>
<owner>eustas@chromium.org</owner>
<summary>Indicates whether the gzip-like header was detected.</summary>
</histogram>
@@ -14737,9 +15442,29 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="Browser.Tabs.TabSwitchResult"
+ units="TabSwitchResult" expires_after="2019-08-31">
+<!-- Name completed by histogram_suffixes name="TabSwitchingType" -->
+
+ <owner>fdoray@chromium.org</owner>
+ <summary>Whether a frame was presented after a tab switch event.</summary>
+</histogram>
+
+<histogram base="true" name="Browser.Tabs.TotalIncompleteSwitchDuration"
+ units="ms" expires_after="2019-08-31">
+<!-- Name completed by histogram_suffixes name="TabSwitchingType" -->
+
+ <owner>fdoray@chromium.org</owner>
+ <owner>jonross@chromium.com</owner>
+ <summary>
+ The time between a tab switch input event timestamp and when the tab is
+ hidden, if no frame is presented in the meantime.
+ </summary>
+</histogram>
+
<histogram base="true" name="Browser.Tabs.TotalSwitchDuration" units="ms"
expires_after="2019-08-31">
-<!-- Name completed by histogram_suffixes name="TabSwitchingTime" -->
+<!-- Name completed by histogram_suffixes name="TabSwitchingType" -->
<owner>ejoe@google.com</owner>
<owner>jonross@chromium.com</owner>
@@ -15023,6 +15748,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="BrowserSwitcher.ExternalGreylistSize" units="rules"
+ expires_after="M79">
+ <owner>nicolaso@chromium.org</owner>
+ <owner>pastarmovj@chromium.org</owner>
+ <summary>
+ Number of rules that come from an external greylist XML file. Measured when
+ the sitelist is loaded during browser startup. Desktop Chrome only.
+ </summary>
+</histogram>
+
<histogram name="BrowserSwitcher.ExternalSitelistSize" units="rules">
<owner>nicolaso@chromium.org</owner>
<owner>pastarmovj@chromium.org</owner>
@@ -15131,7 +15866,7 @@ uploading your change for review.
<summary>An open bubble was closed because the user accepted it.</summary>
</histogram>
-<histogram name="Bubbles.Close.Canceled" enum="BubbleType">
+<histogram name="Bubbles.Close.Canceled" enum="BubbleType" expires_after="M78">
<owner>hcarmona@chromium.org</owner>
<summary>
An open bubble was closed because the user didn't accept it.
@@ -15160,7 +15895,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Bubbles.Close.Navigated" enum="BubbleType">
+<histogram name="Bubbles.Close.Navigated" enum="BubbleType" expires_after="M78">
<owner>hcarmona@chromium.org</owner>
<summary>
An open bubble was dismissed because the page was navigated.
@@ -15388,7 +16123,7 @@ uploading your change for review.
</histogram>
<histogram name="CaptivePortal.Notification.Status"
- enum="CaptivePortalNotificationStatus">
+ enum="CaptivePortalNotificationStatus" expires_after="M78">
<owner>alemate@chromium.org</owner>
<summary>
Count of displayed and not displayed due to errors notifications about
@@ -15462,8 +16197,9 @@ uploading your change for review.
</histogram>
<histogram name="CaptivePortal.Session.DetectionResult"
- enum="CaptivePortalStatus" expires_after="M77">
+ enum="CaptivePortalStatus" expires_after="M84">
<owner>alemate@chromium.org</owner>
+ <owner>michaeldo@chromium.org</owner>
<summary>
The result of captive portal detection attempts performed in user session.
Detection result is recorded when portal detection is completed for an
@@ -15492,7 +16228,7 @@ uploading your change for review.
</histogram>
<histogram name="CaptivePortal.Session.SecureConnectionFailed"
- enum="CaptivePortalStatus">
+ enum="CaptivePortalStatus" expires_after="M84">
<owner>michaeldo@chromium.org</owner>
<summary>
The result of captive portal detection attempts performed in user session.
@@ -15502,7 +16238,7 @@ uploading your change for review.
</histogram>
<histogram name="CaptivePortal.Session.TimeoutDetectionResult"
- enum="CaptivePortalStatus">
+ enum="CaptivePortalStatus" expires_after="M84">
<owner>michaeldo@chromium.org</owner>
<summary>
The result of captive portal detection attempts performed in user session.
@@ -15577,7 +16313,7 @@ uploading your change for review.
<histogram name="Cast.Sender.CastMediaType" enum="MediaContainers">
<owner>takumif@chromium.org</owner>
<owner>mfoltz@chromium.org</owner>
- <owner>openscreen-team@google.com</owner>
+ <owner>openscreen-eng@google.com</owner>
<summary>Records the media type of every video being cast.</summary>
</histogram>
@@ -16009,8 +16745,21 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="ChildProcess.HungRendererAvailableMemoryMB" units="MB"
+ expires_after="M79">
+ <owner>cduvall@chromium.org</owner>
+ <owner>cmumford@chromium.org</owner>
+ <summary>
+ The amount of avaiable memory when a renderer hangs. Recorded for every
+ renderer hang.
+ </summary>
+</histogram>
+
<histogram name="ChildProcess.HungRendererCause"
enum="RendererUnresponsiveCause" expires_after="M74">
+ <obsolete>
+ Removed 4/2019.
+ </obsolete>
<owner>cmumford@chromium.org</owner>
<summary>
What the browser was waiting for from the renderer when it was reported as
@@ -16502,6 +17251,93 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true"
+ name="ChromeOS.Camera.ConfigureStreams.Output.Resolution" units="pixels"
+ expires_after="2019-10-25">
+<!-- Name completed by histogram_suffixes
+ name="ChromeOS.Camera.StreamFormat" -->
+
+ <owner>wtlee@chromium.org</owner>
+ <summary>
+ Records the resolution of output stream that is configured by Chrome OS
+ camera service.
+ </summary>
+</histogram>
+
+<histogram name="ChromeOS.Camera.ConfigureStreamsLatency" units="microseconds"
+ expires_after="2019-10-25">
+ <owner>wtlee@chromium.org</owner>
+ <summary>
+ Records the process time of ConfigureStreams() method in Chrome OS camera
+ service.
+ </summary>
+</histogram>
+
+<histogram name="ChromeOS.Camera.ErrorType" enum="ChromeOSCameraErrorType"
+ expires_after="2019-10-25">
+ <owner>wtlee@chromium.org</owner>
+ <summary>
+ Records the type of the error which triggers the Notify() method in Chrome
+ OS camera service.
+ </summary>
+</histogram>
+
+<histogram name="ChromeOS.Camera.Facing" enum="ChromeOSCameraFacing"
+ expires_after="2019-10-25">
+ <owner>wtlee@chromium.org</owner>
+ <summary>
+ Records the camera facing of the camera session in Chrome OS camera service.
+ </summary>
+</histogram>
+
+<histogram base="true" name="ChromeOS.Camera.Jpeg.Latency" units="microseconds"
+ expires_after="2019-10-25">
+<!-- Name completed by histogram_suffixes
+ name="ChromeOS.Camera.JpegProcessMethod" -->
+
+<!-- Name completed by histogram_suffixes
+ name="ChromeOS.Camera.JpegProcessType" -->
+
+ <owner>wtlee@chromium.org</owner>
+ <summary>
+ Records the process time of the JDA (Jpeg Decode Accelerator) or JEA (Jpeg
+ Encode Accelerator) run on Chrome OS camera service. There are suffixes that
+ record the runner method (hardware/software), the runner type
+ (decode/encode).
+ </summary>
+</histogram>
+
+<histogram base="true" name="ChromeOS.Camera.Jpeg.Resolution" units="pixels"
+ expires_after="2019-10-25">
+<!-- Name completed by histogram_suffixes
+ name="ChromeOS.Camera.JpegProcessMethod" -->
+
+<!-- Name completed by histogram_suffixes
+ name="ChromeOS.Camera.JpegProcessType" -->
+
+ <owner>wtlee@chromium.org</owner>
+ <summary>
+ Records the resolution of the image that JDA/JEA process by Chrome OS camera
+ service. The resolution represents by the total pixels contained in the
+ image. There are suffixes that record the runner method (hardware/software),
+ the runner type (decode/encode).
+ </summary>
+</histogram>
+
+<histogram name="ChromeOS.Camera.OpenDeviceLatency" units="microseconds"
+ expires_after="2019-10-25">
+ <owner>wtlee@chromium.org</owner>
+ <summary>
+ Records the process time of OpenDevice() method in Chrome OS camera service.
+ </summary>
+</histogram>
+
+<histogram name="ChromeOS.Camera.SessionDuration" units="seconds"
+ expires_after="2019-10-25">
+ <owner>wtlee@chromium.org</owner>
+ <summary>Records the session duration in Chrome OS camera service.</summary>
+</histogram>
+
<histogram name="ChromeOS.CWP.CollectHeap"
enum="ChromeOSProfileCollectionStatus" expires_after="2020-02-01">
<owner>aalexand@google.com</owner>
@@ -16700,7 +17536,7 @@ uploading your change for review.
</histogram>
<histogram name="ChromeOS.SAML.Scraping.VerificationResult"
- enum="BooleanSuccess">
+ enum="BooleanSuccess" expires_after="M78">
<owner>bartfab@chromium.org</owner>
<summary>
Whether one of the scraped passwords was successfully verified as the user's
@@ -17432,6 +18268,11 @@ uploading your change for review.
</histogram>
<histogram name="Compositing.Browser.CachedImagesCount" units="count">
+ <obsolete>
+ Deprecated 05/2019 because it no longer reports. To be superseded by a
+ measurement related to percentage of cache/discardable memory used by image
+ caching.
+ </obsolete>
<owner>vmpstr@chromium.org</owner>
<summary>
The maximum number of images that were cached in the browser over the
@@ -17624,7 +18465,10 @@ uploading your change for review.
</histogram>
<histogram name="Compositing.Browser.RasterTask.RasterPixelsPerMs2"
- units="pixels/ms">
+ units="pixels/ms" expires_after="2019-4-24">
+ <obsolete>
+ Removed 04/2019. Was unused.
+ </obsolete>
<owner>paint-dev@chromium.org</owner>
<summary>
Rasterized area, in pixels, divided by rasterization time, in milliseconds,
@@ -17932,6 +18776,11 @@ uploading your change for review.
</histogram>
<histogram name="Compositing.Renderer.CachedImagesCount" units="count">
+ <obsolete>
+ Deprecated 05/2019 because it no longer reports. To be superseded by a
+ measurement related to percentage of cache/discardable memory used by image
+ caching.
+ </obsolete>
<owner>vmpstr@chromium.org</owner>
<summary>
The maximum number of images that were cached in the renderer over the
@@ -18144,7 +18993,10 @@ uploading your change for review.
</histogram>
<histogram name="Compositing.Renderer.RasterTask.RasterPixelsPerMs2"
- units="pixels/ms">
+ units="pixels/ms" expires_after="2019-4-24">
+ <obsolete>
+ Removed 04/2019. Was unused.
+ </obsolete>
<owner>paint-dev@chromium.org</owner>
<summary>
Rasterized area, in pixels, divided by rasterization time, in milliseconds,
@@ -18680,7 +19532,8 @@ uploading your change for review.
<summary>The default handler setting at profile open.</summary>
</histogram>
-<histogram name="ContentSettings.DefaultImagesSetting" enum="ContentSetting">
+<histogram name="ContentSettings.DefaultImagesSetting" enum="ContentSetting"
+ expires_after="M78">
<owner>toyoshim@chromium.org</owner>
<summary>The default image setting at profile open.</summary>
</histogram>
@@ -18702,7 +19555,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ContentSettings.DefaultLocationSetting" enum="ContentSetting">
+<histogram name="ContentSettings.DefaultLocationSetting" enum="ContentSetting"
+ expires_after="M78">
<owner>toyoshim@chromium.org</owner>
<summary>The default location setting at profile open.</summary>
</histogram>
@@ -19165,6 +20019,10 @@ uploading your change for review.
<histogram name="ContentSettings.Popups.StrongBlockerActivationPosition"
enum="SafeBrowsingActivationPosition" expires_after="M77">
+ <obsolete>
+ Deprecated in favor of
+ SubresourceFilter.PageLoad.Activation.RedirectPosition2.Enforcement
+ </obsolete>
<owner>csharrison@chromium.org</owner>
<owner>ericrobinson@chromium.org</owner>
<summary>
@@ -19212,6 +20070,35 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="ContentSuggestions.Feed.AvailableOffline.Opened"
+ enum="Boolean" expires_after="2020-07-01">
+ <owner>skym@chromium.org</owner>
+ <owner>carlosk@chromium.org</owner>
+ <summary>
+ When an article on the NTP is opened by the user, records whether it is
+ available offline. When an article is available offline, it will have an
+ offline badge in the UI on the NTP. Opening the article occurs when the user
+ navigates from the NTP to the article itself, which can be either in the
+ current tab or a new tab. Note that this is independent of whether the
+ article is actually opened as an offline page or not.
+ </summary>
+</histogram>
+
+<histogram name="ContentSuggestions.Feed.AvailableOffline.Shown" enum="Boolean"
+ expires_after="2020-07-01">
+ <owner>skym@chromium.org</owner>
+ <owner>carlosk@chromium.org</owner>
+ <summary>
+ Records whether an article on the NTP that is shown to the user was also
+ available offline. When an article is available offline, it will have an
+ offline badge in the UI. The initial offline status of the article is used
+ for this metric. While it is possible for the offline status to change while
+ the article is on screen, this metric will not be re-emitted. The criteria
+ for an article to be &quot;shown&quot; is for 2/3 of its vertical height to
+ be on screen for any amount of time.
+ </summary>
+</histogram>
+
<histogram name="ContentSuggestions.Feed.CommitMutationCount"
units="operations" expires_after="2019-10-01">
<owner>gangwu@chromium.org</owner>
@@ -19839,8 +20726,57 @@ uploading your change for review.
</histogram>
<histogram name="ContextMenu.SelectedOption" enum="ContextMenuOption">
+ <obsolete>
+ Removed from code as of 5/2019. WARNING: The code emitting this histogram
+ was broken on desktop, and logged many items that should not have been
+ logged at all into bucket 0. The values for bucket 0 are wrong and should
+ not be relied upon. The replacements are ContextMenu.SelectedOptionDesktop,
+ ContextMenu.SelectedOptionAndroid, and ContextMenu.SelectedOptionIOS.
+ </obsolete>
<owner>lzbylut@google.com</owner>
- <summary>The option that the user selected from a context menu.</summary>
+ <summary>
+ The option that the user selected from a context menu. This mis-logged and
+ thus was removed.
+ </summary>
+</histogram>
+
+<histogram name="ContextMenu.SelectedOptionAndroid"
+ enum="ContextMenuOptionAndroid" expires_after="2020-06-30">
+ <owner>avi@chromium.org</owner>
+ <owner>mpearson@chromium.org</owner>
+ <summary>
+ The option that the user selected from a context menu on Android. This is
+ logged on Android only; check out ContextMenu.SelectedOptionIOS for iOS, and
+ ContextMenu.SelectedOptionDesktop for desktop. Note that if a menu is
+ invoked on mixed content, only one of the submetrics receives the log; read
+ the code to determine which one.
+ </summary>
+</histogram>
+
+<histogram name="ContextMenu.SelectedOptionDesktop"
+ enum="ContextMenuOptionDesktop" expires_after="2020-06-30">
+ <owner>avi@chromium.org</owner>
+ <owner>mpearson@chromium.org</owner>
+ <summary>
+ The option that the user selected from a context menu on desktop. This is
+ logged on desktop only; check out ContextMenu.SelectedOptionIOS for iOS, and
+ ContextMenu.SelectedOptionAndroid for Android. Note that if a menu is
+ invoked on mixed content, only one of the submetrics receives the log; read
+ the code to determine which one.
+ </summary>
+</histogram>
+
+<histogram name="ContextMenu.SelectedOptionIOS" enum="ContextMenuOptionIOS"
+ expires_after="2020-06-30">
+ <owner>avi@chromium.org</owner>
+ <owner>mpearson@chromium.org</owner>
+ <summary>
+ The option that the user selected from a context menu on iOS. This is logged
+ on iOS only; check out ContextMenu.SelectedOptionAndroid for Android, and
+ ContextMenu.SelectedOptionDesktop for desktop. Note that if a menu is
+ invoked on mixed content, only one of the submetrics receives the log; read
+ the code to determine which one.
+ </summary>
</histogram>
<histogram name="ContextMenu.Shown" enum="BooleanPresent">
@@ -19852,10 +20788,9 @@ uploading your change for review.
new tab page or from the sad tab page will not cause an emission to this
histogram.) Note that this refers to link context menus, not the
cut-copy-paste context menus that can appear during long presses on text on
- a web page or long presses in the omnibox. The value of this histogram for
- &quot;present&quot; could be usefully compared with the total count of
- ContextMenu.SelectedOption to determine the clickthrough rate for context
- menus.
+ a web page or long presses in the omnibox. This is an Android-only metric;
+ compare with RenderViewContextMenu.Shown and RenderViewContextMenu.Used on
+ desktop.
</summary>
</histogram>
@@ -19870,8 +20805,8 @@ uploading your change for review.
</histogram>
<histogram name="ContextMenu.ViewsTextServices.Emoji" enum="Boolean"
- expires_after="2019-06-01">
- <owner>shend@chromium.org</owner>
+ expires_after="2019-12-31">
+ <owner>ramyan@chromium.org</owner>
<summary>
Number of times the emoji item in the views text services context menu is
used.
@@ -19889,6 +20824,9 @@ uploading your change for review.
</histogram>
<histogram name="ContextualSuggestions.EnabledState" enum="BooleanEnabled">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>huayinz@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<summary>
@@ -19900,6 +20838,9 @@ uploading your change for review.
<histogram name="ContextualSuggestions.Events"
enum="ContextualSuggestions.Event">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>donnd@chromium.org</owner>
<owner>fgorski@chromium.org</owner>
<owner>twellington@chromium.org</owner>
@@ -19911,6 +20852,9 @@ uploading your change for review.
</histogram>
<histogram name="ContextualSuggestions.FetchErrorCode" enum="NetErrorCodes">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>pnoland@chromium.org</owner>
<summary>
Android: The net::Error status code of contextual suggestion fetches.
@@ -19918,8 +20862,10 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ContextualSuggestions.FetchLatencyMilliseconds" units="ms"
- expires_after="M77">
+<histogram name="ContextualSuggestions.FetchLatencyMilliseconds" units="ms">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>pnoland@chromium.org</owner>
<owner>fgorski@chromium.org</owner>
<summary>
@@ -19928,18 +20874,22 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ContextualSuggestions.FetchRequestProtoSizeKB" units="KB"
- expires_after="M77">
+<histogram name="ContextualSuggestions.FetchRequestProtoSizeKB" units="KB">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>pnoland@chromium.org</owner>
<summary>
Android: The size of the serialized and base64-encoded proto sent to the
server when fetching contextual suggestions. Recorded when a fetch is
- initiated.
</summary>
</histogram>
<histogram name="ContextualSuggestions.FetchResponseCode"
enum="HttpResponseCode">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>pnoland@chromium.org</owner>
<summary>
Android: The http status code of contextual suggestion fetches. Recorded
@@ -19947,8 +20897,10 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ContextualSuggestions.FetchResponseNetworkBytes" units="bytes"
- expires_after="M77">
+<histogram name="ContextualSuggestions.FetchResponseNetworkBytes" units="bytes">
+ <obsolete>
+ This feature was deprecated in M75
+ </obsolete>
<owner>pnoland@chromium.org</owner>
<summary>
Android: The number of bytes in the response received when a contextual
@@ -19959,8 +20911,7 @@ uploading your change for review.
<histogram name="ContextualSuggestions.FetchResponseSizeKB" units="KB"
expires_after="2018-06-04">
<obsolete>
- Removed 2018-06-01 in favor of a histogram that measures bytes received over
- the network directly instead of the uncompressed KB.
+ This feature was deprecated in M74
</obsolete>
<owner>pnoland@chromium.org</owner>
<summary>
@@ -19971,6 +20922,9 @@ uploading your change for review.
<histogram name="ContextualSuggestions.PageViewClickLength"
enum="ContextualSuggestions.ClickDuration">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>fgorski@chromium.org</owner>
<owner>wylieb@chromium.org</owner>
<summary>
@@ -19983,8 +20937,10 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ContextualSuggestions.PageViewTime" units="ms"
- expires_after="M77">
+<histogram name="ContextualSuggestions.PageViewTime" units="ms">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>fgorski@chromium.org</owner>
<owner>wylieb@chromium.org</owner>
<summary>
@@ -19997,8 +20953,10 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ContextualSuggestions.Preference.State" enum="BooleanEnabled"
- expires_after="M77">
+<histogram name="ContextualSuggestions.Preference.State" enum="BooleanEnabled">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>huayinz@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<summary>
@@ -20023,6 +20981,9 @@ uploading your change for review.
<histogram name="ContextualSuggestions.SuggestionClickPosition.Cluster"
units="index" expires_after="2019-05-30">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>twellington@chromium.org</owner>
<owner>huayinz@chromium.org</owner>
<summary>
@@ -20033,6 +20994,9 @@ uploading your change for review.
<histogram name="ContextualSuggestions.SuggestionClickPosition.Global"
units="index" expires_after="2019-05-30">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>twellington@chromium.org</owner>
<owner>huayinz@chromium.org</owner>
<summary>
@@ -20439,6 +21403,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Cookie.TimeDatabaseMigrationToV11" units="ms"
+ expires_after="M78">
+ <owner>chlily@chromium.org</owner>
+ <owner>morlovich@chromium.org</owner>
+ <summary>
+ The amount of time (ms) to migrate a v10 cookie database to v11. Migration
+ occurs upon first startup of a browser version with v11 database code.
+ </summary>
+</histogram>
+
<histogram name="Cookie.TimeDatabaseMigrationToV5" units="ms"
expires_after="2015-04-17">
<obsolete>
@@ -20599,8 +21573,33 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Cras.HighestDeviceDelayInput" expires_after="2020-04-23">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The highest hardware delay of input device in CRAS(ChromeOS audio server).
+ It is calculated by 1000 * highest_hw_level / largest_cb_level. The
+ highest_hw_level is the highest remaining frames in the device. The
+ largest_cb_level is the largest callback threshold of streams which have
+ attached to this device. The value is recorded when the device is removed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.HighestDeviceDelayOutput" expires_after="2020-04-23">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The highest hardware delay of output device in CRAS(ChromeOS audio server).
+ It is calculated by 1000 * highest_hw_level / largest_cb_level. The
+ highest_hw_level is the highest remaining frames in the device. The
+ largest_cb_level is the largest callback threshold of streams which have
+ attached to this device. The value is recorded when the device is removed.
+ </summary>
+</histogram>
+
<histogram name="Cras.HighestInputHardwareLevel" units="frames">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The highest hardware level of input device in CRAS(Chrome OS audio server).
The hardware level is the remaining frames in the device. For input device,
@@ -20610,6 +21609,7 @@ uploading your change for review.
<histogram name="Cras.HighestOutputHardwareLevel" units="frames">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The highest hardware level of output device in CRAS(Chrome OS audio server).
The hardware level is the remaining frames in the device. For output device,
@@ -20617,9 +21617,164 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Cras.InputDeviceA2DPRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device A2DP in CRAS(ChromeOS audio server). The runtime
+ is the duration between opening and closing a device. The value is recorded
+ when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceBluetoothRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device Bluetooth in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceFrontMicRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device InternalMic in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceHFPRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device HFP in CRAS(ChromeOS audio server). The runtime
+ is the duration between opening and closing a device. The value is recorded
+ when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceHotwordRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device Hotword in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceHSPRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device HSP in CRAS(ChromeOS audio server). The runtime
+ is the duration between opening and closing a device. The value is recorded
+ when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceInternalMicRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device InternalMic in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceKeyboardMicRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device InternalMic in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceMicRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device Mic in CRAS(ChromeOS audio server). The runtime
+ is the duration between opening and closing a device. The value is recorded
+ when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDevicePostDspLoopbackRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device PostDspLoopback in CRAS(ChromeOS audio server).
+ The runtime is the duration between opening and closing a device. The value
+ is recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDevicePostMixLoopbackRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device PostMixLoopback in CRAS(ChromeOS audio server).
+ The runtime is the duration between opening and closing a device. The value
+ is recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceRearMicRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device InternalMic in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceUnknownRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device Unknown in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.InputDeviceUSBRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of input device USB in CRAS(ChromeOS audio server). The runtime
+ is the duration between opening and closing a device. The value is recorded
+ when the device is closed.
+ </summary>
+</histogram>
+
<histogram name="Cras.MissedCallbackFirstTimeInput" units="seconds"
expires_after="2020-01-17">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The first time missed callbacks happened on input streams in CRAS (Chrome OS
audio server). In normal situation, audio thread should follow the callback
@@ -20633,6 +21788,7 @@ uploading your change for review.
<histogram name="Cras.MissedCallbackFirstTimeOutput" units="seconds"
expires_after="2020-01-17">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The first time missed callbacks happened on output streams in CRAS (Chrome
OS audio server). In normal situation, audio thread should follow the
@@ -20643,9 +21799,33 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Cras.MissedCallbackFrequencyAfterReschedulingInput"
+ units="count" expires_after="2020-05-09">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The number of missed callbacks of input streams in a day after rescheduling.
+ It is calculated by number of the missed callbacks / runtime of the stream
+ after rescheduling. This value is recorded when the stream is removed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.MissedCallbackFrequencyAfterReschedulingOutput"
+ units="count" expires_after="2020-05-09">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The number of missed callbacks of output streams in a day after
+ rescheduling. It is calculated by number of the missed callbacks / runtime
+ of the stream after rescheduling. This value is recorded when the stream is
+ removed.
+ </summary>
+</histogram>
+
<histogram name="Cras.MissedCallbackFrequencyInput" units="count"
expires_after="2020-01-17">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The number of missed callbacks of input streams in a day. It is calculated
by number of the missed callbacks / runtime of the stream. This value is
@@ -20656,6 +21836,7 @@ uploading your change for review.
<histogram name="Cras.MissedCallbackFrequencyOutput" units="count"
expires_after="2020-01-17">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The number of missed callbacks of output streams in a day. It is calculated
by number of the missed callbacks / runtime of the stream. This value is
@@ -20663,8 +21844,152 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Cras.MissedCallbackSecondTimeInput" units="seconds"
+ expires_after="2020-05-09">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The second time missed callbacks happened on input streams in CRAS (Chrome
+ OS audio server). When the second time audio thread misses callback
+ schedule, record how many seconds have passed since the first time.
+ </summary>
+</histogram>
+
+<histogram name="Cras.MissedCallbackSecondTimeOutput" units="seconds"
+ expires_after="2020-05-09">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The second time missed callbacks happened on output streams in CRAS (Chrome
+ OS audio server). When the second time audio thread misses callback
+ schedule, record how many seconds have passed since the first time.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceA2DPRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device A2DP in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceBluetoothRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device Bluetooth in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceHapticRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device Haptic in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceHDMIRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device HDMI in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceHeadphoneRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device Headphone in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceHFPRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device HFP in CRAS(ChromeOS audio server). The runtime
+ is the duration between opening and closing a device. The value is recorded
+ when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceHSPRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device HSP in CRAS(ChromeOS audio server). The runtime
+ is the duration between opening and closing a device. The value is recorded
+ when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceInternalSpeakerRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device InternalSpeaker in CRAS(ChromeOS audio server).
+ The runtime is the duration between opening and closing a device. The value
+ is recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceLineoutRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device Lineout in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceUnknownRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device Unknown in CRAS(ChromeOS audio server). The
+ runtime is the duration between opening and closing a device. The value is
+ recorded when the device is closed.
+ </summary>
+</histogram>
+
+<histogram name="Cras.OutputDeviceUSBRuntime" units="seconds"
+ expires_after="2020-05-13">
+ <owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
+ <summary>
+ The runtime of output device USB in CRAS(ChromeOS audio server). The runtime
+ is the duration between opening and closing a device. The value is recorded
+ when the device is closed.
+ </summary>
+</histogram>
+
<histogram name="Cras.StreamCallbackThreshold" units="frames">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The callback threshold of stream in CRAS(Chrome OS audio server). It is the
number of frames when to request more from the client. This value is
@@ -20674,6 +21999,7 @@ uploading your change for review.
<histogram name="Cras.StreamFlags" units="value">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The flags of stream in CRAS(Chrome OS audio server). It is the special
handling for stream. This value is recorded when the stream is created.
@@ -20682,6 +22008,7 @@ uploading your change for review.
<histogram name="Cras.StreamSamplingFormat" enum="AlsaSampleFormatType">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The sampling format of stream in CRAS(Chrome OS audio server). This value is
recorded when the stream is created.
@@ -20690,6 +22017,7 @@ uploading your change for review.
<histogram name="Cras.StreamSamplingRate" units="bps">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The sampling rate of stream in CRAS(Chrome OS audio server). This value is
recorded when the stream is created.
@@ -20698,6 +22026,7 @@ uploading your change for review.
<histogram name="Cras.StreamTimeoutMilliSeconds" units="ms">
<owner>hychao@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The longest additional time CRAS(Chrome OS audio server) ever waits for a
stream exceeding the timeout threshold. This value is recorded per stream
@@ -20708,6 +22037,7 @@ uploading your change for review.
<histogram name="Cras.UnderrunsPerDevice" units="count">
<owner>yuhsuan@chromium.org</owner>
+ <owner>chromeos-audio@google.com</owner>
<summary>
The number of underruns happened on one audio device. Underrun here means
there are no samples in device buffer while device is playing. It is
@@ -20840,6 +22170,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="CrashReport.BreakpadIOSUploadOutcome"
+ enum="FoundationPopularErrorCode">
+ <owner>olivierrobin@chromium.org</owner>
+ <summary>
+ Reports the Foundation error code of an attempt to upload a breakpad crash
+ report. &quot;NSNoError&quot; if the upload was successful.
+ </summary>
+</histogram>
+
<histogram name="CrashReport.CrashBackgroundUploadDelay" units="ms"
expires_after="2018-11-05">
<obsolete>
@@ -21242,7 +22581,7 @@ uploading your change for review.
</histogram>
<histogram name="CrosUsb.NotificationClosed" enum="CrosUsbNotificationClosed"
- expires_after="2019-07-01">
+ expires_after="2021-07-01">
<owner>benwells@chromium.org</owner>
<owner>nverne@chromium.org</owner>
<owner>tbuckley@chromium.org</owner>
@@ -21406,7 +22745,7 @@ uploading your change for review.
</histogram>
<histogram name="Cryptohome.DircryptoMigrationFailedOperationType"
- enum="DircryptoMigrationFailedOperationType">
+ enum="DircryptoMigrationFailedOperationType" expires_after="M78">
<owner>kinaba@chromium.org</owner>
<summary>
The type of file operation at which the user home directory migration from
@@ -21416,7 +22755,7 @@ uploading your change for review.
</histogram>
<histogram name="Cryptohome.DircryptoMigrationFailedPathType"
- enum="DircryptoMigrationFailedPathType">
+ enum="DircryptoMigrationFailedPathType" expires_after="M78">
<owner>kinaba@chromium.org</owner>
<summary>
The category of the path where the user home directory migration from
@@ -21560,7 +22899,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="Cryptohome.LECredential"
- enum="CryptohomeLECredError" expires_after="2019-04-23">
+ enum="CryptohomeLECredError" expires_after="2019-10-23">
<!-- Name completed by histogram_suffixes name="LECredentialOps" -->
<owner>pmalani@chromium.org</owner>
@@ -22481,7 +23820,7 @@ uploading your change for review.
<histogram
name="DataReductionProxy.DaysSinceSavingsCleared.NegativeSystemClock"
- units="days">
+ units="days" expires_after="M78">
<owner>tbansal@chromium.org</owner>
<owner>bengr@chromium.org</owner>
<summary>
@@ -24149,7 +25488,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="DemoMode.ActiveApp" enum="DemoModeApp" expires_after="M76">
+<histogram name="DemoMode.ActiveApp" enum="DemoModeApp" expires_after="M82">
<owner>michaelpg@chromium.org</owner>
<owner>ovanieva@chromium.org</owner>
<owner>tbarzic@chromium.org</owner>
@@ -24159,7 +25498,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="DemoMode.AppLaunched" enum="DemoModeApp" expires_after="M76">
+<histogram name="DemoMode.AppLaunched" enum="DemoModeApp" expires_after="M82">
<owner>danan@chromium.org</owner>
<owner>michaelpg@chromium.org</owner>
<summary>
@@ -24170,7 +25509,7 @@ uploading your change for review.
</histogram>
<histogram name="DemoMode.AppLaunchSource" enum="DemoModeAppLaunchSource"
- expires_after="M76">
+ expires_after="M82">
<owner>danan@chromium.org</owner>
<owner>michaelpg@chromium.org</owner>
<summary>
@@ -24180,7 +25519,7 @@ uploading your change for review.
</histogram>
<histogram name="DemoMode.IdleLogoutWarningEvent"
- enum="DemoModeIdleLogoutWarningEvent" expires_after="M76">
+ enum="DemoModeIdleLogoutWarningEvent" expires_after="M82">
<owner>michaelpg@chromium.org</owner>
<owner>ovanieva@chromium.org</owner>
<owner>wzang@chromium.org</owner>
@@ -24193,7 +25532,7 @@ uploading your change for review.
</histogram>
<histogram name="DemoMode.ResourcesRemoval.Reason"
- enum="DemoModeResourcesRemovalReason" expires_after="M76">
+ enum="DemoModeResourcesRemovalReason" expires_after="M82">
<owner>michaelpg@chromium.org</owner>
<owner>ovanieva@chromium.org</owner>
<owner>tbarzic@chromium.org</owner>
@@ -24206,7 +25545,7 @@ uploading your change for review.
</histogram>
<histogram name="DemoMode.ResourcesRemoval.Result"
- enum="DemoModeResourcesRemovalResult" expires_after="M76">
+ enum="DemoModeResourcesRemovalResult" expires_after="M82">
<owner>michaelpg@chromium.org</owner>
<owner>ovanieva@chromium.org</owner>
<owner>tbarzic@chromium.org</owner>
@@ -24221,7 +25560,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="DemoMode.SessionLength" units="minutes" expires_after="M76">
+<histogram name="DemoMode.SessionLength" units="minutes" expires_after="M82">
<owner>michaelpg@chromium.org</owner>
<owner>ovanieva@chromium.org</owner>
<owner>tbarzic@chromium.org</owner>
@@ -24390,6 +25729,49 @@ uploading your change for review.
<summary>Specified DevTools action has been taken.</summary>
</histogram>
+<histogram name="DevTools.BackgroundService.ClearEvents"
+ enum="ServiceWorkerStatusCode" expires_after="M78">
+ <owner>dgozman@chromium.org</owner>
+ <owner>rayankans@chromium.org</owner>
+ <summary>
+ The result of clearing all stored events for a Background Service feature.
+ This is called if a developer clicks on a delete button in a Background
+ Service DevTools panel.
+ </summary>
+</histogram>
+
+<histogram name="DevTools.BackgroundService.GetEvents"
+ enum="ServiceWorkerStatusCode" expires_after="M78">
+ <owner>dgozman@chromium.org</owner>
+ <owner>rayankans@chromium.org</owner>
+ <summary>
+ The result of loading all stored events for a Background Service feature.
+ This is called when the a Bakground Service DevTools panel is opened.
+ </summary>
+</histogram>
+
+<histogram name="DevTools.BackgroundService.LogEvent"
+ enum="ServiceWorkerStatusCode" expires_after="M78">
+ <owner>dgozman@chromium.org</owner>
+ <owner>rayankans@chromium.org</owner>
+ <summary>
+ The result of logging a Background Service event. An event is logged if
+ `Recording` mode is on and a relevant Background Service event is taking
+ place.
+ </summary>
+</histogram>
+
+<histogram name="DevTools.BackgroundService.StartRecording"
+ enum="DevToolsBackgroundService" expires_after="M78">
+ <owner>dgozman@chromium.org</owner>
+ <owner>rayankans@chromium.org</owner>
+ <summary>
+ Records the Background Service for which `Recording` mode was enabled. This
+ is called if the developer toggles the record button in the relevant
+ Bakground Service DevTools panel.
+ </summary>
+</histogram>
+
<histogram name="DevTools.InspectElement" units="ms">
<owner>alph@chromium.org</owner>
<owner>pfeldman@chromium.org</owner>
@@ -26637,7 +28019,7 @@ uploading your change for review.
<summary>Wall time between starting and finishing DNS probe.</summary>
</histogram>
-<histogram name="DnsProbe.ProbeDuration2" units="ms">
+<histogram name="DnsProbe.ProbeDuration2" units="ms" expires_after="M78">
<owner>pauljensen@chromium.org</owner>
<owner>mef@chromium.org</owner>
<summary>Time ticks between starting and finishing DNS probe.</summary>
@@ -28063,6 +29445,28 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="Download.InsecureBlocking.Extensions"
+ expires_after="M80">
+ <owner>jdeblasio@chromium.org</owner>
+ <owner>estark@chromium.org</owner>
+ <owner>cthomp@chromium.org</owner>
+ <summary>
+ Records file extension of download to support analysis for mixed content
+ file download blocking.
+ </summary>
+</histogram>
+
+<histogram name="Download.InsecureBlocking.Totals"
+ enum="InsecureDownloadSecurityStatus" expires_after="M80">
+ <owner>jdeblasio@chromium.org</owner>
+ <owner>estark@chromium.org</owner>
+ <owner>cthomp@chromium.org</owner>
+ <summary>
+ Records security state of downloads to support analysis for mixed content
+ file download blocking.
+ </summary>
+</histogram>
+
<histogram name="Download.InterruptedAtEndError" enum="NetErrorCodes">
<owner>dtrainor@chromium.org</owner>
<summary>
@@ -28282,7 +29686,7 @@ uploading your change for review.
</histogram>
<histogram name="Download.MaliciousDownloadClassified"
- enum="DownloadItem.DangerType">
+ enum="DownloadItem.DangerType" expires_after="M78">
<owner>dtrainor@chromium.org</owner>
<owner>felt@chromium.org</owner>
<summary>
@@ -28294,6 +29698,10 @@ uploading your change for review.
<histogram name="Download.MapErrorNetworkFailed" enum="NetErrorCodes"
expires_after="M77">
+ <obsolete>
+ Deprecated in 04/2019 after network service is enabled by default. Use
+ Download.MapErrorNetworkFailed.NetworkService instead.
+ </obsolete>
<owner>dtrainor@chromium.org</owner>
<summary>
Network error that produced a DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED
@@ -28301,6 +29709,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Download.MapErrorNetworkFailed.NetworkService"
+ enum="NetErrorCodes" expires_after="M78">
+ <owner>dtrainor@chromium.org</owner>
+ <owner>qinmin@chromium.org</owner>
+ <summary>
+ Network error that produced a DOWNLOAD_INTERRUPT_REASON_NETWORK_FAILED
+ result in DownloadResourceHandler::OnResponseCompleted(). Recorded when
+ running with the network service enabled.
+ </summary>
+</histogram>
+
<histogram name="Download.MapWinShErrorAccessDenied"
enum="SpecialShFileOperationCodes" expires_after="2018-08-14">
<obsolete>
@@ -28571,6 +29990,44 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Download.ResumptionComplete.HasStrongValidators"
+ enum="BooleanHasStrongValidators" expires_after="2020-01-30">
+ <owner>qinmin@chromium.org</owner>
+ <owner>xingliu@chromium.org</owner>
+ <summary>
+ Records whether strong validators are present when download completes.
+ </summary>
+</histogram>
+
+<histogram name="Download.ResumptionRestart.Counts"
+ enum="DownloadResumptionRestartCountType" expires_after="M79">
+ <owner>qinmin@chromium.org</owner>
+ <owner>xingliu@chromium.org</owner>
+ <summary>
+ Records counts related to download restarting from the beginning during
+ resumption.
+ </summary>
+</histogram>
+
+<histogram name="Download.ResumptionRestart.Reason" enum="InterruptReason"
+ expires_after="M79">
+ <owner>qinmin@chromium.org</owner>
+ <owner>xingliu@chromium.org</owner>
+ <summary>
+ Records the interrupt reason when download is restarting from the beginning
+ during resumption.
+ </summary>
+</histogram>
+
+<histogram name="Download.ResumptionStart.HasStrongValidators"
+ enum="BooleanHasStrongValidators" expires_after="2020-01-30">
+ <owner>qinmin@chromium.org</owner>
+ <owner>xingliu@chromium.org</owner>
+ <summary>
+ Records whether strong validators are present when download is resumed.
+ </summary>
+</histogram>
+
<histogram name="Download.SavePackage" enum="DownloadSavePackageEvent"
expires_after="M77">
<owner>dtrainor@chromium.org</owner>
@@ -28580,6 +30037,23 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Download.Service.Clients.InflatedFullBrowser"
+ enum="BooleanRequested" expires_after="2020-06-01">
+<!-- Name completed by histogram_suffixes
+ name="Download.Service.Client" -->
+
+ <owner>dtrainor@chromium.org</owner>
+ <owner>mheikal@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <summary>
+ The number of times full browser mode is requested to be loaded by a
+ DeferredClientWrapper. This is recorded when a DeferredClientWrapper needs
+ to inflate the underlying client while the browser is running in reduced
+ mode. DeferredClientWrapper inflates the underlying client for any
+ non-trivial method call on DeferredClientWrapper.
+ </summary>
+</histogram>
+
<histogram name="Download.Service.Db.Operation.Failure"
enum="Download.Service.ModelAction" expires_after="M77">
<owner>xingliu@chromium.org</owner>
@@ -28723,7 +30197,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram base="true" name="Download.Service.Finish.FileSize" units="KB">
+<histogram base="true" name="Download.Service.Finish.FileSize" units="KB"
+ expires_after="M78">
<!-- Name completed by histogram_suffixes
name="Download.Service.CompletionType" -->
@@ -28821,6 +30296,10 @@ uploading your change for review.
<histogram base="true" name="Download.Service.Request.StartResult"
enum="Download.Service.StartResult">
+ <obsolete>
+ Download client api no longer expects a repsponse from the client when a
+ download is started.
+ </obsolete>
<!-- Name completed by histogram_suffixes
name="Download.Service.Client" -->
@@ -30413,7 +31892,7 @@ uploading your change for review.
</histogram>
<histogram name="Enterprise.EnrollmentAttestationBased"
- enum="EnterpriseEnrollmentType">
+ enum="EnterpriseEnrollmentType" expires_after="M78">
<owner>drcrash@chromium.org</owner>
<summary>
Events related to attestation-based enrollment (Zero-Touch) of Chrome OS
@@ -30486,7 +31965,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Enterprise.EnrollmentRecovery" enum="EnterpriseEnrollmentType">
+<histogram name="Enterprise.EnrollmentRecovery" enum="EnterpriseEnrollmentType"
+ expires_after="M78">
<owner>tnagel@chromium.org</owner>
<summary>
Events related to Chrome OS enterprise enrollment recovery. Note that this
@@ -30560,6 +32040,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Enterprise.LockToSingleUserResult"
+ enum="LockToSingleUserResult" expires_after="M79">
+ <owner>emaxx@chromium.org</owner>
+ <owner>igorcov@chromium.org</owner>
+ <summary>
+ Chrome OS only. The result of D-Bus call to lock device to single user.
+ Estimated that till version M79 we should get enough stats to understand if
+ there are big problems with the D-Bus call.
+ </summary>
+</histogram>
+
<histogram
name="Enterprise.MachineLevelUserCloudPolicyEnrollment.InstallLevel_Win"
enum="BooleanIsSystemLevelInstall">
@@ -30630,6 +32121,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Enterprise.Policies.IgnoredByPolicyGroup"
+ enum="EnterprisePolicies" expires_after="M78">
+ <owner>ydago@chromium.org</owner>
+ <summary>
+ A set of enterprise policy rules that are ignored because they do not share
+ the highest priority from their policy atomic group. This is recorded at
+ startup, then every 24 hours. If chrome is not running at the 24 hours mark,
+ this will be recorded at the next startup.
+ </summary>
+</histogram>
+
<histogram name="Enterprise.Policy" enum="EnterprisePolicyType"
expires_after="2019-03-15">
<obsolete>
@@ -30642,6 +32144,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Enterprise.PolicyAtomicGroup.SourceConflicts"
+ enum="PolicyAtomicGroups" expires_after="M78">
+ <owner>ydago@chromium.org</owner>
+ <summary>
+ A set of policy atomic groups that have at least one policy disabled because
+ of its source. This is recorded at startup, then every 24 hours. If chrome
+ is not running at the 24 hours mark, this will be recorded at the next
+ startup.
+ </summary>
+</histogram>
+
<histogram name="Enterprise.PolicyHasVerifiedCachedKey"
enum="BooleanValidKeyExists" expires_after="M77">
<owner>atwilson@chromium.org</owner>
@@ -30872,7 +32385,7 @@ uploading your change for review.
<histogram
name="Enterprise.UserPolicyChromeOS.InitialFetch.DelayClientRegister"
- units="ms">
+ units="ms" expires_after="M78">
<owner>mnissler@chromium.org</owner>
<summary>Delay for registering the client with the policy server.</summary>
</histogram>
@@ -31126,7 +32639,7 @@ uploading your change for review.
</histogram>
<histogram name="EphemeralTab.CloseReason"
- enum="OverlayPanel.StateChangeReason" expires_after="M76">
+ enum="OverlayPanel.StateChangeReason" expires_after="M80">
<owner>donnd@chromium.org</owner>
<owner>jinsukkim@chromium.org</owner>
<summary>
@@ -31135,7 +32648,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="EphemeralTab.Ctr" enum="BooleanOpened" expires_after="M76">
+<histogram name="EphemeralTab.Ctr" enum="BooleanOpened" expires_after="M80">
<owner>donnd@chromium.org</owner>
<owner>jinsukkim@chromium.org</owner>
<summary>
@@ -31144,6 +32657,24 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="EphemeralTab.DurationOpened" units="ms" expires_after="M80">
+ <owner>donnd@chromium.org</owner>
+ <owner>jinsukkim@chromium.org</owner>
+ <summary>
+ Records the duration in milliseconds that the Ephemeral Tab was left open.
+ Recorded when the UX is hidden. Implemented for Android.
+ </summary>
+</histogram>
+
+<histogram name="EphemeralTab.DurationPeeked" units="ms" expires_after="M80">
+ <owner>donnd@chromium.org</owner>
+ <owner>jinsukkim@chromium.org</owner>
+ <summary>
+ Records the duration in milliseconds that the Ephemeral Tab was peeking.
+ Recorded when the UX is hidden. Implemented for Android.
+ </summary>
+</histogram>
+
<histogram name="Event.ActionAfterDoubleTapNoDelay" enum="ActionAfterDoubleTap"
expires_after="2017-06-26">
<obsolete>
@@ -31232,7 +32763,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Event.ClickNotFiredDueToDomManipulation" enum="BooleanHit">
+<histogram name="Event.ClickNotFiredDueToDomManipulation" enum="BooleanHit"
+ expires_after="M78">
<owner>nzolghadr@chromium.org</owner>
<summary>
Whether click target was affected by DOM manipulation or not.
@@ -31402,11 +32934,12 @@ uploading your change for review.
<histogram name="Event.DownEventCount.PerInputFormFactorDestinationCombination"
enum="DownEventInputFormFactorDestinationCombination" expires_after="M76">
- <owner>tbuckley@chromium.org</owner>
- <summary>
+ <obsolete>
Deprecated 02/2019 in favor of
Event.DownEventCount.PerInputFormFactorDestinationCombination2.
-
+ </obsolete>
+ <owner>tbuckley@chromium.org</owner>
+ <summary>
The number of down events received per input, form factor, and destination
combination.
@@ -31421,7 +32954,7 @@ uploading your change for review.
<histogram
name="Event.DownEventCount.PerInputFormFactorDestinationCombination2"
- enum="DownEventInputFormFactorDestinationCombination2" expires_after="M76">
+ enum="DownEventInputFormFactorDestinationCombination2" expires_after="M100">
<owner>tbuckley@chromium.org</owner>
<summary>
The number of down events received per destination, input and form factor
@@ -32423,7 +33956,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Event.Latency.QueueingTime.KeyPressDefaultAllowed" units="ms">
+<histogram name="Event.Latency.QueueingTime.KeyPressDefaultAllowed" units="ms"
+ expires_after="M78">
<owner>tdresser@chromium.org</owner>
<owner>input-dev@chromium.org</owner>
<summary>
@@ -32635,6 +34169,124 @@ uploading your change for review.
</summary>
</histogram>
+<histogram
+ name="Event.Latency.ScrollBegin.Scrollbar.BrowserNotifiedToBeforeGpuSwap2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between the display compositor receives the notification of the first
+ ScrollUpdate gesture event in a given scroll gesture event sequence with
+ scrollbar source induced renderer swap and GPU starts to swap. The name
+ contains BrowserNotified for consistency with the existing
+ ScrollBegin/ScrollUpdate metrics - historically the display compositor lived
+ in the browser process.
+
+ Team: input-dev@chromium.org.
+ </summary>
+</histogram>
+
+<histogram name="Event.Latency.ScrollBegin.Scrollbar.GpuSwap2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between gpu starts to swap the first ScrollUpdate gesture event in a
+ given scroll gesture event sequence with scrollbar source induced frame and
+ the swap finishes.
+
+ Team: input-dev@chromium.org.
+
+ Warning: This metric may include reports from clients with low-resolution
+ clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+ will cause this metric to have an abnormal distribution. When considering
+ revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
+ solution.
+ </summary>
+</histogram>
+
+<histogram name="Event.Latency.ScrollBegin.Scrollbar.HandledToRendererSwap2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between the first ScrollUpdate gesture event in a given scroll gesture
+ event sequence with scrollbar source, is handled on main/impl thread
+ (specified by suffix) and before renderer starts to swap.
+
+ Team: input-dev@chromium.org.
+
+ Warning: This metric may include reports from clients with low-resolution
+ clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+ will cause this metric to have an abnormal distribution. When considering
+ revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
+ solution.
+ </summary>
+</histogram>
+
+<histogram
+ name="Event.Latency.ScrollBegin.Scrollbar.RendererSwapToBrowserNotified2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between the renderer starts to swap a frame (generates compositor
+ frame) induced by the first ScrollUpdate gesture event in a given scroll
+ gesture event sequence with scrollbar source, and display compositor
+ receives the submitted compositor frame. The name contains BrowserNotified
+ for consistency with the existing ScrollBegin/ScrollUpdate metrics -
+ historically the display compositor lived in the browser process.
+
+ Team: input-dev@chromium.org.
+ </summary>
+</histogram>
+
+<histogram name="Event.Latency.ScrollBegin.Scrollbar.TimeToHandled2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between initial creation of a scrollbar event and the first generated
+ ScrollUpdate gesture event in a given scroll gesture event sequence is
+ handled on main/impl thread (specified by suffix). If no swap was induced by
+ the ScrollUpdate gesture event, no recording is made.
+
+ Team: input-dev@chromium.org.
+
+ Warning: This metric may include reports from clients with low-resolution
+ clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+ will cause this metric to have an abnormal distribution. When considering
+ revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
+ solution.
+ </summary>
+</histogram>
+
+<histogram
+ name="Event.Latency.ScrollBegin.Scrollbar.TimeToScrollUpdateSwapBegin4"
+ units="microseconds" expires_after="never">
+<!-- expires-never: "heartbeat" metric (internal: go/uma-heartbeats) -->
+
+ <owner>input-dev@chromium.org</owner>
+ <owner>speed-metrics-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between initial creation of an input event that resulted in a scrollbar
+ scroll and the start of the frame swap on the GPU service caused by the
+ generated ScrollUpdate gesture event if that ScrollUpdate is the first such
+ event in a given scroll gesture event sequence. If no swap was induced by
+ the event, no recording is made.
+
+ Do not modify this metric in any way without contacting
+ speed-metrics-dev@chromium.org.
+
+ Warning: This metric may include reports from clients with low-resolution
+ clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+ will cause this metric to have an abnormal distribution. When considering
+ revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
+ solution.
+ </summary>
+</histogram>
+
<histogram name="Event.Latency.ScrollBegin.TimeToScrollUpdateSwapBegin"
units="microseconds" expires_after="2018-06-12">
<obsolete>
@@ -32980,7 +34632,7 @@ uploading your change for review.
<histogram
name="Event.Latency.ScrollInertial.Touch.BrowserNotifiedToBeforeGpuSwap2"
- units="microseconds">
+ units="microseconds" expires_after="M78">
<owner>sahel@chromium.org</owner>
<summary>
Time between the browser receives the notification of a ScrollUpdate gesture
@@ -33016,7 +34668,7 @@ uploading your change for review.
<histogram
name="Event.Latency.ScrollInertial.Touch.RendererSwapToBrowserNotified2"
- units="microseconds">
+ units="microseconds" expires_after="M78">
<owner>sahel@chromium.org</owner>
<summary>
Time between the renderer starts to swap a frame induced by a ScrollUpdate
@@ -33148,6 +34800,122 @@ uploading your change for review.
</summary>
</histogram>
+<histogram
+ name="Event.Latency.ScrollUpdate.Scrollbar.BrowserNotifiedToBeforeGpuSwap2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between the display compositor receives the notification of the first
+ ScrollUpdate gesture event in a given scroll gesture event sequence with
+ scrollbar source induced renderer swap and GPU starts to swap. The name
+ contains BrowserNotified for consistency with the existing
+ ScrollBegin/ScrollUpdate metrics - historically the display compositor lived
+ in the browser process.
+
+ Team: input-dev@chromium.org.
+ </summary>
+</histogram>
+
+<histogram name="Event.Latency.ScrollUpdate.Scrollbar.GpuSwap2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between gpu starts to swap a ScrollUpdate gesture event with scrollbar
+ source induced frame and the swap finishes.
+
+ Team: input-dev@chromium.org.
+
+ Warning: This metric may include reports from clients with low-resolution
+ clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+ will cause this metric to have an abnormal distribution. When considering
+ revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
+ solution.
+ </summary>
+</histogram>
+
+<histogram name="Event.Latency.ScrollUpdate.Scrollbar.HandledToRendererSwap2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between the ScrollUpdate gesture event with scrollbar source, is
+ handled on main/impl thread (specified by suffix) and before renderer starts
+ to swap.
+
+ Team: input-dev@chromium.org.
+
+ Warning: This metric may include reports from clients with low-resolution
+ clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+ will cause this metric to have an abnormal distribution. When considering
+ revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
+ solution.
+ </summary>
+</histogram>
+
+<histogram
+ name="Event.Latency.ScrollUpdate.Scrollbar.RendererSwapToBrowserNotified2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between the renderer starts to swap a frame (generates compositor
+ frame) induced by the first ScrollUpdate gesture event in a given scroll
+ gesture event sequence with scrollbar source, and display compositor
+ receives the submitted compositor frame. The name contains BrowserNotified
+ for consistency with the existing ScrollBegin/ScrollUpdate metrics -
+ historically the display compositor lived in the browser process.
+
+ Team: input-dev@chromium.org.
+ </summary>
+</histogram>
+
+<histogram name="Event.Latency.ScrollUpdate.Scrollbar.TimeToHandled2"
+ units="microseconds">
+ <owner>input-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between initial creation of an input event that results in a scrollbar
+ scroll and the generated ScrollUpdate gesture event is handled on main/impl
+ thread (specified by suffix). If no swap was induced by the ScrollUpdate
+ gesture event, no recording is made.
+
+ Team: input-dev@chromium.org.
+
+ Warning: This metric may include reports from clients with low-resolution
+ clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+ will cause this metric to have an abnormal distribution. When considering
+ revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
+ solution.
+ </summary>
+</histogram>
+
+<histogram
+ name="Event.Latency.ScrollUpdate.Scrollbar.TimeToScrollUpdateSwapBegin4"
+ units="microseconds" expires_after="never">
+<!-- expires-never: "heartbeat" metric (internal: go/uma-heartbeats) -->
+
+ <owner>input-dev@chromium.org</owner>
+ <owner>speed-metrics-dev@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time between initial creation of a scrollbar event and start of the frame
+ swap on the GPU service caused by the generated ScrollUpdate gesture event.
+ If no swap was induced by the event, no recording is made. The first GSU of
+ every scrolling sequence is excluded from this metric.
+
+ Do not modify this metric in any way without contacting
+ speed-metrics-dev@chromium.org.
+
+ Warning: This metric may include reports from clients with low-resolution
+ clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
+ will cause this metric to have an abnormal distribution. When considering
+ revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
+ solution.
+ </summary>
+</histogram>
+
<histogram name="Event.Latency.ScrollUpdate.TimeToScrollUpdateSwapBegin"
units="microseconds" expires_after="2018-06-12">
<obsolete>
@@ -33191,6 +34959,48 @@ uploading your change for review.
</histogram>
<histogram
+ name="Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionNegative"
+ units="pixels" expires_after="M79">
+ <owner>eirage@chromium.org</owner>
+ <owner>nzolghadr@chromium.org</owner>
+ <summary>
+ Measures the negative impact on the AverageLag metric that is attributable
+ to scroll prediction. This value has the same units as
+ Event.Latency.ScrollUpdate.Touch.AverageLag but is a difference between that
+ value and what it would have been if prediction was disabled.
+
+ PredictionNegative is logged when prediction caused an increase in perceived
+ lag (i.e. the rendered position was on average further from the actual
+ location of the finger) for a given interaction/interval. The duration of
+ the interaction/interval is either 1s, or the time from when the user starts
+ scrolling to lifting the finger, whichever is smaller.
+
+ Team: input-dev@chromium.org.
+ </summary>
+</histogram>
+
+<histogram
+ name="Event.Latency.ScrollUpdate.Touch.AverageLag.PredictionPositive"
+ units="pixels" expires_after="M79">
+ <owner>eirage@chromium.org</owner>
+ <owner>nzolghadr@chromium.org</owner>
+ <summary>
+ Measures the positive impact on the AverageLag metric that is attributable
+ to scroll prediction. This value has the same units as
+ Event.Latency.ScrollUpdate.Touch.AverageLag but is a difference between that
+ value and what it would have been if prediction was disabled.
+
+ PredictionPostive is logged when prediction caused a decrease in perceived
+ lag (i.e. the rendered position was on average closer to the actual location
+ of the finger) for a given interaction/interval. The duration of the
+ interaction/interval is either 1s, or the time from when the user starts
+ scrolling to lifting the finger, whichever is smaller.
+
+ Team: input-dev@chromium.org.
+ </summary>
+</histogram>
+
+<histogram
name="Event.Latency.ScrollUpdate.Touch.BrowserNotifiedToBeforeGpuSwap2"
units="microseconds">
<owner>tdresser@chromium.org</owner>
@@ -33864,6 +35674,18 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Event.Scroll.TouchGestureLatency" units="ms"
+ expires_after="M79">
+ <owner>nzolghadr@chromium.org</owner>
+ <owner>dlibby@microsoft.com</owner>
+ <summary>
+ Time (ms) between the pointer down event and when a subsequent pointer move
+ is recognized as a scroll.
+
+ Team: input-dev@chromium.org
+ </summary>
+</histogram>
+
<histogram name="Event.SingleTapType" enum="TapDelayType">
<owner>tdresser@chromium.org</owner>
<summary>
@@ -35278,7 +37100,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Extensions.ApiTabUpdateJavascript" enum="Boolean">
+<histogram name="Extensions.ApiTabUpdateJavascript" enum="Boolean"
+ expires_after="M78">
<owner>dbertoni@chromium.org</owner>
<summary>
Reports whether a tab was updated to a javascript:-scheme URL from the
@@ -35548,7 +37371,7 @@ uploading your change for review.
<histogram name="Extensions.BookmarkApp.Icon.HttpStatusCodeClassOnCreate"
enum="HttpStatusCodeClass" expires_after="2020-01-01">
<obsolete>
- Deprecated 11/2018 in favor of WebApp.Icon.HttpStatusCodeClassOnCreate.
+ Removed 2018/11 in favor of WebApp.Icon.HttpStatusCodeClassOnCreate.
</obsolete>
<owner>alancutter@chromium.org</owner>
<owner>mgiuca@chromium.org</owner>
@@ -35559,7 +37382,10 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.BookmarkApp.Icon.HttpStatusCodeClassOnSync"
- enum="HttpStatusCodeClass">
+ enum="HttpStatusCodeClass" expires_after="2020-01-01">
+ <obsolete>
+ Removed 2019/05 in favor of WebApp.Icon.HttpStatusCodeClassOnSync.
+ </obsolete>
<owner>alancutter@chromium.org</owner>
<owner>mgiuca@chromium.org</owner>
<summary>
@@ -35620,7 +37446,7 @@ uploading your change for review.
<histogram
name="Extensions.BrowsingInstanceViolation.IsBackgroundSourceOrTarget"
- enum="ExtensionViewTypeIsBackground">
+ enum="ExtensionViewTypeIsBackground" expires_after="M78">
<owner>lukasza@chromium.org</owner>
<summary>
When an extension violates browsing instance boundaries, this metric records
@@ -35824,7 +37650,8 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.CorruptPolicyExtensionDetected2" enum="BooleanHit"
- expires_after="2019-05-31">
+ expires_after="2019-11-30">
+ <owner>burunduk@chromium.org</owner>
<owner>lazyboy@chromium.org</owner>
<owner>poromov@chromium.org</owner>
<owner>extensions-core@chromium.org</owner>
@@ -35836,7 +37663,8 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.CorruptPolicyExtensionResolved" units="ms"
- expires_after="2019-05-31">
+ expires_after="2019-11-30">
+ <owner>burunduk@chromium.org</owner>
<owner>lazyboy@chromium.org</owner>
<owner>extensions-core@chromium.org</owner>
<summary>
@@ -36191,7 +38019,7 @@ uploading your change for review.
<histogram
name="Extensions.DeclarativeWebRequest.WebViewRequestDeclarativeRules"
- enum="BooleanDeclarativeRules">
+ enum="BooleanDeclarativeRules" expires_after="M78">
<owner>karandeepb@chromium.org</owner>
<summary>
Whether a network request from a guest webview has any declarative web
@@ -36314,6 +38142,9 @@ uploading your change for review.
<histogram name="Extensions.DidSuppressJavaScriptException"
enum="ChromeChannelForHistogram" expires_after="2018-08-30">
+ <obsolete>
+ Expired 2018-08
+ </obsolete>
<owner>rdevlin.cronin@chromium.org</owner>
<summary>
Records the Chrome channel when JavaScript exceptions are not gracefully
@@ -36570,7 +38401,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Extensions.ExtensionCacheCount">
+<histogram name="Extensions.ExtensionCacheCount" expires_after="M78">
<owner>achuith@chromium.org</owner>
<summary>
Number of cached extensions on disk. Reported on Chrome OS during user
@@ -36587,6 +38418,9 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.ExtensionCreationTime" units="microseconds">
+ <obsolete>
+ Removed 2019-05.
+ </obsolete>
<owner>rdevlin.cronin@chromium.org</owner>
<summary>
The amount of time taken to create a single extension object. This includes
@@ -36875,8 +38709,23 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Extensions.ForceInstalledDownloadingStage"
+ enum="ExtensionInstallationDownloadingStage" expires_after="2019-11-01">
+ <owner>burunduk@chromium.org</owner>
+ <owner>poromov@chromium.org</owner>
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <summary>
+ The last known downloading stage of extension downloading process if failure
+ reason was not recorded and installing stage is DOWNLOADING, so it's
+ specification of Extensions.ForceInstalledStage. Recorded for each forced
+ extension that failed to install after 5 minutes. Recorded together with
+ &quot;Extensions.ForceInstalledTimedOutCount&quot; histogram, but for every
+ extension not installed at the moment.
+ </summary>
+</histogram>
+
<histogram name="Extensions.ForceInstalledFailureCrxInstallError"
- enum="ExtensionInstallationCrxInstallError" expires_after="2019-07-01">
+ enum="ExtensionInstallationCrxInstallError" expires_after="2019-11-01">
<owner>burunduk@chromium.org</owner>
<owner>poromov@chromium.org</owner>
<owner>rdevlin.cronin@chromium.org</owner>
@@ -36889,7 +38738,7 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.ForceInstalledFailureReason"
- enum="ExtensionInstallationFailureReason" expires_after="2019-07-01">
+ enum="ExtensionInstallationFailureReason" expires_after="2019-11-01">
<owner>burunduk@chromium.org</owner>
<owner>poromov@chromium.org</owner>
<owner>rdevlin.cronin@chromium.org</owner>
@@ -36902,7 +38751,7 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.ForceInstalledLoadTime" units="ms"
- expires_after="2019-07-01">
+ expires_after="2019-11-01">
<owner>poromov@chromium.org</owner>
<summary>
The amount of time elapsed during installation of enterprise policy forced
@@ -36911,7 +38760,7 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.ForceInstalledStage"
- enum="ExtensionInstallationStage" expires_after="2019-07-01">
+ enum="ExtensionInstallationStage" expires_after="2019-11-01">
<owner>burunduk@chromium.org</owner>
<owner>poromov@chromium.org</owner>
<owner>rdevlin.cronin@chromium.org</owner>
@@ -36926,7 +38775,7 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.ForceInstalledTimedOutAndNotInstalledCount"
- expires_after="2019-07-01">
+ expires_after="2019-11-01">
<owner>poromov@chromium.org</owner>
<summary>
Number of enterprise policy forced extensions that are not installed after 5
@@ -36935,7 +38784,7 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.ForceInstalledTimedOutCount"
- expires_after="2019-07-01">
+ expires_after="2019-11-01">
<owner>poromov@chromium.org</owner>
<summary>
Number of enterprise policy forced extensions that are not enabled after 5
@@ -36954,10 +38803,41 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.FunctionCalls" enum="ExtensionFunctions">
+ <obsolete>
+ Replaced by Extensions.Functions.ComponentExtensionCalls,
+ Extensions.Functions.ExtensionCalls, and Extensions.Functions.WebUICalls
+ 2019-05.
+ </obsolete>
<owner>rdevlin.cronin@chromium.org</owner>
<summary>Number of calls to extension functions.</summary>
</histogram>
+<histogram name="Extensions.Functions.ComponentExtensionCalls"
+ enum="ExtensionFunctions" expires_after="never">
+<!-- expires-never: Used for monitoring extension API usage. -->
+
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <owner>extensions-core@chromium.org</owner>
+ <summary>
+ Recorded when a component extension calls an extension API. Recorded once
+ per function call. See also Extensions.Functions.WebUICalls and
+ Extensions.Functions.ExtensionCalls.
+ </summary>
+</histogram>
+
+<histogram name="Extensions.Functions.ExtensionCalls" enum="ExtensionFunctions"
+ expires_after="never">
+<!-- expires-never: Used for monitoring extension API usage. -->
+
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <owner>extensions-core@chromium.org</owner>
+ <summary>
+ Recorded when a non-component extension calls an extension API. Recorded
+ once per function call. See also Extensions.Functions.WebUICalls and
+ Extensions.Functions.ComponentExtensionCalls.
+ </summary>
+</histogram>
+
<histogram name="Extensions.Functions.FailedTime" enum="ExtensionFunctions">
<owner>rdevlin.cronin@chromium.org</owner>
<summary>
@@ -37027,6 +38907,19 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Extensions.Functions.WebUICalls" enum="ExtensionFunctions"
+ expires_after="never">
+<!-- expires-never: Used for monitoring extension API usage. -->
+
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <owner>extensions-core@chromium.org</owner>
+ <summary>
+ Recorded when a WebUI context calls an extension API. Recorded once per
+ function call. See also Extensions.Functions.ComponentExtensionCalls and
+ Extensions.Functions.ExtensionCalls.
+ </summary>
+</histogram>
+
<histogram name="Extensions.GetUserDataTempDir" enum="GetUserDataTempDirResult"
expires_after="2016-04-29">
<obsolete>
@@ -37196,6 +39089,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Extensions.HomepageOverrides" expires_after="M85">
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <owner>kelvinjiang@chromium.org</owner>
+ <summary>
+ The number of enabled extensions with a homepage override specified in their
+ manifest. Recorded once per profile at profile initialization.
+ </summary>
+</histogram>
+
<histogram name="Extensions.HostedAppLaunchContainer" enum="AppLaunchContainer">
<owner>benwells@chromium.org</owner>
<summary>
@@ -37211,6 +39113,9 @@ uploading your change for review.
<histogram name="Extensions.HostedAppUnlimitedStoragePersistentStorageUsage"
units="KB" expires_after="2018-08-30">
+ <obsolete>
+ Expired 2018-08
+ </obsolete>
<owner>rdevlin.cronin@chromium.org</owner>
<summary>
The usage (in kilobytes) of persistent storage in a hosted app with the
@@ -37223,6 +39128,9 @@ uploading your change for review.
<histogram name="Extensions.HostedAppUnlimitedStorageTemporaryStorageUsage"
units="%" expires_after="2018-08-30">
+ <obsolete>
+ Expired 2018-08
+ </obsolete>
<owner>rdevlin.cronin@chromium.org</owner>
<summary>
The percentage of &quot;normal&quot; (that is, not unlimited) quota that a
@@ -37390,13 +39298,40 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.InstallPrompt.Accepted" enum="BooleanAccepted"
- expires_after="M77">
+ expires_after="2019-05-13">
+ <obsolete>
+ Obsolete as of 2019-05 as it can be derived by comparing the aggregate
+ counts of Extensions.InstallPrompt.TimeToInstall and
+ Extensions.InstallPrompt.TimeToInstall.
+ </obsolete>
<owner>meacer@chromium.org</owner>
<summary>
Whether the user accepted or aborted an extension installation.
</summary>
</histogram>
+<histogram name="Extensions.InstallPrompt.TimeToCancel" units="ms"
+ expires_after="M85">
+ <owner>kelvinjiang@chromium.org</owner>
+ <owner>extensions-core@chromium.org</owner>
+ <summary>
+ Time from first display of the extension installation prompt until the user
+ aborts the installation through clicking the cancel button or dismissing the
+ dialog.
+ </summary>
+</histogram>
+
+<histogram name="Extensions.InstallPrompt.TimeToInstall" units="ms"
+ expires_after="M85">
+ <owner>kelvinjiang@chromium.org</owner>
+ <owner>extensions-core@chromium.org</owner>
+ <summary>
+ Time from first display of the extension installation prompt until the user
+ accepts the installation. Will always be greater than 500ms as the install
+ option is enabled after that time has elapsed.
+ </summary>
+</histogram>
+
<histogram name="Extensions.InstallPrompt.Type"
enum="ExtensionInstallPromptType" expires_after="M77">
<owner>meacer@chromium.org</owner>
@@ -37615,7 +39550,7 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.LockedFullscreenStateRequest"
- enum="LockedFullscreenState" expires_after="2019-07-01">
+ enum="LockedFullscreenState" expires_after="2020-01-01">
<owner>isandrk@chromium.org</owner>
<owner>jhastings@chromium.org</owner>
<summary>
@@ -37798,7 +39733,7 @@ uploading your change for review.
<histogram name="Extensions.Messaging.IncludeChannelIdBehavior"
enum="ExtensionMessagingIncludeChannelIdBehavior"
- expires_after="2018-12-01">
+ expires_after="2019-12-01">
<owner>rdevlin.cronin@chromium.org</owner>
<owner>nharper@chromium.org</owner>
<summary>
@@ -37870,6 +39805,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Extensions.NewTabPageOverrides" expires_after="M85">
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <owner>kelvinjiang@chromium.org</owner>
+ <summary>
+ The number of enabled extensions with a New Tab Page override specified in
+ their manifest. Recorded once per profile at profile initialization.
+ </summary>
+</histogram>
+
<histogram name="Extensions.NonWebstoreLocation" enum="ExtensionLocation"
expires_after="M77">
<owner>rdevlin.cronin@chromium.org</owner>
@@ -38600,6 +40544,15 @@ uploading your change for review.
<summary>Length of the path under which a CRX is unpacked.</summary>
</histogram>
+<histogram name="Extensions.SearchEngineOverrides" expires_after="M85">
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <owner>kelvinjiang@chromium.org</owner>
+ <summary>
+ The number of enabled extensions with a search engine override specified in
+ their manifest. Recorded once per profile at profile initialization.
+ </summary>
+</histogram>
+
<histogram name="Extensions.SettingsQuotaExceeded.BytesPerSetting"
expires_after="2016-09-13">
<obsolete>
@@ -38678,6 +40631,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Extensions.StartupPagesOverrides" expires_after="M85">
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <owner>kelvinjiang@chromium.org</owner>
+ <summary>
+ The number of enabled extensions with startup page overrides specified in
+ their manifest. Recorded once per profile at profile initialization.
+ </summary>
+</histogram>
+
<histogram name="Extensions.StorageFrontendInitTime" units="ms"
expires_after="M77">
<owner>rkaplow@chromium.org</owner>
@@ -38706,6 +40668,9 @@ uploading your change for review.
<histogram name="Extensions.ThrottledNetworkRequests" units="requests"
expires_after="2018-08-30">
+ <obsolete>
+ Expired 2018-08.
+ </obsolete>
<owner>rdevlin.cronin@chromium.org</owner>
<summary>
The total number of network requests that were delayed by extension user
@@ -38964,7 +40929,9 @@ uploading your change for review.
</histogram>
<histogram name="Extensions.WebRequest.EventListenerFlag"
- enum="WebRequestEventListenerFlag" expires_after="2019-05-28">
+ enum="WebRequestEventListenerFlag" expires_after="never">
+<!-- expires-never: For monitoring Web Request API usage statistics. -->
+
<owner>karandeepb@chromium.org</owner>
<owner>rdevlin.cronin@chromium.org</owner>
<summary>
@@ -39047,8 +41014,80 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Extensions.WebRequest.RequestHeaderAdded"
+ enum="WebRequest.RequestHeader" expires_after="2019-10-31">
+ <owner>karandeepb@chromium.org</owner>
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <summary>
+ Records the request header added by extensions using the WebRequest API.
+ Recorded for each network request during the OnBeforeSendHeaders stage.
+ Multiple samples can be recorded per request.
+ </summary>
+</histogram>
+
+<histogram name="Extensions.WebRequest.RequestHeaderChanged"
+ enum="WebRequest.RequestHeader" expires_after="2019-10-31">
+ <owner>karandeepb@chromium.org</owner>
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <summary>
+ Records the request header modified by extensions using the WebRequest API.
+ Recorded for each network request during the OnBeforeSendHeaders stage.
+ Multiple samples can be recorded per request.
+ </summary>
+</histogram>
+
+<histogram name="Extensions.WebRequest.RequestHeaderRemoved"
+ enum="WebRequest.RequestHeader" expires_after="2019-10-31">
+ <owner>karandeepb@chromium.org</owner>
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <summary>
+ Records the request header removed by extensions using the WebRequest API.
+ Recorded for each network request during the OnBeforeSendHeaders stage.
+ Multiple samples can be recorded per request.
+ </summary>
+</histogram>
+
+<histogram name="Extensions.WebRequest.ResponseHeaderAdded"
+ enum="WebRequest.ResponseHeader" expires_after="2019-10-31">
+ <owner>karandeepb@chromium.org</owner>
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <summary>
+ Records the response header added by extensions using the WebRequest API.
+ This is logged for the cumulative delta across all the web request
+ extensions. Recorded for each network request during the OnHeadersReceived
+ stage. Multiple samples can be recorded per request.
+ </summary>
+</histogram>
+
+<histogram name="Extensions.WebRequest.ResponseHeaderChanged"
+ enum="WebRequest.ResponseHeader" expires_after="2019-10-31">
+ <owner>karandeepb@chromium.org</owner>
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <summary>
+ Records the response header modified by extensions using the WebRequest API.
+ This is logged for the cumulative delta across all the web request
+ extensions. Recorded for each network request during the OnHeadersReceived
+ stage. Multiple samples can be recorded per request.
+ </summary>
+</histogram>
+
+<histogram name="Extensions.WebRequest.ResponseHeaderRemoved"
+ enum="WebRequest.ResponseHeader" expires_after="2019-10-31">
+ <owner>karandeepb@chromium.org</owner>
+ <owner>rdevlin.cronin@chromium.org</owner>
+ <summary>
+ Records the response header removed by extensions using the WebRequest API.
+ This is logged for the cumulative delta across all the web request
+ extensions. Recorded for each network request during the OnHeadersReceived
+ stage. Multiple samples can be recorded per request.
+ </summary>
+</histogram>
+
<histogram name="Extensions.WebRequest.SetCookieResponseHeaderChanged"
enum="BooleanChanged" expires_after="M73">
+ <obsolete>
+ Removed May 2019.
+ </obsolete>
<owner>cduvall@chromium.org</owner>
<owner>karandeepb@chromium.org</owner>
<summary>
@@ -39064,6 +41103,9 @@ uploading your change for review.
<histogram name="Extensions.WebRequest.SetCookieResponseHeaderRemoved"
enum="BooleanRemoved" expires_after="M73">
+ <obsolete>
+ Removed May 2019.
+ </obsolete>
<owner>cduvall@chromium.org</owner>
<owner>karandeepb@chromium.org</owner>
<summary>
@@ -39096,6 +41138,9 @@ uploading your change for review.
<histogram name="Extensions.WebRequest.SpecialRequestHeadersChanged"
enum="WebRequestSpecialRequestHeaderModification" expires_after="M73">
+ <obsolete>
+ Removed April 2019.
+ </obsolete>
<owner>cduvall@chromium.org</owner>
<owner>karandeepb@chromium.org</owner>
<summary>
@@ -39112,6 +41157,9 @@ uploading your change for review.
<histogram name="Extensions.WebRequest.SpecialRequestHeadersRemoved"
enum="WebRequestSpecialRequestHeaderModification" expires_after="M73">
+ <obsolete>
+ Removed April 2019.
+ </obsolete>
<owner>cduvall@chromium.org</owner>
<owner>karandeepb@chromium.org</owner>
<summary>
@@ -39570,7 +41618,7 @@ uploading your change for review.
</histogram>
<histogram name="FCMInvalidations.FailedSubscriptionsErrorCode"
- enum="NetErrorCodes">
+ enum="NetErrorCodes" expires_after="M78">
<owner>melandory@chromium.org</owner>
<summary>Net error codes for failed subscription requests.</summary>
</histogram>
@@ -40777,7 +42825,7 @@ uploading your change for review.
</histogram>
<histogram name="FirstRun.NewUserExperience.NtpBackgroundInteraction"
- enum="NuxNtpBackgroundInteractions" expires_after="M76">
+ enum="NuxNtpBackgroundInteractions" expires_after="M77">
<owner>hcarmona@chromium.org</owner>
<owner>johntlee@chromium.org</owner>
<summary>
@@ -40790,7 +42838,7 @@ uploading your change for review.
</histogram>
<histogram name="FirstRun.NewUserExperience.NtpBackgroundLoadTime" units="ms"
- expires_after="M76">
+ expires_after="M77">
<owner>hcarmona@chromium.org</owner>
<owner>johntlee@chromium.org</owner>
<summary>
@@ -42113,6 +44161,53 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="GoogleUpdate.Notification.LaunchEvent"
+ enum="GoogleUpdateNotificationLaunchEvent" expires_after="2020-06-26">
+ <owner>xingliu@chromium.org</owner>
+ <summary>
+ (Android-only) Records events when try to launch the update work flow via an
+ update notification.
+ </summary>
+</histogram>
+
+<histogram name="GoogleUpdate.Result.Session" enum="BooleanSuccess"
+ expires_after="2019-11-30">
+<!-- Name completed by histogram_suffixes name="GoogleUpdate.Result.UpdateType" -->
+
+ <owner>dtrainor@chromium.org</owner>
+ <owner>nyquist@chromium.org</owner>
+ <summary>
+ (Android-only) Whether or not an update was successful when looking at the
+ Chrome version on the next session where there is no update in progress.
+ </summary>
+</histogram>
+
+<histogram name="GoogleUpdate.Result.TimeWindow" enum="BooleanSuccess"
+ expires_after="2019-11-30">
+<!-- Name completed by histogram_suffixes name="GoogleUpdate.Result.UpdateType" -->
+
+ <owner>dtrainor@chromium.org</owner>
+ <owner>nyquist@chromium.org</owner>
+ <summary>
+ (Android-only) Whether or not an update was successful within a specific
+ server-configured window of time (e.g. an update may not occur right after
+ the user attempts to start it, but if they update sometime in the next X
+ days, we can possibly attribute it to the update flow we started). An
+ example window value could be on the order of days (e.g. 2 days since an
+ update started).
+ </summary>
+</histogram>
+
+<histogram name="GoogleUpdate.StartingUpdateState"
+ enum="BooleanAlreadyUpdating" expires_after="2019-11-30">
+ <owner>dtrainor@chromium.org</owner>
+ <owner>nyquist@chromium.org</owner>
+ <summary>
+ (Android-only) Whether or not an update was being tracked as 'in progress'
+ when another update was started.
+ </summary>
+</histogram>
+
<histogram name="GoogleUpdate.StartUp.State" enum="UpdateState"
expires_after="2019-10-30">
<owner>dtrainor@chromium.org</owner>
@@ -42727,6 +44822,19 @@ uploading your change for review.
</histogram>
<histogram name="GPU.DirectComposition.OverlayFormatUsed2" enum="OverlayFormat"
+ expires_after="2019-05-31">
+ <obsolete>
+ Deprecated 5/2019. Replaced by GPU.DirectComposition.OverlayFormatUsed3.
+ </obsolete>
+ <owner>sunnyps@chromium.org</owner>
+ <owner>zmo@chromium.org</owner>
+ <summary>
+ Which overlay format was chosen for YUV overlays. Recorded once per GPU
+ process launch only if hardware overlays are supported.
+ </summary>
+</histogram>
+
+<histogram name="GPU.DirectComposition.OverlayFormatUsed3" enum="DXGI_FORMAT"
expires_after="2020-12-31">
<owner>sunnyps@chromium.org</owner>
<owner>zmo@chromium.org</owner>
@@ -42882,6 +44990,18 @@ uploading your change for review.
</histogram>
<histogram name="GPU.DirectComposition.SwapChainFormat2" enum="OverlayFormat"
+ expires_after="2019-05-31">
+ <obsolete>
+ Deprecated 5/2019. Replaced by GPU.DirectComposition.SwapChainFormatUsed3.
+ </obsolete>
+ <owner>sunnyps@chromium.org</owner>
+ <owner>zmo@chromium.org</owner>
+ <summary>
+ What format was used for each overlay swap chain on each swap buffers.
+ </summary>
+</histogram>
+
+<histogram name="GPU.DirectComposition.SwapChainFormat3" enum="DXGI_FORMAT"
expires_after="2020-12-31">
<owner>sunnyps@chromium.org</owner>
<owner>zmo@chromium.org</owner>
@@ -42973,8 +45093,10 @@ uploading your change for review.
<summary>The error states generated by OpenGL calls.</summary>
</histogram>
-<histogram base="true" name="GPU.EstablishGpuChannelDuration" units="ms"
- expires_after="M75">
+<histogram base="true" name="GPU.EstablishGpuChannelDuration" units="ms">
+ <obsolete>
+ Expired in M75.
+ </obsolete>
<owner>kylechar@chromium.org</owner>
<summary>
The duration from when a request to establish a GPU channel arrives in
@@ -43000,7 +45122,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="GPU.GpuGeneration" enum="GpuSeriesType" expires_after="M75">
+<histogram name="GPU.GpuGeneration" enum="GpuSeriesType" expires_after="M90">
<owner>sunnyps@chromium.org</owner>
<owner>zmo@chromium.org</owner>
<summary>
@@ -43760,14 +45882,39 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="GwpAsan.AllocatorOom.Malloc" units="allocations"
+ expires_after="M80">
+ <owner>vtsyrklevich@chromium.org</owner>
+ <owner>dynamic-tools@google.com</owner>
+ <summary>
+ Reports how many allocations it took for malloc GWP-ASan to OOM. Reported
+ the first time the allocator fails to consecutively allocate
+ GuardedPageAllocator::kOutOfMemoryCount allocations in a row.
+ </summary>
+</histogram>
+
+<histogram base="true" name="GwpAsan.AllocatorOom.PartitionAlloc"
+ units="allocations" expires_after="M80">
+ <owner>vtsyrklevich@chromium.org</owner>
+ <owner>dynamic-tools@google.com</owner>
+ <summary>
+ Reports how many allocations it took for PartitionAlloc GWP-ASan to OOM.
+ Reported the first time the allocator fails to consecutively allocate
+ GuardedPageAllocator::kOutOfMemoryCount allocations in a row.
+ </summary>
+</histogram>
+
<histogram name="GwpAsan.CrashAnalysisResult" enum="GwpAsanCrashAnalysisResult"
- expires_after="M76">
+ expires_after="M80">
<owner>vtsyrklevich@chromium.org</owner>
<owner>dynamic-tools@google.com</owner>
<summary>
Reports the GWP-ASan crash analysis result. That can either be a
determination that the crash was related to GWP-ASan, not related to
GWP-ASan, or an error making that determination. Recorded with every crash.
+
+ Deprecated in favor of GwpAsan.CrashAnalysisResult.Malloc and
+ GwpAsan.CrashAnalysisResult.PartitionAlloc in M76
</summary>
</histogram>
@@ -43828,6 +45975,52 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="HeapProfiling.ProfiledProcess.Type"
+ enum="HeapProfilingProcessType" expires_after="M77">
+ <owner>erikchen@chromium.org</owner>
+ <summary>
+ One metric is emitted every 24-hours after Chrome is launched for every
+ process that is being profiled. The timer is reset if Chrome exits.
+ </summary>
+</histogram>
+
+<histogram name="HeapProfiling.ProfilingMode" enum="HeapProfilingMode"
+ expires_after="M77">
+ <owner>erikchen@chromium.org</owner>
+ <summary>
+ One metric is emitted every 24-hours after Chrome is launched for every
+ Chrome instance that is using out of process heap profiling. The timer is
+ reset if Chrome exits.
+ </summary>
+</histogram>
+
+<histogram name="HeapProfiling.RecordTrace.Success" enum="BooleanSuccess"
+ expires_after="M77">
+ <owner>erikchen@chromium.org</owner>
+ <summary>
+ The metric is emitted each time Chrome attempts to record a memory-infra
+ trace to upload an out-of-process heap-profiling memory dump.
+ </summary>
+</histogram>
+
+<histogram name="HeapProfiling.UploadTrace.Size" units="bytes"
+ expires_after="M77">
+ <owner>erikchen@chromium.org</owner>
+ <summary>
+ The metric is emitted each time Chrome uploads a trace. It reflects the
+ uncompressed size of the trace.
+ </summary>
+</histogram>
+
+<histogram name="HeapProfiling.UploadTrace.Success" enum="BooleanSuccess"
+ expires_after="M77">
+ <owner>erikchen@chromium.org</owner>
+ <summary>
+ The metric is emitted each time Chrome uploads a trace. It reflects whether
+ the upload was successful.
+ </summary>
+</histogram>
+
<histogram name="HeavyPageCapping.BlacklistReason" enum="OptOutBlacklistReason"
expires_after="M75">
<obsolete>
@@ -43887,7 +46080,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="HIDDetection.TimesDialogShownPerOOBECompleted">
+<histogram name="HIDDetection.TimesDialogShownPerOOBECompleted"
+ expires_after="M78">
<owner>alemate@chromium.org</owner>
<summary>
Records number of times the dialog was shown by the time OOBE is completed.
@@ -44843,11 +47037,42 @@ uploading your change for review.
</histogram>
<histogram name="HistoryPage.OtherDevicesMenu" enum="OtherSessionsActions">
- <owner>mad@chromium.org</owner>
<owner>rpop@google.com</owner>
<summary>
Histogram for usage of the section in the history page that allows the user
to access tabs from other devices.
+
+ OtherSessionsActions.OPENED_LINK_VIA_CONTEXT_MENU was added for M-76.
+ </summary>
+</histogram>
+
+<histogram name="HistoryPage.OtherDevicesMenu.OpenAll.TabsPerWindow"
+ expires_after="M80">
+ <owner>dbeam@chromium.org</owner>
+ <summary>
+ The number of tabs created in each window when a user executes &quot;Open
+ all&quot; menu item from a session menu in the &quot;Tabs from other
+ devices&quot; section of the history page.
+ </summary>
+</histogram>
+
+<histogram name="HistoryPage.OtherDevicesMenu.OpenAll.TotalTabs"
+ expires_after="M80">
+ <owner>dbeam@chromium.org</owner>
+ <summary>
+ Total number of tabs opened when a user executes &quot;Open all&quot; menu
+ item from a session menu in the &quot;Tabs from other devices&quot; section
+ of the history page.
+ </summary>
+</histogram>
+
+<histogram name="HistoryPage.OtherDevicesMenu.OpenAll.TotalWindows"
+ expires_after="M80">
+ <owner>dbeam@chromium.org</owner>
+ <summary>
+ Total number of windows opened when a user executes &quot;Open all&quot;
+ menu item from a session menu in the &quot;Tabs from other devices&quot;
+ section of the history page.
</summary>
</histogram>
@@ -45227,7 +47452,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.CacheHit"
- enum="BooleanCacheHit" expires_after="2019-06-04">
+ enum="BooleanCacheHit" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45238,7 +47463,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.ClientResult"
- enum="ImageAnnotationServiceClientResult" expires_after="2019-06-04">
+ enum="ImageAnnotationServiceClientResult" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45248,7 +47473,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="ImageAnnotationService.AccessibilityV1.Confidence"
- units="%" expires_after="2019-06-04">
+ units="%" expires_after="2019-07-30">
<!-- Name completed by histogram_suffixes name="ImageAnnotationServiceAnnotationType" -->
<owner>amoylan@chromium.org</owner>
@@ -45261,7 +47486,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.DescType"
- enum="ImageAnnotationServiceDescType" expires_after="2019-06-04">
+ enum="ImageAnnotationServiceDescType" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45271,7 +47496,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="ImageAnnotationService.AccessibilityV1.Empty"
- enum="BooleanEmpty" expires_after="2019-06-04">
+ enum="BooleanEmpty" expires_after="2019-07-30">
<!-- Name completed by histogram_suffixes name="ImageAnnotationServiceAnnotationType" -->
<owner>amoylan@chromium.org</owner>
@@ -45285,7 +47510,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.EncodedJpegSizeKB"
- units="KB" expires_after="2019-06-04">
+ units="KB" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45295,7 +47520,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.EngineKnown"
- enum="BooleanKnown" expires_after="2019-06-04">
+ enum="BooleanKnown" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45306,7 +47531,7 @@ uploading your change for review.
<histogram
name="ImageAnnotationService.AccessibilityV1.ImageRequestIncludesDesc"
- enum="BooleanIncluded" expires_after="2019-06-04">
+ enum="BooleanIncluded" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45320,7 +47545,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.JsonParseSuccess"
- enum="BooleanSuccess" expires_after="2019-06-04">
+ enum="BooleanSuccess" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45330,7 +47555,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.PixelFetchSuccess"
- enum="BooleanSuccess" expires_after="2019-06-04">
+ enum="BooleanSuccess" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45341,7 +47566,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.ServerHttpResponseCode"
- enum="HttpResponseCode" expires_after="2019-06-04">
+ enum="HttpResponseCode" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45351,7 +47576,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.ServerLatencyMs"
- units="ms" expires_after="2019-06-04">
+ units="ms" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45361,7 +47586,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.ServerNetError"
- enum="NetErrorCodes" expires_after="2019-06-04">
+ enum="NetErrorCodes" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45371,7 +47596,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.ServerRequestSizeKB"
- units="KB" expires_after="2019-06-04">
+ units="KB" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45383,7 +47608,7 @@ uploading your change for review.
<histogram
name="ImageAnnotationService.AccessibilityV1.ServerResponseSizeBytes"
- units="bytes" expires_after="2019-06-04">
+ units="bytes" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45393,7 +47618,7 @@ uploading your change for review.
</histogram>
<histogram name="ImageAnnotationService.AccessibilityV1.SourcePixelCount"
- units="pixels" expires_after="2019-06-04">
+ units="pixels" expires_after="2019-07-30">
<owner>amoylan@chromium.org</owner>
<owner>martis@chromium.org</owner>
<summary>
@@ -45404,7 +47629,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="ImageAnnotationService.AccessibilityV1.Status"
- enum="GoogleRpcCode" expires_after="2019-06-04">
+ enum="GoogleRpcCode" expires_after="2019-07-30">
<!-- Name completed by histogram_suffixes name="ImageAnnotationServiceAnnotationType" -->
<owner>amoylan@chromium.org</owner>
@@ -45945,6 +48170,16 @@ uploading your change for review.
<summary>The number of characters committed with composition text.</summary>
</histogram>
+<histogram name="InputMethod.CompositionWithImm32BasedIme" enum="Boolean"
+ expires_after="M78">
+ <owner>siliu@microsoft.com</owner>
+ <owner>lanwei@chromium.org</owner>
+ <summary>
+ Whether the composition is composed by IMM32-based input method processor
+ when TSF is disabled on Windows. Recorded when user starts new composition.
+ </summary>
+</histogram>
+
<histogram name="InputMethod.ID" enum="InputMethodID"
expires_after="2015-07-16">
<obsolete>
@@ -45998,6 +48233,12 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="InputMethod.ModeChangeKeyAction" enum="ModeChangeKeyAction"
+ expires_after="2019-12-31">
+ <owner>essential-inputs-team@google.com</owner>
+ <summary>The result of the user pressing the mode change key.</summary>
+</histogram>
+
<histogram name="InputMethod.Mojo.Extension.ActivateIMELatency" units="ms"
expires_after="2019-06-30">
<owner>googleo@chromium.org</owner>
@@ -46038,7 +48279,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="InputMethod.PkCommit.Index">
+<histogram name="InputMethod.PkCommit.Index" expires_after="M78">
<owner>shuchen@chromium.org</owner>
<summary>
The suggestion index (1-based) of the suggestion list item which user
@@ -48372,6 +50613,9 @@ uploading your change for review.
<histogram name="IOS.TabGridMediator.DidDetachNilWebStateList"
enum="BooleanNil" expires_after="2019-05-01">
+ <obsolete>
+ Deprecated 2019-04.
+ </obsolete>
<owner>edchin@chromium.org</owner>
<owner>marq@chromium.org</owner>
<summary>
@@ -48387,6 +50631,9 @@ uploading your change for review.
<histogram name="IOS.TabGridMediator.GetActiveTabIDNilWebStateList"
enum="BooleanNil" expires_after="2019-05-01">
+ <obsolete>
+ Deprecated 2019-04.
+ </obsolete>
<owner>edchin@chromium.org</owner>
<owner>marq@chromium.org</owner>
<summary>
@@ -48533,7 +50780,7 @@ uploading your change for review.
<histogram
name="JSDialogs.FineTiming.TimeBetweenDialogClosedAndNextDialogCreated"
- units="ms">
+ units="ms" expires_after="M78">
<owner>joenotcharles@chromium.org</owner>
<summary>
Fine-grained (in msec) time between closing a Javascript dialog and opening
@@ -48543,7 +50790,7 @@ uploading your change for review.
<histogram
name="JSDialogs.FineTiming.TimeBetweenDialogCreatedAndNextDialogCreated"
- units="ms">
+ units="ms" expires_after="M78">
<owner>joenotcharles@chromium.org</owner>
<summary>
Fine-grained (in msec) time between opening a Javascript dialog and opening
@@ -48553,7 +50800,7 @@ uploading your change for review.
<histogram
name="JSDialogs.FineTiming.TimeBetweenDialogCreatedAndSameDialogClosed"
- units="ms">
+ units="ms" expires_after="M78">
<owner>joenotcharles@chromium.org</owner>
<summary>
Fine-grained (in msec) time between opening a Javascript dialog and closing
@@ -48759,6 +51006,39 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="KioskNextHome.Bridge.Action" enum="KioskNextHomeBridgeAction"
+ expires_after="2019-12-31">
+ <owner>brunoad@chromium.org</owner>
+ <owner>maroun@chromium.org</owner>
+ <owner>michaelpg@chromium.org</owner>
+ <summary>
+ Records usage of methods in KioskNextHome Mojo bridge. Recorded on every
+ method invocation.
+ </summary>
+</histogram>
+
+<histogram name="KioskNextHome.Bridge.GetAndroidIdSuccess"
+ enum="BooleanSuccess" expires_after="2019-12-31">
+ <owner>brunoad@chromium.org</owner>
+ <owner>maroun@chromium.org</owner>
+ <owner>michaelpg@chromium.org</owner>
+ <summary>
+ Records the result (success or failure) of every call from KioskNextHome
+ bridge to get the Android id.
+ </summary>
+</histogram>
+
+<histogram name="KioskNextHome.Bridge.LaunchIntentResult"
+ enum="KioskNextHomeLaunchIntentResult" expires_after="2019-12-31">
+ <owner>brunoad@chromium.org</owner>
+ <owner>maroun@chromium.org</owner>
+ <owner>michaelpg@chromium.org</owner>
+ <summary>
+ Records the result (success or error reason) of every call from
+ KioskNextHome bridge to launch an intent.
+ </summary>
+</histogram>
+
<histogram base="true" name="KioskNextHome.StateTransition.AnimationSmoothness"
units="%" expires_after="2019-12-31">
<!-- Name completed by histogram_suffixes name="EnterOrExitOverview" -->
@@ -48774,6 +51054,22 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="KioskNextShell.EnabledState" enum="BooleanEnabled"
+ expires_after="2019-12-31">
+ <owner>brunoad@chromium.org</owner>
+ <owner>maroun@chromium.org</owner>
+ <owner>michaelpg@chromium.org</owner>
+ <summary>Records when KioskNextShell becomes enabled or disabled.</summary>
+</histogram>
+
+<histogram name="KioskNextShell.Launched" enum="Boolean"
+ expires_after="2019-12-31">
+ <owner>brunoad@chromium.org</owner>
+ <owner>maroun@chromium.org</owner>
+ <owner>michaelpg@chromium.org</owner>
+ <summary>Records launches of KioskNextShell. Only true is recorded.</summary>
+</histogram>
+
<histogram name="LanguageSettings.Actions" enum="LanguageSettingsActionType">
<owner>googleo@chromium.org</owner>
<summary>
@@ -48863,6 +51159,9 @@ uploading your change for review.
</histogram>
<histogram name="Launch.MashService" enum="MashService">
+ <obsolete>
+ Deprecated 2019-05 -- removed as part of removing mash code
+ </obsolete>
<owner>jamescook@chromium.org</owner>
<summary>
Records when a mojo ash UI service is started, for example the mojo app
@@ -49870,6 +52169,14 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Login.SessionExitType" enum="LoginSessionExitType">
+ <owner>iby@chromium.org</owner>
+ <summary>
+ Tracks whether a ChromeOS user was logged out because Chrome repeatedly
+ crashed.
+ </summary>
+</histogram>
+
<histogram name="Login.StateKeyGenerationStatus"
enum="LoginStateKeyGenerationStatus" expires_after="M77">
<owner>mnissler@chromium.org</owner>
@@ -49945,7 +52252,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="MachineLearningService.CpuTimeMicrosec"
- units="microseconds">
+ units="microseconds" expires_after="2020-02-01">
<!-- Name completed by histogram_suffixes
name="MachineLearningServiceRequests" -->
@@ -49957,7 +52264,8 @@ uploading your change for review.
</histogram>
<histogram name="MachineLearningService.CpuUsageMilliPercent"
- units="1/1000ths of %" expires_after="2019-07-01">
+ units="1/1000ths of %" expires_after="2020-02-01">
+ <owner>alanlxl@chromium.org</owner>
<owner>amoylan@chromium.org</owner>
<summary>
Fraction of total CPU resources used by Chrome OS ML Service, sampled every
@@ -49966,7 +52274,8 @@ uploading your change for review.
</histogram>
<histogram name="MachineLearningService.CreateGraphExecutorResult.Event"
- enum="MachineLearningServiceCreateGraphExecutorResultEvent">
+ enum="MachineLearningServiceCreateGraphExecutorResultEvent"
+ expires_after="2020-02-01">
<owner>amoylan@chromium.org</owner>
<owner>alanlxl@chromium.org</owner>
<summary>
@@ -49975,7 +52284,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="MachineLearningService.ElapsedTimeMicrosec"
- units="microseconds">
+ units="microseconds" expires_after="2020-02-01">
<!-- Name completed by histogram_suffixes
name="MachineLearningServiceRequests" -->
@@ -49985,7 +52294,7 @@ uploading your change for review.
</histogram>
<histogram name="MachineLearningService.ExecuteResult.Event"
- enum="MachineLearningServiceExecuteResultEvent">
+ enum="MachineLearningServiceExecuteResultEvent" expires_after="2020-02-01">
<owner>amoylan@chromium.org</owner>
<owner>alanlxl@chromium.org</owner>
<summary>
@@ -49994,7 +52303,8 @@ uploading your change for review.
</histogram>
<histogram name="MachineLearningService.LoadModelResult.Event"
- enum="MachineLearningServiceLoadModelResultEvent">
+ enum="MachineLearningServiceLoadModelResultEvent"
+ expires_after="2020-02-01">
<owner>amoylan@chromium.org</owner>
<owner>alanlxl@chromium.org</owner>
<summary>
@@ -50003,7 +52313,8 @@ uploading your change for review.
</histogram>
<histogram name="MachineLearningService.MojoConnectionEvent"
- enum="MachineLearningServiceMojoConnectionEvent" expires_after="2019-07-01">
+ enum="MachineLearningServiceMojoConnectionEvent" expires_after="2020-02-01">
+ <owner>alanlxl@chromium.org</owner>
<owner>amoylan@chromium.org</owner>
<summary>
Events related to the connection and disconnection of the Mojo IPC channel
@@ -50012,7 +52323,8 @@ uploading your change for review.
</histogram>
<histogram name="MachineLearningService.PeakPrivateMemoryKb" units="KB"
- expires_after="2019-07-01">
+ expires_after="2020-02-01">
+ <owner>alanlxl@chromium.org</owner>
<owner>amoylan@chromium.org</owner>
<summary>
Peak private (non-shared) memory used by Chrome OS ML Service over the last
@@ -50021,7 +52333,7 @@ uploading your change for review.
</histogram>
<histogram base="true" name="MachineLearningService.PrivateMemoryDeltaKb"
- units="KB">
+ units="KB" expires_after="2020-02-01">
<!-- Name completed by histogram_suffixes
name="MachineLearningServiceRequests" -->
@@ -50033,7 +52345,8 @@ uploading your change for review.
</histogram>
<histogram name="MachineLearningService.PrivateMemoryKb" units="KB"
- expires_after="2019-07-01">
+ expires_after="2020-02-01">
+ <owner>alanlxl@chromium.org</owner>
<owner>amoylan@chromium.org</owner>
<summary>
Private (non-shared) memory used by Chrome OS ML Service, sampled every 5
@@ -50063,7 +52376,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ManagedUsers.KidsManagementClassifyUrlFailureDelay" units="ms">
+<histogram name="ManagedUsers.KidsManagementClassifyUrlFailureDelay" units="ms"
+ expires_after="M78">
<owner>escordeiro@chromium.org</owner>
<owner>unichrome-eng@google.com</owner>
<summary>
@@ -50074,7 +52388,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ManagedUsers.KidsManagementClassifyUrlSuccessDelay" units="ms">
+<histogram name="ManagedUsers.KidsManagementClassifyUrlSuccessDelay" units="ms"
+ expires_after="M78">
<owner>escordeiro@chromium.org</owner>
<owner>unichrome-eng@google.com</owner>
<summary>
@@ -50086,7 +52401,7 @@ uploading your change for review.
</histogram>
<histogram name="ManagedUsers.KidsManagementUrlCheckerResponseStatus"
- enum="KidsManagementURLCheckerResponseStatus">
+ enum="KidsManagementURLCheckerResponseStatus" expires_after="M78">
<owner>escordeiro@chromium.org</owner>
<owner>unichrome-eng@google.com</owner>
<summary>
@@ -50448,6 +52763,9 @@ uploading your change for review.
<histogram name="Media.Audio.Bitstream" enum="BooleanSupported"
expires_after="2019-07-31">
+ <obsolete>
+ Removed as of May 2019.
+ </obsolete>
<!-- Name completed by histogram_suffixes name="BitstreamAudioFormats" -->
<owner>dalecurtis@chromium.org</owner>
@@ -51333,10 +53651,9 @@ uploading your change for review.
</histogram>
<histogram name="Media.Audio.Render.StreamBrokerDisconnectReason2"
- enum="AudioOutputStreamDisconnectReason2" expires_after="2019-06-01">
- <owner>jonasolsson@chromium.org</owner>
- <owner>maxmorin@chromium.org</owner>
+ enum="AudioOutputStreamDisconnectReason2" expires_after="2019-09-01">
<owner>olka@chromium.org</owner>
+ <owner>maxmorin@chromium.org</owner>
<summary>
Describes why and in which state an audio output stream ended.
</summary>
@@ -51344,7 +53661,7 @@ uploading your change for review.
<histogram
name="Media.Audio.Render.StreamBrokerDocumentDestroyedAwaitingCreatedTime"
- units="ms" expires_after="2019-06-01">
+ units="ms" expires_after="2019-09-01">
<owner>olka@chromium.org</owner>
<owner>marinaciocea@chromium.org</owner>
<owner>maxmorin@chromium.org</owner>
@@ -51356,7 +53673,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.Audio.Render.StreamBrokerStreamCreationTime" units="ms"
- expires_after="2019-06-01">
+ expires_after="2019-09-01">
<owner>olka@chromium.org</owner>
<owner>marinaciocea@chromium.org</owner>
<owner>maxmorin@chromium.org</owner>
@@ -51379,7 +53696,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.Audio.Render.StreamCallbackError2"
- enum="AudioRenderDeviceError" expires_after="2019-06-01">
+ enum="AudioRenderDeviceError" expires_after="2020-02-01">
<owner>maxmorin@chromium.org</owner>
<summary>
When AudioOutputDevice is stopped, this stat is recorded with whether an
@@ -51423,7 +53740,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.Audio.TrackAudioRenderer.DeviceStatus"
- enum="OutputDeviceStatus" expires_after="2019-06-01">
+ enum="OutputDeviceStatus" expires_after="2019-09-01">
<owner>olka@chromium.org</owner>
<owner>maxmorin@chromium.org</owner>
<summary>
@@ -51433,7 +53750,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.Audio.TrackAudioRenderer.SwitchDeviceStatus"
- enum="OutputDeviceStatus" expires_after="2019-06-01">
+ enum="OutputDeviceStatus" expires_after="2019-09-01">
<owner>olka@chromium.org</owner>
<owner>maxmorin@chromium.org</owner>
<summary>
@@ -51456,7 +53773,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.Audio.WebRTCAudioRenderer.DeviceStatus"
- enum="OutputDeviceStatus" expires_after="2019-06-01">
+ enum="OutputDeviceStatus" expires_after="2019-09-01">
<owner>olka@chromium.org</owner>
<owner>maxmorin@chromium.org</owner>
<summary>
@@ -51466,7 +53783,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.Audio.WebRTCAudioRenderer.SwitchDeviceStatus"
- enum="OutputDeviceStatus" expires_after="2019-06-01">
+ enum="OutputDeviceStatus" expires_after="2019-09-01">
<owner>olka@chromium.org</owner>
<owner>maxmorin@chromium.org</owner>
<summary>
@@ -51592,7 +53909,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.AudioOutputController.LifeTime" units="ms"
- expires_after="2019-06-01">
+ expires_after="2019-09-01">
<owner>olka@chromium.org</owner>
<owner>marinaciocea@chromium.org</owner>
<owner>maxmorin@chromium.org</owner>
@@ -52168,7 +54485,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.CodecImage.ImageReaderGLOwner.WaitTimeForFrame"
- units="ms">
+ units="ms" expires_after="M78">
<owner>vikassoni@chromium.org</owner>
<summary>
Time spent waiting for a frame to become available in a Non Overlay
@@ -52188,7 +54505,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.CodecImage.SurfaceTextureGLOwner.WaitTimeForFrame"
- units="ms">
+ units="ms" expires_after="M78">
<owner>liberato@chromium.org</owner>
<summary>
Time spent waiting for a frame to become available in a Non Overlay
@@ -52706,6 +55023,39 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Media.EME.MediaDrm.GetOriginIdResult" enum="GetOriginIdResult"
+ expires_after="M90">
+ <owner>jrummell@chromium.org</owner>
+ <owner>media-dev@chromium.org</owner>
+ <summary>
+ The status of every attempt to obtain a pre-provisioned origin ID to be used
+ by MediaDrm. This will only be reported for applications that use
+ MediaDrmOriginIdManager.
+ </summary>
+</histogram>
+
+<histogram
+ name="Media.EME.MediaDrm.PreprovisionedOriginId.NonPerAppProvisioningDevice"
+ expires_after="M90">
+ <owner>jrummell@chromium.org</owner>
+ <owner>media-dev@chromium.org</owner>
+ <summary>
+ The number of pre-provisioned origin IDs available shortly after startup on
+ devices that do not support per-application provisioning.
+ </summary>
+</histogram>
+
+<histogram
+ name="Media.EME.MediaDrm.PreprovisionedOriginId.PerAppProvisioningDevice"
+ expires_after="M90">
+ <owner>jrummell@chromium.org</owner>
+ <owner>media-dev@chromium.org</owner>
+ <summary>
+ The number of pre-provisioned origin IDs available shortly after startup on
+ devices that support per-application provisioning.
+ </summary>
+</histogram>
+
<histogram name="Media.EME.MediaDrmBridge.KeySystemSupport"
enum="BooleanSupported" expires_after="M77">
<owner>media-dev@chromium.org</owner>
@@ -52762,6 +55112,16 @@ uploading your change for review.
<summary>The time it takes to resolve a EME promise.</summary>
</histogram>
+<histogram name="Media.EME.UrlProvisionFetcher.ResponseCode"
+ enum="CombinedHttpResponseAndNetErrorCode" expires_after="M90">
+ <owner>jrummell@chromium.org</owner>
+ <owner>media-dev@chromium.org</owner>
+ <summary>
+ The net error or HTTP response code of provisioning requests made by
+ UrlProvisionFetcher on Android and Cast devices.
+ </summary>
+</histogram>
+
<histogram name="Media.EME.Widevine.VideoCapability.HasEmptyRobustness"
enum="BooleanEmpty">
<owner>xhwang@chromium.org</owner>
@@ -52878,7 +55238,7 @@ uploading your change for review.
<histogram
name="Media.Engagement.SignificantPlayers.PlayerNotAdded.AfterFirstTime"
- enum="InsignificantPlaybackReason">
+ enum="InsignificantPlaybackReason" expires_after="M78">
<owner>beccahughes@chromium.org</owner>
<owner>media-dev@chromium.org</owner>
<summary>
@@ -54628,6 +56988,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Media.VAJDAWorker.DecoderFailure"
+ enum="VAJDAWorkerDecoderFailure" expires_after="2020-05-01">
+ <owner>andrescj@chromium.org</owner>
+ <owner>chromeos-gfx@chromium.org</owner>
+ <summary>
+ Count of VAAPI errors that occur inside the VaapiWrapper due to
+ functionality needed by the VaapiJpegDecodeAcceleratorWorker.
+ </summary>
+</histogram>
+
<histogram name="Media.VAJEA.EncoderResult" enum="VAJEAEncoderResult"
expires_after="M77">
<owner>shenghao@chromium.org</owner>
@@ -54664,7 +57034,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Media.VAVEA.EncoderFailure" enum="VAVEAEncoderFailure">
+<histogram name="Media.VAVEA.EncoderFailure" enum="VAVEAEncoderFailure"
+ expires_after="M78">
<owner>posciak@chromium.org</owner>
<summary>
Error codes reported by video encode using VA-API hardware video encoder.
@@ -55166,7 +57537,7 @@ uploading your change for review.
<histogram
name="Media.VideoCaptureService.DurationFromLastConnectToClosingConnectionAfterCapture"
- units="ms">
+ units="ms" expires_after="M78">
<owner>chfremer@chromium.org</owner>
<summary>
Measures the duration from the time the Browser connected to the video
@@ -55178,7 +57549,7 @@ uploading your change for review.
<histogram
name="Media.VideoCaptureService.DurationFromLastConnectToClosingConnectionAfterEnumerationOnly"
- units="ms">
+ units="ms" expires_after="M78">
<owner>chfremer@chromium.org</owner>
<summary>
Measures the duration from the time the Browser connected to the video
@@ -55190,7 +57561,7 @@ uploading your change for review.
<histogram
name="Media.VideoCaptureService.DurationFromLastConnectToConnectionLost"
- units="ms">
+ units="ms" expires_after="M78">
<owner>chfremer@chromium.org</owner>
<summary>
Measures the duration from the time the Browser connected to the video
@@ -55223,7 +57594,7 @@ uploading your change for review.
<histogram
name="Media.VideoCaptureService.DurationUntilReconnectAfterEnumerationOnly"
- units="ms">
+ units="ms" expires_after="M78">
<owner>chfremer@chromium.org</owner>
<summary>
Measures the duration from the time the Browser last closed or lost
@@ -55469,7 +57840,7 @@ uploading your change for review.
</histogram>
<histogram name="Media.VTVDA.HardwareAccelerated"
- enum="BooleanHardwareAccelerated">
+ enum="BooleanHardwareAccelerated" expires_after="M78">
<owner>sandersd@chromium.org</owner>
<summary>
Whether a VTDecompressionSession is internally using hardware accelerated
@@ -55724,7 +58095,7 @@ uploading your change for review.
<owner>takumif@chromium.org</owner>
<owner>mfoltz@chromium.org</owner>
- <owner>openscreen-team@google.com</owner>
+ <owner>openscreen-eng@google.com</owner>
<summary>
Round trip time for a Cast app availability request. Can be suffixed with
Success or Failure.
@@ -55809,7 +58180,7 @@ uploading your change for review.
enum="MediaRouterDialCreateRouteResult">
<owner>takumif@chromium.org</owner>
<owner>mfoltz@chromium.org</owner>
- <owner>openscreen-team@google.com</owner>
+ <owner>openscreen-eng@google.com</owner>
<summary>
The result of a DIAL CreateRoute request. Recorded when the user requests to
create a media route to a DIAL device.
@@ -55820,7 +58191,7 @@ uploading your change for review.
enum="MediaRouterDialFetchAppInfoResult">
<owner>takumif@chromium.org</owner>
<owner>mfoltz@chromium.org</owner>
- <owner>openscreen-team@google.com</owner>
+ <owner>openscreen-eng@google.com</owner>
<summary>
The result of a DIAL app info request. Recorded when an app info request is
issued to a DIAL device.
@@ -55839,7 +58210,7 @@ uploading your change for review.
enum="MediaRouterDialParseMessageResult">
<owner>takumif@chromium.org</owner>
<owner>mfoltz@chromium.org</owner>
- <owner>openscreen-team@google.com</owner>
+ <owner>openscreen-eng@google.com</owner>
<summary>
The result of parsing a Cast SDK message in the DIAL media route provider.
Recorded when the DIAL media route prover finishes parsing a Cast SDK
@@ -55861,7 +58232,7 @@ uploading your change for review.
enum="MediaRouterDialTerminateRouteResult">
<owner>takumif@chromium.org</owner>
<owner>mfoltz@chromium.org</owner>
- <owner>openscreen-team@google.com</owner>
+ <owner>openscreen-eng@google.com</owner>
<summary>
The result of a DIAL TerminateRoute request. Recorded the user requests to
terminate a DIAL media route.
@@ -55896,7 +58267,7 @@ uploading your change for review.
enum="PresentationUrlType" expires_after="M77">
<owner>takumif@chromium.org</owner>
<owner>mfoltz@chromium.org</owner>
- <owner>openscreen-team@google.com</owner>
+ <owner>openscreen-eng@google.com</owner>
<summary>
The type of Presentation URL used in a PresentationRequest by a web page.
</summary>
@@ -55906,7 +58277,7 @@ uploading your change for review.
enum="MediaRouteProviderResult">
<owner>takumif@chromium.org</owner>
<owner>mfoltz@chromium.org</owner>
- <owner>openscreen-team@google.com</owner>
+ <owner>openscreen-eng@google.com</owner>
<summary>
Result of a request to the extension (or an unknown) MediaRouteProvider to
create a route.
@@ -55914,7 +58285,7 @@ uploading your change for review.
</histogram>
<histogram name="MediaRouter.Provider.CreateRoute.Result.WiredDisplay"
- enum="MediaRouteProviderResult">
+ enum="MediaRouteProviderResult" expires_after="M78">
<owner>takumif@chromium.org</owner>
<summary>
Result of a request to the wired display MediaRouteProvider to create a
@@ -55926,7 +58297,7 @@ uploading your change for review.
enum="MediaRouteProviderResult">
<owner>takumif@chromium.org</owner>
<owner>mfoltz@chromium.org</owner>
- <owner>openscreen-team@google.com</owner>
+ <owner>openscreen-eng@google.com</owner>
<summary>
Result of a request to the extension (or an unknown) MediaRouteProvider to
join a route.
@@ -55960,7 +58331,7 @@ uploading your change for review.
</histogram>
<histogram name="MediaRouter.Provider.TerminateRoute.Result.WiredDisplay"
- enum="MediaRouteProviderResult">
+ enum="MediaRouteProviderResult" expires_after="M78">
<owner>takumif@chromium.org</owner>
<summary>
Result of a request to the wired display MediaRouteProvider to terminate a
@@ -56643,6 +59014,52 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="Memory.Experimental.NetworkService2" units="MiB"
+ expires_after="2020-05-06">
+<!-- Name completed by histogram_suffixes name="ProcessMemoryAllocator2" -->
+
+ <owner>mmenke@chromium.org</owner>
+ <owner>morlovich@chromium.org</owner>
+ <summary>
+ The network service process's memory usage reported by the memory
+ instrumentation service in MiB. Recorded once per UMA ping.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Memory.Experimental.NetworkService2.Small"
+ units="KiB" expires_after="2020-05-06">
+<!-- Name completed by histogram_suffixes name="ProcessMemoryAllocatorSmall2" -->
+
+ <owner>mmenke@chromium.org</owner>
+ <owner>morlovich@chromium.org</owner>
+ <summary>
+ The network service process's memory usage reported by the memory
+ instrumentation service in KiB. Recorded once per UMA ping.
+ </summary>
+</histogram>
+
+<histogram
+ name="Memory.Experimental.NewMemoryPressureMonitor.SessionDurations.CriticalPressure"
+ units="ms" expires_after="2019-12-31">
+ <owner>sebmarchand@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
+ <summary>
+ The amount of time spent in the critical memory pressure state. Recorded
+ every time the level changes and at shutdown.
+ </summary>
+</histogram>
+
+<histogram
+ name="Memory.Experimental.NewMemoryPressureMonitor.SessionDurations.NoPressure"
+ units="ms" expires_after="2019-12-31">
+ <owner>sebmarchand@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
+ <summary>
+ The amount of time spent in the no memory pressure state. Recorded every
+ time the level changes and at shutdown.
+ </summary>
+</histogram>
+
<histogram name="Memory.Experimental.OomIntervention.BrowserMonitorStatus"
enum="OomInterventionBrowserMonitorStatus" expires_after="2018-08-29">
<obsolete>
@@ -57013,6 +59430,33 @@ uploading your change for review.
<summary>Records user decisions on near-OOM intervention.</summary>
</histogram>
+<histogram name="Memory.Experimental.OomIntervention.V8UsageAfter10secs"
+ units="MB">
+ <owner>keishi@chromium.org</owner>
+ <owner>yuzus@chromium.org</owner>
+ <summary>V8 memory usage 10 seconds after intervention.</summary>
+</histogram>
+
+<histogram name="Memory.Experimental.OomIntervention.V8UsageAfter20secs"
+ units="MB">
+ <owner>keishi@chromium.org</owner>
+ <owner>yuzus@chromium.org</owner>
+ <summary>V8 memory usage 20 seconds after intervention.</summary>
+</histogram>
+
+<histogram name="Memory.Experimental.OomIntervention.V8UsageAfter30secs"
+ units="MB">
+ <owner>keishi@chromium.org</owner>
+ <owner>yuzus@chromium.org</owner>
+ <summary>V8 memory usage 30 seconds after intervention.</summary>
+</histogram>
+
+<histogram name="Memory.Experimental.OomIntervention.V8UsageBefore" units="MB">
+ <owner>keishi@chromium.org</owner>
+ <owner>yuzus@chromium.org</owner>
+ <summary>V8 memory usage right before intervention.</summary>
+</histogram>
+
<histogram base="true" name="Memory.Experimental.Renderer" units="MB">
<!-- Name completed by histogram_suffixes name="RendererMemoryAllocator" -->
@@ -57501,6 +59945,49 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Memory.NetworkService.PrivateMemoryFootprint" units="MiB"
+ expires_after="2020-05-06">
+ <owner>mmenke@chromium.org</owner>
+ <owner>morlovich@chromium.org</owner>
+ <summary>
+ A rough estimate of the private memory footprint of the network service
+ process. Recorded once per UMA ping.
+ </summary>
+</histogram>
+
+<histogram name="Memory.NetworkService.PrivateSwapFootprint" units="MiB"
+ expires_after="2020-05-06">
+ <owner>mmenke@chromium.org</owner>
+ <owner>morlovich@chromium.org</owner>
+ <summary>
+ An amount of private memory of the network service process placed in swap
+ (VmSwap). Available only on Android and Linux.
+ </summary>
+</histogram>
+
+<histogram name="Memory.NetworkService.ResidentSet" units="MiB"
+ expires_after="2020-05-06">
+ <owner>mmenke@chromium.org</owner>
+ <owner>morlovich@chromium.org</owner>
+ <summary>
+ The size of the resident memory in a network service process. This is
+ influenced by factors we control (e.g. memory that is not accessed can be
+ swapped) and factors we don't control (e.g. an unrelated process using a lot
+ of memory can force memory in our process to be swapped). Recorded once per
+ UMA ping on Windows/Linux/ChromeOS/Android.
+ </summary>
+</histogram>
+
+<histogram name="Memory.NetworkService.SharedMemoryFootprint" units="MiB"
+ expires_after="2020-05-06">
+ <owner>mmenke@chromium.org</owner>
+ <owner>morlovich@chromium.org</owner>
+ <summary>
+ A rough estimate of the shared memory footprint of the network service
+ process. Recorded once per UMA ping.
+ </summary>
+</histogram>
+
<histogram name="Memory.OOMKill.Contents.MemAllocatedMB" units="MB">
<owner>oshima@chromium.org</owner>
<summary>
@@ -58909,6 +61396,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="MixedAutoupgrade.Navigation.OptedOut" enum="BooleanOptedOut"
+ expires_after="M79">
+ <owner>carlosil@chromium.org</owner>
+ <owner>estark@chromium.org</owner>
+ <summary>
+ Whether a navigation opted out or not of Mixed Content autoupgrades.
+ Recorded every navigation.
+ </summary>
+</histogram>
+
<histogram name="MixedAutoupgrade.ResourceRequest.ErrorOrResponseCode"
enum="CombinedHttpResponseAndNetErrorCode">
<owner>carlosil@chromium.org</owner>
@@ -58918,6 +61415,44 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="MixedAutoupgrade.ResourceRequest.Failure.IsAd" enum="Boolean">
+ <owner>carlosil@chromium.org</owner>
+ <summary>
+ Whether or not an autoupgrade mixed content request was for a resource we
+ know to be an ad
+ </summary>
+</histogram>
+
+<histogram name="MixedAutoupgrade.ResourceRequest.Failure.Type"
+ enum="ResourceType" expires_after="M79">
+ <owner>carlosil@chromium.org</owner>
+ <owner>estark@chromium.org</owner>
+ <summary>
+ Logs the type of each resource request that is autoupgraded to HTTPS and
+ fails to load.
+ </summary>
+</histogram>
+
+<histogram name="MixedAutoupgrade.ResourceRequest.Response.Type"
+ enum="ResourceType" expires_after="M79">
+ <owner>carlosil@chromium.org</owner>
+ <owner>estark@chromium.org</owner>
+ <summary>
+ Logs the type of each resource request that was autoupgraded to HTTPS and
+ resulted in a response.
+ </summary>
+</histogram>
+
+<histogram name="MixedAutoupgrade.ResourceRequest.Start.Type"
+ enum="ResourceType" expires_after="M79">
+ <owner>carlosil@chromium.org</owner>
+ <owner>estark@chromium.org</owner>
+ <summary>
+ Logs the type of each resource request that is autoupgraded to HTTPS. This
+ is logged when the request is started.
+ </summary>
+</histogram>
+
<histogram name="MixedAutoupgrade.ResourceRequest.Status"
enum="MixedContentAutoupgradeStatus">
<owner>carlosil@chromium.org</owner>
@@ -58968,6 +61503,80 @@ uploading your change for review.
<summary>Android: The number of system installed browsers.</summary>
</histogram>
+<histogram base="true" name="Mobile.Messages.Badge.Tapped"
+ enum="MobileMessagesBadgeState" expires_after="2020-02-01">
+<!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" -->
+
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <summary>Records the state of a badge when it was tapped.</summary>
+</histogram>
+
+<histogram base="true" name="Mobile.Messages.Banner.Dismiss"
+ enum="MobileMessagesBannerDismissType" expires_after="2020-02-01">
+<!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" -->
+
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <summary>Records the reason why a Banner was dismissed.</summary>
+</histogram>
+
+<histogram base="true" name="Mobile.Messages.Banner.Event"
+ enum="MobileMessagesBannerEvent" expires_after="2020-02-01">
+<!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" -->
+
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <summary>Records Infobar Banner events.</summary>
+</histogram>
+
+<histogram name="Mobile.Messages.Banner.OnScreenTime" units="ms"
+ expires_after="2020-02-01">
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@google.com</owner>
+ <summary>
+ Records the time an Infobar (Messages) Banner is visible on screen. Used to
+ know how long it takes a user to act on the banner before it gets
+ auto-dismissed.
+ </summary>
+</histogram>
+
+<histogram base="true" name="Mobile.Messages.Modal.Event"
+ enum="MobileMessagesModalEvent" expires_after="2020-02-01">
+<!-- Name completed by histogram_suffixes name="Mobile.Messages.Type" -->
+
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <summary>Records generic Infobar Modal events.</summary>
+</histogram>
+
+<histogram base="true" name="Mobile.Messages.Passwords.Modal.Dismiss"
+ enum="MobileMessagesPasswordsModalDismiss" expires_after="2022-05-01">
+<!-- Name completed by histogram_suffixes name="Mobile.Messages.Password.Type" -->
+
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <summary>Records the reason why a Password Modal was dismissed.</summary>
+</histogram>
+
+<histogram base="true" name="Mobile.Messages.Passwords.Modal.Event"
+ enum="MobileMessagesPasswordsModalEvent" expires_after="2020-02-01">
+<!-- Name completed by histogram_suffixes name="Mobile.Messages.Password.Type" -->
+
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <summary>Records Password specific Infobar Modal events.</summary>
+</histogram>
+
+<histogram base="true" name="Mobile.Messages.Passwords.Modal.Present"
+ enum="MobileMessagesPasswordsModalPresent" expires_after="2020-02-01">
+<!-- Name completed by histogram_suffixes name="Mobile.Messages.Password.Type" -->
+
+ <owner>sczs@chromium.org</owner>
+ <owner>thegreenfrog@chromium.org</owner>
+ <summary>Records the context when a Password Modal was presented.</summary>
+</histogram>
+
<histogram name="Mobile.RecentTabsManager.TotalTabsFromOtherDevicesOpenAll"
units="count" expires_after="2022-04-19">
<owner>sczs@chromium.org</owner>
@@ -58978,6 +61587,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Mobile.Splash.TranslucencyRemovalFailed" enum="Boolean"
+ expires_after="M80">
+ <owner>pshmakov@chromium.org</owner>
+ <owner>peconn@chromium.org</owner>
+ <owner>peter@chromium.org</owner>
+ <summary>
+ Records the cases when removing a Trusted Web Activity's or WebAPK's
+ translucency via a reflective call fails. Only &quot;true&quot; is recorded.
+ </summary>
+</histogram>
+
<histogram name="Mobile.SystemNotification.Action.Click"
enum="SystemNotificationActionType" expires_after="2020-01-22">
<owner>dtrainor@chromium.org</owner>
@@ -59168,6 +61788,43 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="MobileDownload.FirstBackground.InterruptionCount"
+ units="interruptions" expires_after="2019-12-05">
+ <owner>hnakashima@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <owner>qinmin@chromium.org</owner>
+ <summary>
+ Android: Records the number of interruptions for the first download started
+ in background after it reaches a terminal state.
+ </summary>
+</histogram>
+
+<histogram name="MobileDownload.FirstBackground.Reason" enum="InterruptReason"
+ expires_after="2019-12-05">
+ <owner>hnakashima@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <owner>qinmin@chromium.org</owner>
+ <summary>
+ Android: Records all the interrupt reasons for the first download started in
+ background after every browser process launch. We only record the first
+ download so that we can compare the difference between service manager only
+ mode and full browser process mode.
+ </summary>
+</histogram>
+
+<histogram name="MobileDownload.FirstBackground.StartedReason"
+ enum="InterruptReason" expires_after="2019-12-05">
+ <owner>hnakashima@chromium.org</owner>
+ <owner>hanxi@chromium.org</owner>
+ <owner>qinmin@chromium.org</owner>
+ <summary>
+ Android: After every browser process launch, records the interrupt reason of
+ the first background download when it is started. This interrupt reason
+ allows us to know whether download was interrupted due to browser process
+ crash in an earlier attempt.
+ </summary>
+</histogram>
+
<histogram name="MobileDownload.InterceptFailureReason"
enum="MobileDownloadInterceptFailureReason" expires_after="2016-09-21">
<obsolete>
@@ -61407,7 +64064,23 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Navigation.Home.IsChromeInternal" enum="Boolean"
+ expires_after="2020-05-08">
+ <owner>mpearson@chromium.org</owner>
+ <owner>amaralp@chromium.org</owner>
+ <summary>
+ Emitted every time a user uses a Home button to go to their home page.
+ Records whether the page is chrome-internal (most likely the New Tab Page or
+ about:blank) or not (most likely an actual web site). For the purpose of
+ this histogram, about:, chrome: and chrome-native: are considered
+ chrome-internal; everything else is not.
+ </summary>
+</histogram>
+
<histogram name="Navigation.Intercept.Ignored" enum="Boolean">
+ <obsolete>
+ Deprecated May 2019
+ </obsolete>
<owner>csharrison@chromium.org</owner>
<summary>
Records whether the InterceptNavigationThrottle ignored the navigation. This
@@ -61416,6 +64089,9 @@ uploading your change for review.
</histogram>
<histogram name="Navigation.Intercept.WillStart" units="microseconds">
+ <obsolete>
+ Deprecated May 2019
+ </obsolete>
<owner>csharrison@chromium.org</owner>
<summary>
The microseconds it takes for the InterceptNavigationThrottle to determine
@@ -61481,6 +64157,25 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Navigation.MainFrameHasRTLDomain" enum="Boolean"
+ expires_after="M82">
+ <owner>cthomp@chromium.org</owner>
+ <summary>
+ Whether the main-frame navigation was to a URL with an RTL domain name.
+ </summary>
+</histogram>
+
+<histogram name="Navigation.MainFrameHasRTLDomainDifferentPage" enum="Boolean"
+ expires_after="M82">
+ <owner>cthomp@chromium.org</owner>
+ <summary>
+ Whether the main-frame navigation was to a URL with an RTL domain name,
+ recorded for each main-frame avigation that replaces a document object. This
+ is not reported for reference fragment navigations, pushState/replaceState
+ or same page history navigation.
+ </summary>
+</histogram>
+
<histogram name="Navigation.MainFrameScheme" enum="NavigationScheme">
<owner>elawrence@chromium.org</owner>
<owner>estark@chromium.org</owner>
@@ -61859,7 +64554,7 @@ uploading your change for review.
<histogram
name="Navigation.URLLoaderNetworkService.OnCompleteCertificateChainsSize"
- units="KB">
+ units="KB" expires_after="M78">
<owner>estark@chromium.org</owner>
<summary>
When the navigation URL loader receives an OnComplete message from the
@@ -63345,7 +66040,10 @@ uploading your change for review.
</histogram>
<histogram name="Net.CertificateTransparency.CanInclusionCheckSCT"
- enum="SCTCanBeChecked">
+ enum="SCTCanBeChecked" expires_after="M76">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>estark@chromium.org</owner>
<owner>rsleevi@chromium.org</owner>
<summary>
@@ -63480,7 +66178,10 @@ uploading your change for review.
</histogram>
<histogram name="Net.CertificateTransparency.DnsQueryAuditProofError"
- enum="NetErrorCodes">
+ enum="NetErrorCodes" expires_after="M76">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>robpercival@chromium.org</owner>
<summary>
Counts of specific error codes returned by LogDnsClient at the end of an
@@ -63490,7 +66191,10 @@ uploading your change for review.
</histogram>
<histogram name="Net.CertificateTransparency.DnsQueryAuditProofRcode"
- enum="AsyncDNSRcode">
+ enum="AsyncDNSRcode" expires_after="M76">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>robpercival@chromium.org</owner>
<summary>
Counts of specific DNS response codes returned by LogDnsClient at the end of
@@ -63500,7 +66204,11 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Net.CertificateTransparency.DnsQueryDuration" units="ms">
+<histogram name="Net.CertificateTransparency.DnsQueryDuration" units="ms"
+ expires_after="M76">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>robpercival@chromium.org</owner>
<summary>
The time taken attempting to obtain an inclusion proof from a Certificate
@@ -63510,7 +66218,10 @@ uploading your change for review.
</histogram>
<histogram name="Net.CertificateTransparency.DnsQueryDuration.Success"
- units="ms">
+ units="ms" expires_after="M76">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>robpercival@chromium.org</owner>
<summary>
The time taken to successfully obtain an inclusion proof from a Certificate
@@ -63520,7 +66231,10 @@ uploading your change for review.
</histogram>
<histogram name="Net.CertificateTransparency.DnsQueryLeafIndexError"
- enum="NetErrorCodes">
+ enum="NetErrorCodes" expires_after="M76">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>robpercival@chromium.org</owner>
<summary>
Counts of specific error codes returned by LogDnsClient at the end of an
@@ -63530,7 +66244,10 @@ uploading your change for review.
</histogram>
<histogram name="Net.CertificateTransparency.DnsQueryLeafIndexRcode"
- enum="AsyncDNSRcode">
+ enum="AsyncDNSRcode" expires_after="M76">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>robpercival@chromium.org</owner>
<summary>
Counts of specific DNS response codes returned by LogDnsClient at the end of
@@ -63600,7 +66317,10 @@ uploading your change for review.
</histogram>
<histogram name="Net.CertificateTransparency.InclusionCheckResult"
- enum="CTLogEntryInclusionCheckResult">
+ enum="CTLogEntryInclusionCheckResult" expires_after="M76">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>estark@chromium.org</owner>
<owner>rsleevi@chromium.org</owner>
<summary>
@@ -63624,7 +66344,11 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Net.CertificateTransparency.PilotSTHAge" units="ms">
+<histogram name="Net.CertificateTransparency.PilotSTHAge" units="ms"
+ expires_after="M76">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>estark@chromium.org</owner>
<owner>rsleevi@chromium.org</owner>
<summary>
@@ -63708,6 +66432,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="Net.CertVerifier.NameNormalizationPrivateRoots"
+ enum="NetCertificateNameNormalization" expires_after="2020-06-01">
+ <owner>mattm@chromium.org</owner>
+ <summary>
+ Whether Name normalization was used in successfully validated certificate
+ chains, only recorded for chains ending in privately trusted roots. Suffixed
+ by the CertVerifyProc implementation.
+ </summary>
+</histogram>
+
<histogram name="Net.CertVerifier_First_Job_Latency" units="ms"
expires_after="M77">
<owner>davidben@chromium.org</owner>
@@ -64208,6 +66942,31 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Net.Cors.PreflightCacheEntriesPerOrigin" units="entries"
+ expires_after="2019-05-14">
+ <obsolete>
+ Deprecated 05/2019, related to cache organization changes that does not
+ store entries per origin any more.
+ </obsolete>
+ <owner>toyoshim@chromium.org</owner>
+ <owner>yhirano@chromium.org</owner>
+ <summary>
+ The distribution of the number of cache entries for each origin in the CORS
+ preflight cache. This counts the cache entries for each origin every 5
+ minutes.
+ </summary>
+</histogram>
+
+<histogram name="Net.Cors.PreflightCacheKeySize" units="bytes"
+ expires_after="M77">
+ <owner>toyoshim@chromium.org</owner>
+ <owner>yhirano@chromium.org</owner>
+ <summary>
+ The distribution of the key size in the CORS preflight cache. This counts
+ each key size when a new entry is added to the cache.
+ </summary>
+</histogram>
+
<histogram name="Net.Cors.PreflightCacheResult" enum="CorsPreflightCacheResult"
expires_after="M77">
<owner>toyoshim@chromium.org</owner>
@@ -64229,6 +66988,27 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Net.Cors.PreflightCacheTotalMemoryPressureInBytes"
+ units="bytes" expires_after="M77">
+ <owner>toyoshim@chromium.org</owner>
+ <owner>yhirano@chromium.org</owner>
+ <summary>
+ The distribution of the total memory presure in bytes for all CORS preflight
+ cache in the network service. This counts the cache entries every 5 minutes.
+ </summary>
+</histogram>
+
+<histogram name="Net.Cors.PreflightCacheValueSize" units="bytes"
+ expires_after="M77">
+ <owner>toyoshim@chromium.org</owner>
+ <owner>yhirano@chromium.org</owner>
+ <summary>
+ The distribution of estimated memory pressure caused by each cache entry's
+ content in the CORS preflight cache. This counts each entry size when a new
+ entry is added to the cache.
+ </summary>
+</histogram>
+
<histogram name="Net.CountOfAlternateProtocolServers" units="servers"
expires_after="M77">
<owner>bnc@chromium.org</owner>
@@ -64363,7 +67143,11 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Net.Cronet.PrefsInitTime" units="ms">
+<histogram name="Net.Cronet.PrefsInitTime" units="ms"
+ expires_after="2019-04-23">
+ <obsolete>
+ Removed 2019-04-23.
+ </obsolete>
<owner>mgersh@chromium.org</owner>
<summary>
Measures time spent creating the Cronet PrefService, including loading the
@@ -65444,7 +68228,7 @@ uploading your change for review.
</histogram>
<histogram name="Net.ErrorCodesForTLS13ExperimentMainFrame2"
- enum="NetErrorCodes">
+ enum="NetErrorCodes" expires_after="M78">
<owner>svaldez@chromium.org</owner>
<summary>
Positive net error codes that requests for pages end with, including net::OK
@@ -65814,13 +68598,20 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Net.FtpDataConnectionErrorCount" enum="FtpDataConnectionError">
+<histogram name="Net.FtpDataConnectionErrorCount" enum="FtpDataConnectionError"
+ expires_after="2019-04-23">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>phajdan.jr@chromium.org</owner>
<summary>The number of times each FTP Error was observed.</summary>
</histogram>
<histogram name="Net.FtpDataConnectionErrorHappened"
- enum="FtpDataConnectionError" expires_after="M77">
+ enum="FtpDataConnectionError" expires_after="2019-04-23">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>phajdan.jr@chromium.org</owner>
<summary>
The number of Chrome sessions which encountered the indicates FTP Error.
@@ -65840,7 +68631,11 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Net.FtpServerTypeCount2" enum="FtpServerType2">
+<histogram name="Net.FtpServerTypeCount2" enum="FtpServerType2"
+ expires_after="2019-04-23">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>phajdan.jr@chromium.org</owner>
<summary>
Each bucket is the number of times the FTP server type was encountered.
@@ -65974,7 +68769,10 @@ uploading your change for review.
</histogram>
<histogram name="Net.HadFtpServerType2" enum="FtpServerType2"
- expires_after="M77">
+ expires_after="2019-04-23">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>phajdan.jr@chromium.org</owner>
<summary>
Each bucket is the number of sessions that encountered a given FTP server
@@ -66780,7 +69578,7 @@ uploading your change for review.
<histogram
name="Net.KeepaliveStatisticsRecorder.PeakInflightRequestsPerProcess"
- units="requests">
+ units="requests" expires_after="M78">
<owner>yhirano@chromium.org</owner>
<summary>
The peak number of concurrent outstanding requests with keepalive specified
@@ -66790,7 +69588,7 @@ uploading your change for review.
<histogram
name="Net.KeepaliveStatisticsRecorder.PeakInflightRequestsPerProcess2"
- units="requests">
+ units="requests" expires_after="M78">
<owner>yhirano@chromium.org</owner>
<summary>
The peak number of concurrent outstanding requests with keepalive specified
@@ -67509,6 +70307,9 @@ uploading your change for review.
<histogram name="Net.Proxy.RedirectDuringConnect"
enum="TunnelRedirectHistogramValue" expires_after="2019-05-19">
+ <obsolete>
+ Removed in Chrome 76.
+ </obsolete>
<owner>eroman@chromium.org</owner>
<owner>mmenke@chromium.org</owner>
<summary>
@@ -68400,7 +71201,7 @@ uploading your change for review.
</histogram>
<histogram name="Net.QuicSession.ActiveStreamsOnGoAwayAfterPathDegrading"
- units="Streams">
+ units="Streams" expires_after="M78">
<owner>renjietang@chromium.org</owner>
<summary>
The number of active streams when the quic session decides to go away on
@@ -68710,7 +71511,7 @@ uploading your change for review.
</histogram>
<histogram name="Net.QuicSession.DrainingStreamsOnGoAwayAfterPathDegrading"
- units="Streams">
+ units="Streams" expires_after="M78">
<owner>renjietang@chromium.org</owner>
<summary>
The number of draining streams when the quic session decides to go away on
@@ -69445,7 +72246,7 @@ uploading your change for review.
</histogram>
<histogram name="Net.QuicSession.UnexpectedOpenStreams"
- enum="QuicSessionLocations">
+ enum="QuicSessionLocations" expires_after="M78">
<owner>rch@chromium.org</owner>
<summary>
The location in quic_client_session.cc where there were unexpected open
@@ -70461,8 +73262,12 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Net.SpdyRecvBytes" units="bytes" expires_after="M77">
+<histogram name="Net.SpdyRecvBytes" units="bytes">
+ <obsolete>
+ Deprecated because it took up too much space and nobody used it.
+ </obsolete>
<owner>bnc@chromium.org</owner>
+ obsolete
<summary>The number of bytes recevied per stream.</summary>
</histogram>
@@ -70476,7 +73281,10 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Net.SpdySendBytes" units="bytes" expires_after="M77">
+<histogram name="Net.SpdySendBytes" units="bytes">
+ <obsolete>
+ Deprecated because it took up too much space and nobody used it.
+ </obsolete>
<owner>bnc@chromium.org</owner>
<summary>The number of bytes sent per stream.</summary>
</histogram>
@@ -70706,6 +73514,9 @@ uploading your change for review.
</histogram>
<histogram name="Net.SpdyStreamDownloadTime" units="ms">
+ <obsolete>
+ Deprecated because it took up too much space and nobody used it.
+ </obsolete>
<owner>bnc@chromium.org</owner>
<summary>
The time between receiving the first chunk and the last chunk of data on a
@@ -70746,6 +73557,9 @@ uploading your change for review.
</histogram>
<histogram name="Net.SpdyStreamTime" units="ms">
+ <obsolete>
+ Deprecated because it took up too much space and nobody used it.
+ </obsolete>
<owner>bnc@chromium.org</owner>
<summary>
The time of a Spdy stream. Measured from sending the first chunk to
@@ -70754,6 +73568,9 @@ uploading your change for review.
</histogram>
<histogram name="Net.SpdyStreamTimeToFirstByte" units="ms">
+ <obsolete>
+ Deprecated because it took up too much space and nobody used it.
+ </obsolete>
<owner>bnc@chromium.org</owner>
<summary>
The time between sending the request and receiving the first chunk of data
@@ -70872,7 +73689,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Net.SSL_Connection_Error_TLS13Experiment" enum="NetErrorCodes">
+<histogram name="Net.SSL_Connection_Error_TLS13Experiment" enum="NetErrorCodes"
+ expires_after="M78">
<owner>svaldez@chromium.org</owner>
<summary>
Counts of specific error codes returned when opening an SSL connection for
@@ -71386,7 +74204,7 @@ uploading your change for review.
</histogram>
<histogram name="Net.SSLTLS13Downgrade" enum="BooleanDowngrade"
- expires_after="2019-06-30">
+ expires_after="2019-12-31">
<owner>svaldez@chromium.org</owner>
<owner>davidben@chromium.org</owner>
<summary>
@@ -71397,7 +74215,7 @@ uploading your change for review.
</histogram>
<histogram name="Net.SSLTLS13DowngradeTLS13Experiment" enum="BooleanDowngrade"
- expires_after="2019-06-30">
+ expires_after="2019-12-31">
<owner>svaldez@chromium.org</owner>
<owner>davidben@chromium.org</owner>
<summary>
@@ -71409,7 +74227,7 @@ uploading your change for review.
</histogram>
<histogram name="Net.SSLTLS13DowngradeType" enum="TLS13DowngradeType"
- expires_after="2019-06-30">
+ expires_after="2019-12-31">
<owner>svaldez@chromium.org</owner>
<owner>davidben@chromium.org</owner>
<summary>
@@ -71419,7 +74237,7 @@ uploading your change for review.
</histogram>
<histogram name="Net.SSLTLS13DowngradeTypeTLS13Experiment"
- enum="TLS13DowngradeType" expires_after="2019-06-30">
+ enum="TLS13DowngradeType" expires_after="2019-12-31">
<owner>svaldez@chromium.org</owner>
<owner>davidben@chromium.org</owner>
<summary>
@@ -71490,6 +74308,20 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Net.SSLVersionGoogle" enum="SSLOrQUICVersion"
+ expires_after="2020-04-24">
+ <owner>davidben@chromium.org</owner>
+ <owner>rsleevi@chromium.org</owner>
+ <summary>
+ The SSL/TLS version that was negotiated to a Google host. Recorded for each
+ appplicable SSL/TLS connection in the socket pool where Connect() succeeds.
+ Google servers all support TLS 1.2, so any occurrences of TLS 1.0 or TLS 1.1
+ indicate an outdated insecure TLS MITM proxy, such as some antivirus
+ configurations. TLS 1.0 and 1.1 are deprecated, so record these to see how
+ prevalent they are. See https://crbug.com/896013.
+ </summary>
+</histogram>
+
<histogram name="Net.SSLVersionInterferenceDetails_TLS13Experiment"
enum="SSLVersionInterferenceDetails" expires_after="2018-04-06">
<obsolete>
@@ -71505,6 +74337,9 @@ uploading your change for review.
<histogram name="Net.SSLVersionInterferenceError" enum="NetErrorCodes"
expires_after="M77">
+ <obsolete>
+ Removed April 2019.
+ </obsolete>
<owner>davidben@chromium.org</owner>
<summary>
For each detected SSL version interference, what network error the original
@@ -71514,6 +74349,9 @@ uploading your change for review.
<histogram name="Net.SSLVersionInterferenceProbeTrigger" enum="NetErrorCodes"
expires_after="M77">
+ <obsolete>
+ Removed April 2019.
+ </obsolete>
<owner>davidben@chromium.org</owner>
<summary>
For each SSL version interference probe, what network error triggered it.
@@ -72986,6 +75824,32 @@ uploading your change for review.
<summary>Errors experienced during Gobi device powerup.</summary>
</histogram>
+<histogram name="Network.Cellular.Activation.StatusAtLogin"
+ enum="NetworkCellularActivationState">
+ <owner>azeemarshad@chromium.org</owner>
+ <summary>
+ Tracks the Cellular network activation state when the primary user logs-in
+ to the device.
+ </summary>
+</histogram>
+
+<histogram name="Network.Cellular.Connection.Disconnections"
+ enum="NetworkCellularConnectionState">
+ <owner>azeemarshad@chromium.org</owner>
+ <summary>
+ Tracks when cellular network is connected and when cellular network is
+ disconnected without explicit user action.
+ </summary>
+</histogram>
+
+<histogram name="Network.Cellular.Connection.TimeToConnected" units="ms">
+ <owner>azeemarshad@chromium.org</owner>
+ <summary>
+ Tracks the amount fo time taken between when cellular device starts and
+ finishes connecting.
+ </summary>
+</histogram>
+
<histogram name="Network.Cellular.TimeOnline" units="seconds"
expires_after="2016-04-29">
<obsolete>
@@ -73035,6 +75899,14 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Network.Cellular.Usage.Count" enum="NetworkCellularUsage">
+ <owner>azeemarshad@chromium.org</owner>
+ <summary>
+ Tracks the number of times a cellular network is connected as the only
+ network, or with other network or not connected at all.
+ </summary>
+</histogram>
+
<histogram name="Network.Cellular.UsageRequestStatus"
enum="NetworkCellularUsageRequestStatus" expires_after="2016-04-29">
<obsolete>
@@ -73348,6 +76220,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Network.Shill.Cellular.TimeToRedirectFound" units="ms"
+ expires_after="2020-12-31">
+ <owner>matthewmwang@chromium.org</owner>
+ <owner>hugobenichi@chromium.org</owner>
+ <summary>
+ Chrome OS network performance metric sampling the time to determine that a
+ cellular network is in a captive portal with a valid redirect URL after
+ configuring Layer 3 state.
+ </summary>
+</histogram>
+
<histogram name="Network.Shill.Cellular.TimeToScan" units="ms">
<owner>benchan@chromium.org</owner>
<summary>
@@ -73367,7 +76250,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Network.Shill.CorruptedProfile" enum="NetworkCorruptedProfile">
+<histogram name="Network.Shill.CorruptedProfile" enum="NetworkCorruptedProfile"
+ expires_after="M78">
<owner>benchan@chromium.org</owner>
<summary>
Chrome OS cellular network metric that tracks the number of corrupted
@@ -73724,6 +76608,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Network.Shill.Ethernet.TimeToRedirectFound" units="ms"
+ expires_after="2020-12-31">
+ <owner>matthewmwang@chromium.org</owner>
+ <owner>hugobenichi@chromium.org</owner>
+ <summary>
+ Chrome OS network performance metric sampling the time to determine that an
+ Ethernet network is in a captive portal with a valid redirect URL after
+ configuring Layer 3 state.
+ </summary>
+</histogram>
+
<histogram name="Network.Shill.MonthlyChosenFractionOnline.Cellular" units="%">
<owner>benchan@chromium.org</owner>
<owner>kirtika@chromium.org</owner>
@@ -74079,7 +76974,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Network.Shill.WiFi.ApDisconnectType" enum="WiFiStatusType">
+<histogram name="Network.Shill.WiFi.ApDisconnectType" enum="WiFiStatusType"
+ expires_after="M78">
<owner>kirtika@chromium.org</owner>
<summary>
Chrome OS network usage metric. Broad category of reason AP disconnected a
@@ -74088,6 +76984,9 @@ uploading your change for review.
</histogram>
<histogram name="Network.Shill.Wifi.ApMode" enum="WiFiApMode">
+ <obsolete>
+ Deprecated as of 05/2019.
+ </obsolete>
<owner>kirtika@chromium.org</owner>
<summary>
Chrome OS network usage metric. The AP mode setting for each successful WiFi
@@ -74661,6 +77560,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Network.Shill.Wifi.TimeToRedirectFound" units="ms"
+ expires_after="2020-12-31">
+ <owner>matthewmwang@chromium.org</owner>
+ <owner>hugobenichi@chromium.org</owner>
+ <summary>
+ Chrome OS network performance metric sampling the time to determine that an
+ 802.11 wireless network is in a captive portal with a valid redirect URL
+ after configuring Layer 3 state.
+ </summary>
+</histogram>
+
<histogram name="Network.Shill.Wifi.TimeToScan" units="ms">
<owner>kirtika@chromium.org</owner>
<summary>
@@ -75097,7 +78007,7 @@ uploading your change for review.
<histogram
name="NetworkService.URLLoader.RequestInitiatorOriginLockCompatibility"
- enum="RequestInitiatorOriginLockCompatibility" expires_after="2019-06-30">
+ enum="RequestInitiatorOriginLockCompatibility" expires_after="2020-06-30">
<owner>creis@chromium.org</owner>
<owner>jam@chromium.org</owner>
<owner>lukasza@chromium.org</owner>
@@ -75376,6 +78286,12 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="NewTabPage.ContentSuggestions.ArtificialDelay" enum="Boolean">
+ <owner>skym@chromium.org</owner>
+ <owner>carlosk@chromium.org</owner>
+ <summary>Android: Loading of Zine was artifically delayed</summary>
+</histogram>
+
<histogram name="NewTabPage.ContentSuggestions.BackgroundFetchTrigger"
enum="BackgroundFetchTrigger">
<owner>jkrcal@chromium.org</owner>
@@ -76006,7 +78922,7 @@ uploading your change for review.
<histogram
name="NewTabPage.ContentSuggestions.UIUpdateSuccessNumberOfSuggestionsSeen"
- units="suggestions">
+ units="suggestions" expires_after="M78">
<owner>jkrcal@chromium.org</owner>
<summary>
Android: The number of content suggestions that have been seen by the user
@@ -76689,7 +79605,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="NewTabPage.Promos.ShownTime" units="ms">
+<histogram name="NewTabPage.Promos.ShownTime" units="ms" expires_after="M78">
<owner>kmilka@chromium.org</owner>
<owner>ramyan@chromium.org</owner>
<summary>
@@ -76838,7 +79754,7 @@ uploading your change for review.
</histogram>
<histogram name="NewTabPage.SearchSuggestions.RequestStatusV2"
- enum="NTPSearchSuggestionsRequestStatus" expires_after="M76">
+ enum="NTPSearchSuggestionsRequestStatus" expires_after="M78">
<owner>kmilka@chromium.org</owner>
<owner>ramyan@chromium.org</owner>
<summary>
@@ -79143,7 +82059,39 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ntp.searchurls.total" expires_after="2016-04-29">
+<histogram name="NQE.WifiSignalStrength.AtECTComputation"
+ units="Signal Strength Level" expires_after="2019-12-01">
+ <owner>tbansal@chromium.org</owner>
+ <summary>
+ Wifi signal strength level reported by the device at the time of ECT
+ computation. Recorded only on Wifi networks, and only when the value is
+ available. The value ranges between 0 and 4 (both inclusive).
+ </summary>
+</histogram>
+
+<histogram name="NQE.WifiSignalStrength.LevelAvailable" enum="BooleanAvailable">
+ <owner>tbansal@chromium.org</owner>
+ <owner>bengr@chromium.org</owner>
+ <summary>
+ Whether the signal strength for the Wifi network was available or not.
+ Recorded right before a connection change event. Recorded only on Wifi
+ connections on Android platform.
+ </summary>
+</histogram>
+
+<histogram name="NQE.WifiSignalStrength.LevelDifference"
+ units="Signal Strength Level">
+ <owner>tbansal@chromium.org</owner>
+ <owner>bengr@chromium.org</owner>
+ <summary>
+ Difference between the minimum and the maximum received signal strength
+ since the last connection change event. Recorded only on Wifi connections on
+ Android platform when the Wifi signal strength was available. Recorded right
+ before a connection change event.
+ </summary>
+</histogram>
+
+<histogram name="ntp.searchurls.total">
<obsolete>
Deprecated 04/2016 as doesn't have data nor owner.
</obsolete>
@@ -79362,7 +82310,7 @@ uploading your change for review.
</histogram>
<histogram name="OfflineIndicator.CTR" enum="OfflineIndicatorCTREvent"
- expires_after="2019-06-30">
+ expires_after="2019-11-30">
<owner>dimich@chromium.org</owner>
<owner>jianli@chromium.org</owner>
<summary>
@@ -79503,7 +82451,7 @@ uploading your change for review.
<histogram
name="OfflinePages.Background.EffectiveConnectionType.RemoveRequests"
- enum="NQEEffectiveConnectionType">
+ enum="NQEEffectiveConnectionType" expires_after="M78">
<owner>dougarnett@chromium.org</owner>
<summary>
Effective connection type when removing one or more background loads is
@@ -79515,7 +82463,7 @@ uploading your change for review.
<histogram
name="OfflinePages.Background.EffectiveConnectionType.ResumeRequests"
- enum="NQEEffectiveConnectionType">
+ enum="NQEEffectiveConnectionType" expires_after="M78">
<owner>dougarnett@chromium.org</owner>
<summary>
Effective connection type when resuming one or more background loads is
@@ -79564,7 +82512,8 @@ uploading your change for review.
</histogram>
<histogram
- name="OfflinePages.Background.ImmediateStart.UnavailableRequestCount">
+ name="OfflinePages.Background.ImmediateStart.UnavailableRequestCount"
+ expires_after="M78">
<owner>dougarnett@chromium.org</owner>
<summary>
Number of queued background load requests unavailable for processing when
@@ -79674,7 +82623,8 @@ uploading your change for review.
</histogram>
<histogram
- name="OfflinePages.Background.ScheduledStart.AvailableRequestCount.Svelte">
+ name="OfflinePages.Background.ScheduledStart.AvailableRequestCount.Svelte"
+ expires_after="M78">
<owner>dougarnett@chromium.org</owner>
<summary>
Number of queued background load requests available for processing when
@@ -79684,7 +82634,8 @@ uploading your change for review.
</histogram>
<histogram
- name="OfflinePages.Background.ScheduledStart.UnavailableRequestCount">
+ name="OfflinePages.Background.ScheduledStart.UnavailableRequestCount"
+ expires_after="M78">
<owner>dougarnett@chromium.org</owner>
<summary>
Number of queued background load requests unavailable for processing when
@@ -79694,7 +82645,8 @@ uploading your change for review.
</histogram>
<histogram
- name="OfflinePages.Background.ScheduledStart.UnavailableRequestCount.Svelte">
+ name="OfflinePages.Background.ScheduledStart.UnavailableRequestCount.Svelte"
+ expires_after="M78">
<owner>dougarnett@chromium.org</owner>
<summary>
Number of queued background load requests unavailable for processing when
@@ -79933,7 +82885,7 @@ uploading your change for review.
</histogram>
<histogram name="OfflinePages.ConsistencyCheck.Persistent.ExpiredEntryCount"
- units="entries">
+ units="entries" expires_after="M78">
<owner>dimich@chromium.org</owner>
<summary>
Number of DB entries (in persistent namespaces) that have been missing their
@@ -79995,7 +82947,7 @@ uploading your change for review.
<histogram
name="OfflinePages.ConsistencyCheck.Temporary.PagesMissingArchiveFileCount"
- units="pages">
+ units="pages" expires_after="M78">
<owner>dimich@chromium.org</owner>
<summary>
Number of temporary offline pages without archive file when checking
@@ -80298,8 +83250,9 @@ uploading your change for review.
</histogram>
<histogram name="OfflinePages.LastN.IsSavingSamePage"
- enum="OfflinePagesLastNIsSavingSamePageEnum" expires_after="2019-05-31">
+ enum="OfflinePagesLastNIsSavingSamePageEnum" expires_after="2020-05-31">
<owner>carlosk@chromium.org</owner>
+ <owner>offline-dev@chromium.org</owner>
<summary>
Upon starting saving a new last_n offline page snapshot, report if that is
being done for a page that is new (a navigation happened) or for one that
@@ -80428,9 +83381,10 @@ uploading your change for review.
</histogram>
<histogram name="OfflinePages.OfflineUsage.NotOfflineResilient"
- enum="OfflinePagesOfflineUsage" expires_after="2019-05-31">
+ enum="OfflinePagesOfflineUsage" expires_after="2020-05-31">
<owner>carlosk@chromium.org</owner>
<owner>dimich@chromium.org</owner>
+ <owner>offline-dev@chromium.org</owner>
<summary>
Counts user-days when Chrome was used in specific ways regarding navigation
to online and offline content. Buckets are mutually exclusive so that only
@@ -80874,9 +83828,10 @@ uploading your change for review.
</histogram>
<histogram base="true" name="OfflinePages.SavePage.AddPageTime" units="ms"
- expires_after="2019-05-31">
+ expires_after="2020-05-31">
<owner>carlosk@chromium.org</owner>
<owner>dimich@chromium.org</owner>
+ <owner>offline-dev@chromium.org</owner>
<summary>
Time taken to successfully create the store metadata entry for an offline
page archive during the process of saving an offline page.
@@ -80884,9 +83839,10 @@ uploading your change for review.
</histogram>
<histogram base="true" name="OfflinePages.SavePage.ComputeDigestTime"
- units="ms" expires_after="2019-05-31">
+ units="ms" expires_after="2020-05-31">
<owner>carlosk@chromium.org</owner>
<owner>dimich@chromium.org</owner>
+ <owner>offline-dev@chromium.org</owner>
<summary>
Time taken to successfully compute the digest of an offline page archive
during the process of saving an offline page.
@@ -80894,9 +83850,10 @@ uploading your change for review.
</histogram>
<histogram base="true" name="OfflinePages.SavePage.CreateArchiveTime"
- units="ms" expires_after="2019-05-31">
+ units="ms" expires_after="2020-05-31">
<owner>carlosk@chromium.org</owner>
<owner>dimich@chromium.org</owner>
+ <owner>offline-dev@chromium.org</owner>
<summary>
Time taken to successfully create an offline page archive during the process
of saving an offline page.
@@ -80941,9 +83898,10 @@ uploading your change for review.
</histogram>
<histogram base="true" name="OfflinePages.SavePage.PublishArchiveTime"
- units="ms" expires_after="2019-05-31">
+ units="ms" expires_after="2020-05-31">
<owner>carlosk@chromium.org</owner>
<owner>dimich@chromium.org</owner>
+ <owner>offline-dev@chromium.org</owner>
<summary>
Time taken to successfully move an offline page archive to the public
downloads folder during the process of saving an offline page.
@@ -81183,7 +84141,7 @@ uploading your change for review.
<histogram
name="OfflinePages.WebsiteSettings.ConnectedWhenOpenOnlineButtonClicked"
- enum="BooleanConnected">
+ enum="BooleanConnected" expires_after="M78">
<owner>fgorski@chromium.org</owner>
<summary>
Indicates whether the browser was connected when Open online button was
@@ -81333,6 +84291,31 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Omnibox.CharTypedToRepaintLatency.InsertToPresent" units="ms">
+ <owner>asvitkine@chromium.org</owner>
+ <owner>mpearson@chromium.org</owner>
+ <owner>jdonnelly@chromium.org</owner>
+ <summary>
+ A refinement of Omnibox.CharTypedToRepaintLatency metric. It measures the
+ time between the first character insertion in a series that happen during a
+ frame, to the time the compositor reports the text was rendered on-screen.
+ Compositor-provided timestamps are used for this version of the metric, so
+ it is expected to be more accurate: the baseline CharTypedToRepaintLatency
+ uses now() from when the subsequent has-processed notification arrives back
+ on the UI thread, which may overestimate user-visible latency.
+ </summary>
+</histogram>
+
+<histogram name="Omnibox.CharTypedToRepaintLatency.PaintToPresent" units="ms">
+ <owner>asvitkine@chromium.org</owner>
+ <owner>mpearson@chromium.org</owner>
+ <owner>jdonnelly@chromium.org</owner>
+ <summary>
+ Records the time between when OnPaint() is called to the time the compositor
+ reports pixels were successfully drawn to the screen.
+ </summary>
+</histogram>
+
<histogram name="Omnibox.CharTypedToRepaintLatency.ToPaint" units="ms">
<owner>asvitkine@chromium.org</owner>
<owner>mpearson@chromium.org</owner>
@@ -81531,6 +84514,8 @@ uploading your change for review.
To know how common this last condition is, compare the total count of this
histogram to the total number of omnibox events.
+
+ Android started logging this in M76.
</summary>
</histogram>
@@ -81587,6 +84572,25 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Omnibox.IconOrFaviconShown" enum="SuggestionIconOrFaviconType"
+ expires_after="M83">
+ <owner>chrome-android-omnibox-team@google.com</owner>
+ <owner>ender@google.com</owner>
+ <owner>jdonnelly@google.com</owner>
+ <owner>mpearson@google.com</owner>
+ <summary>
+ Records suggestions decorated with specific icon or favicon at the time the
+ user exited the omnibox. Exiting the omnibox includes navigating (to entered
+ text or any suggestion), pressing the system back key, clearing omnibox,
+ blanking screen / locking the phone (whether intentionally or due to
+ inactivity), or closing the Chrome app. This metric is logged every time the
+ omnibox is exited, including when no answer is present in the list of
+ suggestions.
+
+ This histogram is related to Omnibox.SuggestionUsed.IconOrFaviconType.
+ </summary>
+</histogram>
+
<histogram name="Omnibox.InputType" enum="OmniboxInputType">
<owner>mpearson@chromium.org</owner>
<owner>jdonnelly@chromium.org</owner>
@@ -81620,7 +84624,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Omnibox.IsPopupOpen" enum="Boolean">
+<histogram name="Omnibox.IsPopupOpen" enum="Boolean" expires_after="M78">
<owner>mpearson@chromium.org</owner>
<owner>jdonnelly@chromium.org</owner>
<summary>
@@ -81863,6 +84867,27 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Omnibox.RichEntityShown" units="count" expires_after="M84">
+ <owner>chrome-android-omnibox-team@google.com</owner>
+ <owner>jdonnelly@google.com</owner>
+ <owner>mpearson@google.com</owner>
+ <summary>
+ Records number of presented Rich Entity suggestions at the time the user
+ exited the omnibox. Exiting the omnibox includes navigating (to entered text
+ or any suggestion), pressing the system back key, clearing omnibox, blanking
+ screen / locking the phone (whether intentionally or due to inactivity), or
+ closing the Chrome app. This metric is logged every time the omnibox is
+ exited, including when no entities are present in the list of suggestions.
+
+ Nota bene: in some circumstances this histogram is double counting on
+ purpose. Scenarios cover repetitive actions that expose same entity
+ suggestions, ie. leave-enter-leave application, or leave-enter-clear where
+ no new suggestion fetches are done.
+
+ This histogram is related to Omnibox.SuggestionUsed.RichEntity.
+ </summary>
+</histogram>
+
<histogram name="Omnibox.SaveStateForTabSwitch.UserInputInProgress"
units="count" expires_after="M77">
<owner>mpearson@chromium.org</owner>
@@ -81967,6 +84992,21 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Omnibox.SuggestionUsed.IconOrFaviconType"
+ enum="SuggestionIconOrFaviconType" expires_after="M83">
+ <owner>chrome-android-omnibox-team@google.com</owner>
+ <owner>ender@google.com</owner>
+ <owner>jdonnelly@google.com</owner>
+ <owner>mpearson@google.com</owner>
+ <summary>
+ Counts how often omnibox suggestions are used, and in the case a regular
+ search / url (not an Answer, Entity or any other specialized) suggestion was
+ selected - records how the suggestion was decorated.
+
+ This histogram is related to Omnibox.IconOrFaviconShown.
+ </summary>
+</histogram>
+
<histogram name="Omnibox.SuggestionUsed.NearbyURLCount" units="URLs"
expires_after="2017-02-23">
<obsolete>
@@ -82108,6 +85148,19 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Omnibox.SuggestionUsed.RichEntity" enum="BooleanUsage"
+ expires_after="M84">
+ <owner>chrome-android-omnibox-team@google.com</owner>
+ <owner>jdonnelly@google.com</owner>
+ <owner>mpearson@google.com</owner>
+ <summary>
+ Whether a Rich Entity omnibox suggestion was selected when the user used the
+ omnibox to go somewhere.
+
+ This histogram is related to Omnibox.RichEntityShown.
+ </summary>
+</histogram>
+
<histogram
name="Omnibox.SuggestionUsed.Search.Experimental.ForegroundToFirstMeaningfulPaint.Prerender"
units="ms">
@@ -82241,7 +85294,7 @@ uploading your change for review.
<histogram
name="Omnibox.SuggestionUsed.URL.Experimental.NavigationToFirstMeaningfulPaint"
- units="ms">
+ units="ms" expires_after="M78">
<owner>mpearson@chromium.org</owner>
<owner>jdonnelly@chromium.org</owner>
<summary>
@@ -82427,6 +85480,10 @@ uploading your change for review.
<histogram name="Omnibox.ZeroSuggest.Eligible.OnFocus"
enum="ZeroSuggestEligibleOnFocus">
+ <obsolete>
+ Deprecated 05/2019 because histogram was not recorded in every circumstance.
+ Superseded by Omnibox.ZeroSuggest.Eligible.OnFocusV2.
+ </obsolete>
<owner>mpearson@chromium.org</owner>
<owner>jdonnelly@chromium.org</owner>
<summary>
@@ -82453,6 +85510,39 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Omnibox.ZeroSuggest.Eligible.OnFocusV2"
+ enum="ZeroSuggestEligibleOnFocus" expires_after="2020-06-01">
+ <owner>mpearson@chromium.org</owner>
+ <owner>jdonnelly@chromium.org</owner>
+ <summary>
+ Whether the user has settings configured so that the current page URL can be
+ sent to the suggest server to request contextual suggestions. For example,
+ this is only supported for users who have Google as their default search
+ engine (unmodified version of Google), have search suggest enabled, are
+ signed-in and syncing without a custom passphrase, and don't have an
+ incognito window open. There are other criteria too. Recorded on focus in
+ the omnibox if there is default search provider and we've constructed a
+ suggest URL.
+
+ Some additional guidelines: if an incognito window is open, all focus events
+ will go into the &quot;generally ineligible&quot; bucket. Likewise, if the
+ current page is a search results page, we don't allow contextual suggestions
+ either so focus events on those pages go in the &quot;generally
+ ineligible&quot; bucket. The difference between &quot;eligible&quot; and
+ &quot;generally eligible but not this time&quot; depends only the properties
+ of the current URL.
+
+ Recorded regardless of whether contextual or non-contextual zero suggest is
+ currently enabled on the user's platform. However, if zero suggest (in all
+ forms) is entirely disabled, the user will be perpetually ineligible.
+
+ This histogram captures all scenarios that are generally ineligible for zero
+ suggest suggestions (including incognito mode), and reports eligibility for
+ suggestions even if kOmniboxPopupShortcutIconsInZeroState is enabled
+ (meaning: suggestions are not shown, but current URL is eligible).
+ </summary>
+</histogram>
+
<histogram name="Omnibox.ZeroSuggest.Eligible.OnProfileOpen"
enum="BooleanSupported">
<owner>mpearson@chromium.org</owner>
@@ -82638,6 +85728,17 @@ uploading your change for review.
<summary>Time spent on specific OOBE screen.</summary>
</histogram>
+<histogram name="OptimizationGuide.HintsLoadedPercentage" units="%"
+ expires_after="2019-12-31">
+ <owner>dougarnett@chromium.org</owner>
+ <owner>sophiechang@chromium.org</owner>
+ <summary>
+ The percentage (0-100) of hints loaded over all attempted page loads between
+ component updates. Recorded when the OptimizationGuideService receives a
+ component with a new version.
+ </summary>
+</histogram>
+
<histogram name="OptimizationGuide.ProcessHintsResult"
enum="OptimizationGuideProcessHintsResult">
<owner>dougarnett@chromium.org</owner>
@@ -83003,7 +86104,10 @@ uploading your change for review.
</histogram>
<histogram name="OutOfProcessHeapProfiling.ProfiledProcess.Type"
- enum="OutOfProcessHeapProfilingProcessType" expires_after="M77">
+ enum="HeapProfilingProcessType" expires_after="M77">
+ <obsolete>
+ Replaced with HeapProfiling.ProfiledProcess.Type.
+ </obsolete>
<owner>erikchen@chromium.org</owner>
<summary>
One metric is emitted every 24-hours after Chrome is launched for every
@@ -83012,7 +86116,10 @@ uploading your change for review.
</histogram>
<histogram name="OutOfProcessHeapProfiling.ProfilingMode"
- enum="OutOfProcessHeapProfilingMode" expires_after="M77">
+ enum="HeapProfilingMode" expires_after="M77">
+ <obsolete>
+ Replaced with HeapProfiling.ProfilingMode.
+ </obsolete>
<owner>erikchen@chromium.org</owner>
<summary>
One metric is emitted every 24-hours after Chrome is launched for every
@@ -83023,6 +86130,9 @@ uploading your change for review.
<histogram name="OutOfProcessHeapProfiling.RecordTrace.Success"
enum="BooleanSuccess" expires_after="M77">
+ <obsolete>
+ Replaced with HeapProfiling.RecordTrace.Success.
+ </obsolete>
<owner>erikchen@chromium.org</owner>
<summary>
The metric is emitted each time Chrome attempts to record a memory-infra
@@ -83032,6 +86142,9 @@ uploading your change for review.
<histogram name="OutOfProcessHeapProfiling.UploadTrace.Size" units="bytes"
expires_after="M77">
+ <obsolete>
+ Replaced with HeapProfiling.UploadTrace.Size.
+ </obsolete>
<owner>erikchen@chromium.org</owner>
<summary>
The metric is emitted each time Chrome uploads a trace. It reflects the
@@ -83041,6 +86154,9 @@ uploading your change for review.
<histogram name="OutOfProcessHeapProfiling.UploadTrace.Success"
enum="BooleanSuccess" expires_after="M77">
+ <obsolete>
+ Replaced with HeapProfiling.UploadTrace.Success.
+ </obsolete>
<owner>erikchen@chromium.org</owner>
<summary>
The metric is emitted each time Chrome uploads a trace. It reflects whether
@@ -83966,7 +87082,7 @@ uploading your change for review.
<histogram
name="PageLoad.Clients.AMP.Experimental.PageTiming.InputToNavigation.Subframe"
- units="ms">
+ units="ms" expires_after="M78">
<owner>bmcquade@chromium.org</owner>
<summary>
The time from the user input that triggers the top-level navigation for an
@@ -83978,7 +87094,7 @@ uploading your change for review.
<histogram
name="PageLoad.Clients.AMP.Experimental.PageTiming.MainFrameToSubFrameNavigationDelta.Subframe"
- units="ms">
+ units="ms" expires_after="M78">
<owner>bmcquade@chromium.org</owner>
<summary>
The time from the main frame navigation to the subsequent subframe
@@ -83989,7 +87105,7 @@ uploading your change for review.
<histogram
name="PageLoad.Clients.AMP.Experimental.PageTiming.NavigationToInput.Subframe"
- units="ms">
+ units="ms" expires_after="M78">
<owner>bmcquade@chromium.org</owner>
<summary>
The time from navigation in the AMP frame to the user input that triggers
@@ -84014,7 +87130,7 @@ uploading your change for review.
<histogram
name="PageLoad.Clients.AMP.InteractiveTiming.FirstInputDelay3.Subframe.FullNavigation"
- units="ms">
+ units="ms" expires_after="M78">
<owner>bmcquade@chromium.org</owner>
<summary>
Measures First Input Delay, the duration between the hardware timestamp and
@@ -84079,6 +87195,9 @@ uploading your change for review.
<histogram name="PageLoad.Clients.AMP.SameDocumentView"
enum="PageLoadMetricsAMPViewType" expires_after="M77">
+ <obsolete>
+ Deprecated 5/2019
+ </obsolete>
<owner>bmcquade@chromium.org</owner>
<summary>Count of same document page views for AMP pages.</summary>
</histogram>
@@ -84442,7 +87561,7 @@ uploading your change for review.
<histogram
name="PageLoad.Clients.LoFi.Experimental.CompletedResources.Network.LoFi"
- units="KB">
+ units="KB" expires_after="M78">
<owner>bengr@chromium.org</owner>
<owner>ryansturm@chromium.org</owner>
<summary>
@@ -84473,6 +87592,22 @@ uploading your change for review.
</summary>
</histogram>
+<histogram
+ name="PageLoad.Clients.Scheme.HTTP.PaintTiming.UnderStat.UserInitiated.NewNavigation"
+ enum="PageLoadTimingUnderStat" expires_after="2019-12-31">
+ <owner>dougarnett@chromium.org</owner>
+ <owner>tbansal@chromium.org</owner>
+ <summary>
+ Records if the time from navigation to first contentful paint was less than
+ the specified threshold. Also, records the total number of first contentful
+ paints. For a single first contentful paint event, data may be recorded in
+ multiple buckets. Recorded at the time when first contentful paint happens.
+ Recorded only for page loads that have scheme http://, are user-initiated,
+ and are new navigations (that is, they are not reloads nor forward or back
+ navigations).
+ </summary>
+</histogram>
+
<histogram name="PageLoad.Clients.Scheme.HTTPS.PaintTiming.UnderStat"
enum="PageLoadTimingUnderStat">
<owner>tbansal@chromium.org</owner>
@@ -84485,6 +87620,22 @@ uploading your change for review.
</summary>
</histogram>
+<histogram
+ name="PageLoad.Clients.Scheme.HTTPS.PaintTiming.UnderStat.UserInitiated.NewNavigation"
+ enum="PageLoadTimingUnderStat" expires_after="2019-12-31">
+ <owner>dougarnett@chromium.org</owner>
+ <owner>tbansal@chromium.org</owner>
+ <summary>
+ Records if the time from navigation to first contentful paint was less than
+ the specified threshold. Also, records the total number of first contentful
+ paints. For a single first contentful paint event, data may be recorded in
+ multiple buckets. Recorded at the time when first contentful paint happens.
+ Recorded only for page loads that have scheme https://, are user-initiated,
+ and are new navigations (that is, they are not reloads nor forward or back
+ navigations).
+ </summary>
+</histogram>
+
<histogram name="PageLoad.Clients.ServiceWorker.PageTransition"
enum="CorePageTransition" expires_after="2018-06-26">
<obsolete>
@@ -84566,14 +87717,16 @@ uploading your change for review.
<histogram base="true" name="PageLoad.Cpu" expires_after="2020-01-05">
<owner>ericrobinson</owner>
+ <owner>csharrison</owner>
<summary>
Only recorded if the page has at least one identified ad frame. Recorded in
PageLoadMetrics when the page is destroyed. Cpu measures the wall time of
- tasks attributable to a frame as reported by the MainThreadTaskScheduler. An
- ad frame consists of the identified ad frame and all of its children (which
- may also be ads, but are counted as part of the ancestor ad frame). Includes
- resources that did not finish loading. Does not consider time while a page
- is backgrounded.
+ tasks attributable to a frame as reported by the MainThreadTaskScheduler as
+ well as time spent servicing scripted animations by each document (not
+ attributable by the MainThreadTaskScheduler). An ad frame consists of the
+ identified ad frame and all of its children (which may also be ads, but are
+ counted as part of the ancestor ad frame). Includes resources that did not
+ finish loading. Does not consider time while a page is backgrounded.
</summary>
</histogram>
@@ -85921,7 +89074,7 @@ uploading your change for review.
<histogram
name="PageLoad.Internal.PaintTiming.HadUserInputBeforeFirstMeaningfulPaint"
- enum="HadUserInput">
+ enum="HadUserInput" expires_after="M78">
<owner>ksakamoto@chromium.org</owner>
<summary>
Whether the user had any interaction on the page before
@@ -85997,7 +89150,7 @@ uploading your change for review.
<histogram
name="PageLoad.Internal.Renderer.FirstMeaningfulPaintDetector.FirstMeaningfulPaintOrdering"
- enum="FirstMeaningfulPaintOrdering">
+ enum="FirstMeaningfulPaintOrdering" expires_after="M78">
<owner>ksakamoto@chromium.org</owner>
<summary>
Whether the two variants of First Meaningful Paint reported different
@@ -86007,7 +89160,7 @@ uploading your change for review.
<histogram
name="PageLoad.Internal.Renderer.FirstMeaningfulPaintDetector.HadNetworkQuiet"
- enum="NetworkQuietStatus">
+ enum="NetworkQuietStatus" expires_after="M78">
<owner>ksakamoto@chromium.org</owner>
<summary>
Recorded when the page load reached network 0-quiet (no active network
@@ -86245,7 +89398,7 @@ uploading your change for review.
<histogram
name="PageLoad.ParseTiming.ParseBlockedOnScriptExecutionFromDocumentWrite"
- units="ms">
+ units="ms" expires_after="M78">
<owner>bmcquade@chromium.org</owner>
<owner>csharrison@chromium.org</owner>
<summary>
@@ -86823,6 +89976,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="PaintHolding.CommitTrigger" enum="PaintHoldingCommitTrigger"
+ expires_after="M78">
+ <owner>schenney@chromium.org</owner>
+ <owner>paint-dev@chromium.org</owner>
+ <summary>
+ Records the reason that a commit was triggered, to enable research into
+ which event (non-same-origin, FCP, timeout, etc) led to the first commit.
+ </summary>
+</histogram>
+
<histogram name="Parser.AppendBytesDelay" units="ms" expires_after="2017-08-12">
<obsolete>
Deprecated Aug 2017
@@ -87437,13 +90600,24 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="PasswordManager.ApplySyncChanges.AddLoginSyncError"
+ enum="PasswordAddLoginSyncError" expires_after="M80">
+ <owner>mamir@chromium.org</owner>
+ <owner>mastiz@chromium.org</owner>
+ <summary>
+ Records different results upon adding a remote password to the password
+ manager. It is recorded every time after receiving remote password
+ incremental updates from the server.
+ </summary>
+</histogram>
+
<histogram name="PasswordManager.ApplySyncChangesState"
enum="PasswordApplySyncChangesState" expires_after="M80">
<owner>mamir@chromium.org</owner>
<owner>mastiz@chromium.org</owner>
<summary>
Records different states upon applying remote sync changes to the password
- manager. It recorded everytime after receiving remote password incremental
+ manager. It recorded every time after receiving remote password incremental
updates from the server.
</summary>
</histogram>
@@ -87480,7 +90654,10 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="PasswordManager.BlacklistedSites">
+<histogram name="PasswordManager.BlacklistedSites" expires_after="M76">
+ <obsolete>
+ Deprecated in M76 in favor of PasswordManager.BlacklistedSitesHiRes.
+ </obsolete>
<owner>jdoerrie@chromium.org</owner>
<owner>vasilii@chromium.org</owner>
<summary>
@@ -87489,6 +90666,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="PasswordManager.BlacklistedSites.NeedNormalization"
+ enum="BooleanNeedsNormalization" expires_after="M80">
+ <owner>jdoerrie@chromium.org</owner>
+ <owner>vasilii@chromium.org</owner>
+ <summary>
+ Records once on startup whether the blacklisted sites in the password store
+ need to be normalized.
+ </summary>
+</histogram>
+
<histogram
name="PasswordManager.BlacklistedSites.NeedRemoveBlacklistDuplicates"
enum="BooleanNeedsDeDuplication" expires_after="M73">
@@ -87530,6 +90717,54 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="PasswordManager.BlacklistedSitesHiRes">
+ <owner>jdoerrie@chromium.org</owner>
+ <owner>vasilii@chromium.org</owner>
+ <summary>
+ The total number of sites that the user has blacklisted. Recorded by
+ iterating over stored passwords once per run of Chrome.
+ </summary>
+</histogram>
+
+<histogram base="true"
+ name="PasswordManager.BubbleSuppression.AccountsInStatisticsTable"
+ units="accounts" expires_after="M78">
+ <owner>battre@chromium.org</owner>
+ <owner>vasilii@chromium.org</owner>
+ <summary>
+ The number of accounts stored in password_manager::StatisticsTable. These
+ are accounts for which the user ignored the save bubble at least once. The
+ count is recorded once per browser start-up. (In case of multiple profiles,
+ the counts are for the profile that first has a WebContents created.)
+ </summary>
+</histogram>
+
+<histogram base="true"
+ name="PasswordManager.BubbleSuppression.AccountsWithSuppressedBubble"
+ units="accounts" expires_after="M86">
+ <owner>battre@chromium.org</owner>
+ <owner>vasilii@chromium.org</owner>
+ <summary>
+ The number of accounts that do not trigger password save prompts anymore.
+ The count is recorded once per browser start-up. (In case of multiple
+ profiles, the counts are for the profile that first has a WebContents
+ created.)
+ </summary>
+</histogram>
+
+<histogram base="true"
+ name="PasswordManager.BubbleSuppression.DomainsWithSuppressedBubble"
+ units="accounts" expires_after="M86">
+ <owner>battre@chromium.org</owner>
+ <owner>vasilii@chromium.org</owner>
+ <summary>
+ The number of domains for which at least one account exists that does not
+ trigger password save prompts anymore. The count is recorded once per
+ browser start-up. (In case of multiple profiles, the counts are for the
+ profile that first has a WebContents created.)
+ </summary>
+</histogram>
+
<histogram name="PasswordManager.ButtonTitlePerformance.HasFormTag"
expires_after="2019-07-01">
<owner>kolos@chromium.org</owner>
@@ -87590,7 +90825,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="PasswordManager.DynamicFormChanges" expires_after="M75">
+<histogram name="PasswordManager.DynamicFormChanges" expires_after="M78">
<owner>battre@chromium.org</owner>
<owner>dvadym@chromium.org</owner>
<summary>
@@ -87623,7 +90858,7 @@ uploading your change for review.
<histogram
name="PasswordManager.EmptyUsernames.FormWithoutUsernameFieldIsPasswordChangeForm"
- enum="PasswordManagerEmptyUsernamePasswordChangeForm">
+ enum="PasswordManagerEmptyUsernamePasswordChangeForm" expires_after="M78">
<owner>msramek@chromium.org</owner>
<owner>vasilii@chromium.org</owner>
<summary>
@@ -87761,7 +90996,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.FirstRendererFillingResult"
- enum="PasswordManagerFirstRendererFillingResult" expires_after="M76">
+ enum="PasswordManagerFirstRendererFillingResult" expires_after="M86">
<owner>battre@chromium.org</owner>
<owner>dvadym@chromium.org</owner>
<summary>
@@ -87774,7 +91009,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.FirstWaitForUsernameReason"
- enum="PasswordManagerFirstWaitForUsernameReason" expires_after="M76">
+ enum="PasswordManagerFirstWaitForUsernameReason" expires_after="M86">
<owner>battre@chromium.org</owner>
<owner>dvadym@chromium.org</owner>
<summary>
@@ -88074,8 +91309,9 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.LinuxBackendMigration.Adoption"
- enum="LinuxPasswordsMigrationToEncryptionStatus" expires_after="2019-06-01">
+ enum="LinuxPasswordsMigrationToEncryptionStatus" expires_after="2019-11-01">
<owner>cfroussios@chromium.org</owner>
+ <owner>dvadym@chromium.org</owner>
<summary>
Whether the password store has been migrated to an encrypted login database.
This is recorded on startup, before any migration attempts.
@@ -88083,8 +91319,9 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.LinuxBackendMigration.AttemptResult"
- enum="LinuxPasswordsMigrationToEncryptionStatus" expires_after="2019-06-01">
+ enum="LinuxPasswordsMigrationToEncryptionStatus" expires_after="2019-11-01">
<owner>cfroussios@chromium.org</owner>
+ <owner>dvadym@chromium.org</owner>
<summary>
Whether the password store has been migrated to an encrypted login database.
This is recorded at the end of a migration attempt.
@@ -88092,8 +91329,9 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.LinuxBackendMigration.TimeIntoEncrypted"
- expires_after="2019-06-01">
+ expires_after="2019-11-01">
<owner>cfroussios@chromium.org</owner>
+ <owner>dvadym@chromium.org</owner>
<summary>
The time it took to read credentials from the native backend and write them
into the encrypted login database. This is logged once per migration
@@ -88103,8 +91341,9 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.LinuxBackendMigration.TimeIntoNative"
- expires_after="2019-06-01">
+ expires_after="2019-11-01">
<owner>cfroussios@chromium.org</owner>
+ <owner>dvadym@chromium.org</owner>
<summary>
The time it took to read credentials from the unencrypted login database and
insert them into the native backend. This is logged once per migration
@@ -88189,6 +91428,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="PasswordManager.MergeSyncData.AddLoginSyncError"
+ enum="PasswordAddLoginSyncError" expires_after="M80">
+ <owner>mamir@chromium.org</owner>
+ <owner>mastiz@chromium.org</owner>
+ <summary>
+ Records different results upon adding a remote password to the password
+ manager. It is recorded during the initial sync when merging remote and
+ local data.
+ </summary>
+</histogram>
+
<histogram name="PasswordManager.MultiAccountPasswordUpdateAction"
enum="MultiAccountUpdateBubbleUserAction" expires_after="2018-03-29">
<obsolete>
@@ -88267,7 +91517,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.PasswordDropdownItemSelected"
- enum="PasswordDropdownSelectedOption" expires_after="2019-07-01">
+ enum="PasswordDropdownSelectedOption" expires_after="2019-12-01">
<owner>dvadym@chromium.org</owner>
<owner>vasilii@chromium.org</owner>
<summary>
@@ -88276,7 +91526,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.PasswordDropdownShown"
- enum="PasswordDropdownState" expires_after="2019-07-01">
+ enum="PasswordDropdownState" expires_after="2019-12-01">
<owner>dvadym@chromium.org</owner>
<owner>vasilii@chromium.org</owner>
<summary>Logs the state of the password dropdown when it's shown.</summary>
@@ -88408,7 +91658,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.PrefilledUsernameFillOutcome"
- enum="PrefilledUsernameFillOutcome">
+ enum="PrefilledUsernameFillOutcome" expires_after="M78">
<owner>ioanap@chromium.org</owner>
<summary>
Records successful fills of prefilled username values known as placeholders
@@ -88624,7 +91874,7 @@ uploading your change for review.
<histogram
name="PasswordManager.ShouldBlockPasswordForSameOriginButDifferentScheme"
- enum="BooleanBlocked">
+ enum="BooleanBlocked" expires_after="M78">
<owner>jdoerrie@chromium.org</owner>
<summary>
This metric is recorded every time Chrome detects a password form
@@ -88737,6 +91987,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="PasswordManager.StoreDecryptionResult"
+ enum="PasswordDecryptionResult" expires_after="2019-11-01">
+ <owner>cfroussios@chromium.org</owner>
+ <owner>dvadym@chromium.org</owner>
+ <summary>
+ Describes the result of decrypting a password value from the LoginDatabase.
+ </summary>
+</histogram>
+
<histogram name="PasswordManager.StorePasswordImportedFromCSVResult"
enum="BooleanSuccess" expires_after="2017-09-20">
<obsolete>
@@ -88750,7 +92009,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.StorePerformance.AddLogin"
- expires_after="2019-06-01">
+ expires_after="2019-11-01">
<owner>cfroussios@chromium.org</owner>
<owner>dvadym@chromium.org</owner>
<summary>
@@ -88760,7 +92019,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.StorePerformance.GetLogin"
- expires_after="2019-06-01">
+ expires_after="2019-11-01">
<owner>cfroussios@chromium.org</owner>
<owner>dvadym@chromium.org</owner>
<summary>
@@ -88770,7 +92029,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.StorePerformance.GetLogins"
- expires_after="2019-06-01">
+ expires_after="2019-11-01">
<owner>cfroussios@chromium.org</owner>
<owner>dvadym@chromium.org</owner>
<summary>
@@ -88780,7 +92039,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.StorePerformance.RemoveLogin"
- expires_after="2019-06-01">
+ expires_after="2019-11-01">
<owner>cfroussios@chromium.org</owner>
<owner>dvadym@chromium.org</owner>
<summary>
@@ -88790,7 +92049,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.StorePerformance.UpdateLogin"
- expires_after="2019-06-01">
+ expires_after="2019-11-01">
<owner>cfroussios@chromium.org</owner>
<owner>dvadym@chromium.org</owner>
<summary>
@@ -88946,7 +92205,7 @@ uploading your change for review.
</histogram>
<histogram name="PasswordManager.TimeBetweenStoreAndServer" units="ms"
- expires_after="2019-05-01">
+ expires_after="2019-10-01">
<owner>battre@chromium.org</owner>
<owner>dvadym@chromium.org</owner>
<summary>
@@ -88989,7 +92248,20 @@ uploading your change for review.
</summary>
</histogram>
-<histogram base="true" name="PasswordManager.TotalAccounts">
+<histogram base="true" name="PasswordManager.TotalAccounts" expires_after="M76">
+ <obsolete>
+ Deprecated in M76 in favor of PasswordManager.TotalAccountsHiRes.ByType.
+ </obsolete>
+ <owner>battre@chromium.org</owner>
+ <owner>vasilii@chromium.org</owner>
+ <summary>
+ The number of accounts stored in the password manager (across all sites),
+ split by whether created by the user or generated by Chrome, and further by
+ whether the user used sync with custom passphrase or not.
+ </summary>
+</histogram>
+
+<histogram base="true" name="PasswordManager.TotalAccountsHiRes.ByType">
<owner>battre@chromium.org</owner>
<owner>vasilii@chromium.org</owner>
<summary>
@@ -89097,6 +92369,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="PasswordProtection.DomFeatureExtractionDuration" units="ms"
+ expires_after="M78">
+ <owner>drubery@chromium.org</owner>
+ <owner>chrome-safebrowsing-alerts@google.com</owner>
+ <summary>
+ The time it takes to extract the DOM features of a login page before sending
+ a PasswordProtectionRequest. Logged on every password reuse PhishGuard ping.
+ </summary>
+</histogram>
+
<histogram
name="PasswordProtection.GaiaPasswordReusesBeforeGaiaPasswordChanged"
units="reuses">
@@ -89473,6 +92755,21 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="PaymentRequest.JourneyLoggerHasRecorded" enum="Boolean">
+ <owner>sahel@chromium.org</owner>
+ <summary>
+ Whether a journey logger has recorded an events bit field or not.
+ </summary>
+</histogram>
+
+<histogram name="PaymentRequest.JourneyLoggerHasRecordedMultipleTimes"
+ enum="Boolean">
+ <owner>sahel@chromium.org</owner>
+ <summary>
+ When a journey logger attempts to record multiple events bit fields.
+ </summary>
+</histogram>
+
<histogram name="PaymentRequest.NumberOfSelectionAdds">
<owner>sebsg@chromium.org</owner>
<summary>
@@ -89774,6 +93071,58 @@ uploading your change for review.
</summary>
</histogram>
+<histogram
+ name="PerformanceManager.BrowsingInstancePluralityVisibilityState.ByPageTime"
+ enum="BrowsingInstancePluralityVisibilityState" expires_after="2019-09-30">
+ <owner>chrisha@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
+ <summary>
+ Tracks the plurality and visibility state of all BrowsingInstances over
+ time. An entry in each bucket corresponds to a page in a BrowsingInstance
+ being in that state for one second. This is effectively &quot;page
+ seconds&quot; of time spent in each state. Recorded on state changes and
+ every 5 minutes.
+ </summary>
+</histogram>
+
+<histogram
+ name="PerformanceManager.BrowsingInstancePluralityVisibilityState.ByTime"
+ enum="BrowsingInstancePluralityVisibilityState" expires_after="2019-09-30">
+ <owner>chrisha@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
+ <summary>
+ Tracks the plurality and visibility state of all BrowsingInstances over
+ time. An entry in each bucket corresponds to a BrowsingInstance being in
+ that state for one second. Recorded on state changes and every 5 minutes.
+ </summary>
+</histogram>
+
+<histogram
+ name="PerformanceManager.FrameSiteInstanceProcessRelationship.ByProcess"
+ enum="FrameSiteInstanceProcessRelationship" expires_after="2019-09-30">
+ <owner>chrisha@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
+ <summary>
+ Tracks the types of frames that are being hosted by a process over its
+ entire lifetime. An entry in the
+ &quot;AllFramesHaveDistinctSiteInstances&quot; means that the process only
+ ever hosted frames with distinct site instances over its entire lifetime.
+ Recorded on state changes and every 5 minutes.
+ </summary>
+</histogram>
+
+<histogram
+ name="PerformanceManager.FrameSiteInstanceProcessRelationship.ByTime"
+ enum="FrameSiteInstanceProcessRelationship" expires_after="2019-09-30">
+ <owner>chrisha@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
+ <summary>
+ Tracks the types of frames that are being hosted by a process, aggregated
+ over time. Each entry in each bucket corresponds to a process being in that
+ state for one second. Recorded on state changes and every 5 minutes.
+ </summary>
+</histogram>
+
<histogram name="PerformanceMonitor.AverageCPU" units="PercentCPUUsage">
<owner>oysteine@chromium.org</owner>
<summary>
@@ -90731,7 +94080,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Platform.CumulativeCpuTime" units="seconds">
+<histogram name="Platform.CumulativeCpuTime" units="seconds"
+ expires_after="M78">
<owner>semenzato@chromium.org</owner>
<owner>bsimonnet@chromium.org</owner>
<summary>
@@ -91095,6 +94445,70 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Platform.Memory.ARC" units="MiB" expires_after="2020-11-01">
+<!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
+
+ <owner>semenzato@chromium.org</owner>
+ <owner>sonnyrao@chromium.org</owner>
+ <summary>
+ Memory usage of all ARC processes in Chrome OS, reported every 10 minutes.
+ </summary>
+</histogram>
+
+<histogram name="Platform.Memory.Browser" units="MiB"
+ expires_after="2020-11-01">
+<!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
+
+ <owner>semenzato@chromium.org</owner>
+ <owner>sonnyrao@chromium.org</owner>
+ <summary>
+ Memory usage of browser and helper processes (excluding GPU process and
+ renderers) in Chrome OS, reported every 10 minutes.
+ </summary>
+</histogram>
+
+<histogram name="Platform.Memory.Daemons" units="MiB"
+ expires_after="2020-11-01">
+<!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
+
+ <owner>semenzato@chromium.org</owner>
+ <owner>sonnyrao@chromium.org</owner>
+ <summary>
+ Memory usage of user-level daemons in Chrome OS, reported every 10 minutes.
+ </summary>
+</histogram>
+
+<histogram name="Platform.Memory.Gpu" units="MiB" expires_after="2020-11-01">
+<!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
+
+ <owner>semenzato@chromium.org</owner>
+ <owner>sonnyrao@chromium.org</owner>
+ <summary>
+ Memory usage of the GPU process in Chrome OS, reported every 10 minutes.
+ </summary>
+</histogram>
+
+<histogram name="Platform.Memory.Renderers" units="MiB"
+ expires_after="2020-11-01">
+<!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
+
+ <owner>semenzato@chromium.org</owner>
+ <owner>sonnyrao@chromium.org</owner>
+ <summary>
+ Memory usage of renderer processes in Chrome OS, reported every 10 minutes.
+ </summary>
+</histogram>
+
+<histogram name="Platform.Memory.VMs" units="MiB" expires_after="2020-11-01">
+<!-- Name completed by histogram_suffixes name="ProcessMemoryType" -->
+
+ <owner>semenzato@chromium.org</owner>
+ <owner>sonnyrao@chromium.org</owner>
+ <summary>
+ Memory usage of VMs (crostini) in Chrome OS, reported every 10 minutes.
+ </summary>
+</histogram>
+
<histogram name="Platform.MemoryBandwidth.ReadWrite" units="MB/s">
<owner>hajimehoshi@chromium.org</owner>
<owner>kouhei@chromium.org</owner>
@@ -94159,6 +97573,38 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="PluginVm.Image.DownloadedSize" units="MB"
+ expires_after="2019-12-01">
+ <owner>aoldemeier@chromium.org</owner>
+ <owner>okalitova@chromium.org</owner>
+ <owner>timloh@chromium.org</owner>
+ <summary>
+ The size of the PluginVm image downloaded in MB. Recorded each time PluginVm
+ image is sucessfully downloaded.
+ </summary>
+</histogram>
+
+<histogram name="PluginVm.LaunchResult" enum="PluginVmLaunchResult"
+ expires_after="2019-12-01">
+ <owner>aoldemeier@chromium.org</owner>
+ <owner>okalitova@chromium.org</owner>
+ <owner>timloh@chromium.org</owner>
+ <summary>
+ Recorded at each attempt to launch PluginVm, recording whether this attempt
+ is successful or not.
+ </summary>
+</histogram>
+
+<histogram name="PluginVm.SetupResult" enum="PluginVmSetupResult"
+ expires_after="2019-12-01">
+ <owner>aoldemeier@chromium.org</owner>
+ <owner>okalitova@chromium.org</owner>
+ <owner>timloh@chromium.org</owner>
+ <summary>
+ Recorded at each attempt to set up PluginVm, recording the setup result.
+ </summary>
+</histogram>
+
<histogram name="Power.BacklightLevelOnAC" units="%">
<owner>derat@chromium.org</owner>
<summary>
@@ -94290,6 +97736,22 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Power.BatteryPercentDrop" units="%">
+ <owner>ryansturm@chromium.org</owner>
+ <owner>tbansal@chromium.org</owner>
+ <summary>
+ The drop in battery since the last operating system battery update as a
+ percent of total device battery. If the drop is not a round percentage
+ point, the unreported amount will be carried over until the battery level
+ drops by a full percentage point. Recorded when the battery level drops by
+ more than a percentage point. If the user charges the device, the battery
+ tracking is reset (the amount carried over is reset). This histograms sum is
+ most likely the most useful figure when comparing experiments. Recorded even
+ when Chrome is in the background. Not recorded on Windows. TODO: record on
+ Windows: https://crbug.com/794105.
+ </summary>
+</histogram>
+
<histogram name="Power.BatteryRemainingAtEndOfSessionOnAC" units="%">
<owner>derat@chromium.org</owner>
<summary>
@@ -94704,7 +98166,8 @@ uploading your change for review.
<owner>sdy@chromium.org</owner>
<summary>
Instantaneous power consution in milliwatts, for the system as a whole and
- broken down by component. Only recorded on macOS.
+ broken down by component. Only recorded on macOS. NB: The collection method
+ was changed in May 2019, which may look like a regression in timeline view.
</summary>
</histogram>
@@ -94719,6 +98182,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Power.Mac.ThermalState" enum="MacThermalState"
+ expires_after="2020-05-13">
+ <owner>lgrey@chromium.org</owner>
+ <owner>sdy@chromium.org</owner>
+ <summary>
+ Thermal state of the user's machine as reported by macOS's [NSProcessInfo
+ thermalState]. Sampled once per minute.
+ </summary>
+</histogram>
+
<histogram name="Power.MetricsDailyEventInterval" enum="DailyEventIntervalType"
expires_after="M77">
<owner>derat@chromium.org</owner>
@@ -96896,6 +100369,9 @@ uploading your change for review.
</histogram>
<histogram name="Previews.InfoBarAction" enum="PreviewsInfoBarAction">
+ <obsolete>
+ Removed in M76.
+ </obsolete>
<owner>bengr@chromium.org</owner>
<owner>tbansal@chromium.org</owner>
<summary>
@@ -96928,6 +100404,40 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Previews.Offline.CommittedErrorPage" enum="BooleanError"
+ expires_after="M77">
+ <owner>harrisonsean@chromium.org</owner>
+ <owner>robertogden@chromium.org</owner>
+ <summary>
+ Whether or not an offline preview that was committed showed an error page.
+ This metric is recorded every time an offline preview is committed.
+ </summary>
+</histogram>
+
+<histogram name="Previews.Offline.FalsePositivePrevention.Allowed"
+ enum="BooleanAllowed" expires_after="M80">
+ <owner>robertogden@chromium.org</owner>
+ <owner>ryansturm@chromium.org</owner>
+ <summary>
+ Whether or not the navigated URL was allowed to trigger an offline preview.
+ This is done by checking an in-memory cache of all available offline
+ previews which is designed to prevent false positive triggering. This metric
+ is recorded on every preview eligible navigation when the
+ OfflinePreviewsFalsePositivePrevention feature is enabled.
+ </summary>
+</histogram>
+
+<histogram name="Previews.Offline.FalsePositivePrevention.PrefSize"
+ units="count of entries" expires_after="M80">
+ <owner>robertogden@chromium.org</owner>
+ <owner>ryansturm@chromium.org</owner>
+ <summary>
+ The number of entries in the false positive prevention pref. This is
+ recorded every time we update the pref from a DB query, at most once per
+ session.
+ </summary>
+</histogram>
+
<histogram name="Previews.OmniboxAction" enum="PreviewsUserOmniboxAction">
<owner>robertogden@chromium.org</owner>
<summary>User interactions with the Previews Android Omnibox UI.</summary>
@@ -96959,6 +100469,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram
+ name="Previews.OptimizationGuide.HintCache.FetchedHint.TimeToExpiration"
+ units="seconds" expires_after="M79">
+ <owner>mcrouse@chromium.org</owner>
+ <owner>dougarnett@chromium.org</owner>
+ <summary>
+ The remaining time a fetched hint that was loaded for use has before it
+ expires and is removed from the hint cache store.
+ </summary>
+</histogram>
+
<histogram name="Previews.OptimizationGuide.HintCache.HasHint.AtCommit"
enum="NQEEffectiveConnectionType">
<owner>dougarnett@chromium.org</owner>
@@ -96978,6 +100499,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Previews.OptimizationGuide.HintCache.HintType.Loaded"
+ enum="HintCacheStoreEntryType" expires_after="M79">
+ <owner>mcrouse@chromium.org</owner>
+ <owner>dougarnett@chromium.org</owner>
+ <summary>
+ Records the store entry type of a hint when it is loaded from the hint cache
+ store.
+ </summary>
+</histogram>
+
<histogram name="Previews.OptimizationGuide.HintCache.HostMatch.AtCommit"
enum="NQEEffectiveConnectionType">
<owner>dougarnett@chromium.org</owner>
@@ -97372,6 +100903,18 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Printing.CUPS.ValidPpdReference" enum="BooleanSuccess"
+ expires_after="2019-09-01">
+ <owner>skau@chromium.org</owner>
+ <owner>luum@chromium.org</owner>
+ <summary>
+ Tracks printer setups with a valid/invalid PpdReference. PpdReferences are
+ invalid if more than one field is specified. Due to a bug, some invalid
+ references could be saved in users' profile, track if they need to be
+ migrated. Recorded during printer install. Only tracked on ChromeOS.
+ </summary>
+</histogram>
+
<histogram name="Printing.PrinterCapabilities" units="ms" expires_after="M77">
<owner>vkuzkokov@chromium.org</owner>
<owner>skau@chromium.org</owner>
@@ -97847,6 +101390,24 @@ uploading your change for review.
<summary>Size of the bookmarks database.</summary>
</histogram>
+<histogram name="Profile.BrowserActive.PerProfile" units="Profile ID"
+ expires_after="2020-06-30">
+ <owner>msarda@chromium.org</owner>
+ <owner>tangltom@chromium.org</owner>
+ <summary>
+ Recorded every time a browser window becomes active. Each profile on a
+ client is assigned a unique bucket, i.e. whenever a browser window of
+ profile x becomes active, an entry is recorded in bucket x.
+
+ Example: A user has 2 profiles and opens 1 browser window for each of them.
+ When the user switches back and forth between the windows, multiple entries
+ will be recorded in bucket 1 and 2, corresponding to the profiles.
+
+ Note: The guest profile has bucket 0. Regular profiles start at bucket 1.
+ Incognito browser windows count towards the original profile.
+ </summary>
+</histogram>
+
<histogram name="Profile.CookiesSize" units="MB" expires_after="2018-08-30">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<summary>Size of the cookies database.</summary>
@@ -98005,6 +101566,16 @@ uploading your change for review.
<summary>Size of the history database.</summary>
</histogram>
+<histogram name="Profile.Incognito.Lifetime" units="minutes"
+ expires_after="M80">
+ <owner>rhalavati@chromium.org</owner>
+ <owner>msramek@chromium.org</owner>
+ <summary>
+ This histogram records the lifetime duration of incognito profiles. It is
+ recorded once an off the record profile for an incognito session is closed.
+ </summary>
+</histogram>
+
<histogram name="Profile.InitProfileUserPrefs.OutsideUserDir" enum="BooleanHit"
expires_after="M77">
<owner>anthonyvd@chromium.org</owner>
@@ -98935,7 +102506,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="PushMessaging.UnregistrationGCMResult" enum="GCMClientResult">
+<histogram name="PushMessaging.UnregistrationGCMResult" enum="GCMClientResult"
+ expires_after="M78">
<owner>peter@chromium.org</owner>
<summary>
When unregistering a legacy non-InstanceID push messaging subscription, this
@@ -99637,6 +103209,52 @@ uploading your change for review.
<summary>Log each stage of a recovery component event.</summary>
</histogram>
+<histogram name="RecurrenceRanker.ConfigurationError"
+ enum="RecurrenceRankerConfigurationError">
+ <owner>tby@chromium.org</owner>
+ <owner>charleszhao@chromium.org</owner>
+ <summary>
+ Reports different kinds of misconfigurations of a RecurrenceRanker.
+ </summary>
+</histogram>
+
+<histogram name="RecurrenceRanker.LogFileOpenType" enum="FileOpenType"
+ expires_after="2019-12-31">
+ <owner>jiameng@chromium.org</owner>
+ <owner>thanhdng@chromium.org</owner>
+ <owner>tby@chromium.org</owner>
+ <summary>
+ Records number of file opens for each file open type events.
+ </summary>
+</histogram>
+
+<histogram name="RecurrenceRanker.SerializationError"
+ enum="RecurrenceRankerSerializationError">
+ <owner>tby@chromium.org</owner>
+ <owner>charleszhao@chromium.org</owner>
+ <summary>
+ Reports various saving/loading errors for a RecurrenceRanker or
+ RecurrencePredictor.
+ </summary>
+</histogram>
+
+<histogram name="RecurrenceRanker.UsageError" enum="RecurrenceRankerUsageError">
+ <owner>tby@chromium.org</owner>
+ <owner>charleszhao@chromium.org</owner>
+ <summary>
+ Reports when a RecurrenceRanker is used in a way not supported by its
+ underlying RecurrencePredictor.
+ </summary>
+</histogram>
+
+<histogram name="Referrer.HeaderLength" units="bytes">
+ <owner>mkwst@chromium.org</owner>
+ <summary>
+ The size of each outgoing request's 'Referer' header field's value, in
+ bytes.
+ </summary>
+</histogram>
+
<histogram base="true" name="RelaunchNotification.ShowResult"
enum="RelaunchNotificationShowResult">
<owner>grt@chromium.org</owner>
@@ -100341,7 +103959,7 @@ uploading your change for review.
</histogram>
<histogram name="Renderer4.GpuRasterizationSlowPathsWithNonAAPaint"
- enum="BooleanHasSlowPathsWithNonAAPaint">
+ enum="BooleanHasSlowPathsWithNonAAPaint" expires_after="M78">
<owner>ericrk@chromium.org</owner>
<owner>enne@chromium.org</owner>
<summary>
@@ -100552,6 +104170,30 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="Renderer4.MomentumScrollJankPercentage" units="%">
+ <owner>ericrk@chromium.org</owner>
+ <summary>
+ The percentage of input events which are janks (not processed in the
+ expected frame) during each momentum scroll gesture. Computed by tracking
+ the number of extra coalesced momentum scroll events during a gesture. Extra
+ coalesced event indicates that the events were not handled in the target
+ frame. Logged once after a scroll with momentum events completes.
+ </summary>
+</histogram>
+
+<histogram name="Renderer4.MomentumScrollOrderingJankPercentage" units="%"
+ expires_after="2019-07-30">
+ <owner>ericrk@chromium.org</owner>
+ <summary>
+ The percentage of input events which are janks (not processed in the
+ expected frame) during each momentum scroll gesture due to unstable ordering
+ of begin frame with regards to input delivery. Computed by tracking the
+ number of times we coalesce an extra input event close to the point at which
+ we process it. Added to track the impact of https://crbug.com/952930. Logged
+ once after a scroll with momentum events completes.
+ </summary>
+</histogram>
+
<histogram name="Renderer4.pixelCountCulled_Draw" units="NormalizedPixels">
<owner>wiltzius@chromium.org</owner>
<summary>
@@ -101218,6 +104860,20 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="RendererScheduler.QueueingDurationPerQueueType"
+ units="ms" expires_after="2020-06-01">
+<!-- Name completed by histogram_suffixes name="RendererScheduler.QueueType" -->
+
+ <owner>kdillon@chromium.org</owner>
+ <owner>shaseley@chromium.org</owner>
+ <summary>
+ Tracks the queueing time of tasks on the main thread of the renderer broken
+ down by queue type. Reported when the task is completed.
+
+ Note that this metric is only recorded when a renderer is not backgrounded.
+ </summary>
+</histogram>
+
<histogram name="RendererScheduler.QueueingDurationWhenExpectedQueueingTime"
units="ms" expires_after="2017-08-03">
<obsolete>
@@ -102075,7 +105731,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="RenderTextHarfBuzz.GetFallbackFontsTime" units="ms">
+<histogram name="RenderTextHarfBuzz.GetFallbackFontsTime" units="ms"
+ expires_after="2019-11-02">
<owner>ccameron@chromium.org</owner>
<owner>etienneb@chromium.org</owner>
<summary>
@@ -102085,7 +105742,19 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="RenderTextHarfBuzz.ShapeRunsWithFallbackFontsTime" units="ms">
+<histogram name="RenderTextHarfBuzz.GetFallbackFontTime" units="ms"
+ expires_after="2019-11-02">
+ <owner>ccameron@chromium.org</owner>
+ <owner>etienneb@chromium.org</owner>
+ <summary>
+ Time retrieve the prefered fallback font on the system used for
+ RenderTextHarfBuzz::ShapeRuns. Fallback font is determined based on the
+ input text and locale.
+ </summary>
+</histogram>
+
+<histogram name="RenderTextHarfBuzz.ShapeRunsWithFallbackFontsTime" units="ms"
+ expires_after="2019-11-02">
<owner>ccameron@chromium.org</owner>
<owner>etienneb@chromium.org</owner>
<summary>
@@ -102123,11 +105792,13 @@ uploading your change for review.
<histogram name="RenderViewContextMenu.Shown" enum="RenderViewContextMenuItem">
<owner>avi@chromium.org</owner>
+ <owner>mpearson@chromium.org</owner>
<summary>Count of renderer view context menu items shown.</summary>
</histogram>
<histogram name="RenderViewContextMenu.Used" enum="RenderViewContextMenuItem">
<owner>avi@chromium.org</owner>
+ <owner>mpearson@chromium.org</owner>
<summary>
Count of renderer view context menu items (Only commands now) used.
</summary>
@@ -102207,6 +105878,118 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="ReportingAndNEL.BackingStoreUpdateOutcome"
+ enum="NetReportingAndNelBackingStoreUpdateOutcome" expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ The outcome of updating the backing store. This is recorded whenever a batch
+ of pending operations is committed to the backing store. Success occurs when
+ all operations are committed successfully. Trouble is recorded when some
+ operations are unsuccessful but committing the batch succeeds. Failure is
+ recorded when the commit fails.
+ </summary>
+</histogram>
+
+<histogram name="ReportingAndNEL.CorruptMetaTable" expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ Records the detection of a corrupted meta table for the Reporting and NEL
+ DB. This is recorded when database migration fails to update the database to
+ the current version.
+ </summary>
+</histogram>
+
+<histogram name="ReportingAndNEL.CorruptMetaTableRecoveryFailed"
+ expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ Records a failure to recover a corrupted meta table for the Reporting and
+ NEL DB. This is recorded when a corrupt meta table is detected (see
+ ReportingAndNEL.CorruptMetaTable), and attempting to recover by deleting and
+ reinitializing the database fails.
+ </summary>
+</histogram>
+
+<histogram name="ReportingAndNEL.DBSizeInKB" units="KB" expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ Size on disk of the Reporting and NEL database. This is recorded when the
+ database is initialized, which typically happens upon the first network
+ request after startup.
+ </summary>
+</histogram>
+
+<histogram name="ReportingAndNEL.InitializeDBOutcome"
+ enum="NetReportingAndNelInitializeDbOutcome" expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ The outcome of initializing the SQLite database. This is recorded upon the
+ first load request after startup, which will typically occur upon the first
+ network request.
+ </summary>
+</histogram>
+
+<histogram name="ReportingAndNEL.KillDatabaseResult" enum="BooleanSuccess"
+ expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ Whether killing the database because it was corrupted beyond repair
+ succeeded. This is recorded when a fatal SQLite error is detected.
+ </summary>
+</histogram>
+
+<histogram name="ReportingAndNEL.NumberOfLoadedNELPolicies"
+ units="policy count" expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ The number of NEL policies loaded from the store. This is recorded when the
+ NetworkErrorLoggingService requests a load from the backing store, which
+ typically happens upon the first network request after startup.
+ </summary>
+</histogram>
+
+<histogram name="ReportingAndNEL.NumberOfLoadedReportingEndpointGroups"
+ units="endpoint group count" expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ The number of Reporting endpoint groups loaded from the store. This is
+ recorded when the ReportingCache requests a load from the backing store,
+ which happens upon receipt of the first Report-To header or queued report
+ after startup.
+ </summary>
+</histogram>
+
+<histogram name="ReportingAndNEL.NumberOfLoadedReportingEndpoints"
+ units="endpoint count" expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ The number of Reporting endpoints loaded from the store. This is recorded
+ when the ReportingCache requests a load from the backing store, which
+ happens upon receipt of the first Report-To header or queued report after
+ startup.
+ </summary>
+</histogram>
+
+<histogram name="ReportingAndNEL.TimeInitializeDB" units="ms"
+ expires_after="M82">
+ <owner>chlily@chromium.org</owner>
+ <owner>sburnett@chromium.org</owner>
+ <summary>
+ The time (ms) taken to initialize the Reporting and NEL DB. This is recorded
+ when the DB is initialized, which typically occurs upon the first network
+ request after startup.
+ </summary>
+</histogram>
+
<histogram name="RequestAutocomplete.DismissalState"
enum="AutofillDialogDismissalState" expires_after="2016-05-05">
<obsolete>
@@ -103613,6 +107396,18 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="ResourceScheduler.ActiveSchedulerClientsCount" units="clients"
+ expires_after="M80">
+ <owner>jfwang@google.com</owner>
+ <owner>tbansal@chromium.org</owner>
+ <summary>
+ The number of active resource scheduler clients indicates the severity of
+ system contention. A client is active when it has at least one request
+ either in the pending request queue owned by the client or in flight. This
+ is emitted when a new resource scheduler client is created.
+ </summary>
+</histogram>
+
<histogram name="ResourceScheduler.ClientLoadedTime.Active"
expires_after="2016-01-29">
<obsolete>
@@ -103904,6 +107699,9 @@ uploading your change for review.
</histogram>
<histogram name="RTCQuicStream.ReadIntoAmountBytes" expires_after="M75">
+ <obsolete>
+ Removed in M76.
+ </obsolete>
<owner>shampson@chromium.org</owner>
<owner>steveanton@chromium.org</owner>
<summary>
@@ -103915,6 +107713,9 @@ uploading your change for review.
<histogram name="RTCQuicStream.ReadIntoResult"
enum="RTCQuicStreamReadIntoResult" expires_after="M75">
+ <obsolete>
+ Removed in M76.
+ </obsolete>
<owner>shampson@chromium.org</owner>
<owner>steveanton@chromium.org</owner>
<summary>
@@ -103925,6 +107726,9 @@ uploading your change for review.
</histogram>
<histogram name="RTCQuicStream.WriteAmountBytes" expires_after="M75">
+ <obsolete>
+ Removed in M76.
+ </obsolete>
<owner>shampson@chromium.org</owner>
<owner>steveanton@chromium.org</owner>
<summary>
@@ -103936,6 +107740,9 @@ uploading your change for review.
<histogram name="RTCQuicStream.WriteUsage" enum="RTCQuicStreamWriteUsage"
expires_after="M75">
+ <obsolete>
+ Removed in M76.
+ </obsolete>
<owner>shampson@chromium.org</owner>
<owner>steveanton@chromium.org</owner>
<summary>
@@ -104705,7 +108512,7 @@ uploading your change for review.
</histogram>
<histogram name="SafeBrowsing.V4LocalDatabaseManager.AreAllStoresAvailableNow"
- enum="SafeBrowsingStoreAvailabilityResult">
+ enum="SafeBrowsingStoreAvailabilityResult" expires_after="M78">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -104967,7 +108774,7 @@ uploading your change for review.
</histogram>
<histogram name="SafeBrowsing.V4Store.IsStoreAvailable.ValidStore"
- enum="BooleanAvailable">
+ enum="BooleanAvailable" expires_after="M78">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -105539,6 +109346,9 @@ uploading your change for review.
</histogram>
<histogram name="SB2.Delay" units="ms">
+ <obsolete>
+ Deprecated in M65. Replaced by SB2.NoUserActionResourceLoadingDelay
+ </obsolete>
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -105551,6 +109361,9 @@ uploading your change for review.
</histogram>
<histogram name="SB2.Delay.MainFrame" units="ms">
+ <obsolete>
+ Deprecated in M65.
+ </obsolete>
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -105562,6 +109375,9 @@ uploading your change for review.
</histogram>
<histogram name="SB2.Delay.Subresource" units="ms">
+ <obsolete>
+ Deprecated in M65.
+ </obsolete>
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -105964,6 +109780,9 @@ uploading your change for review.
</histogram>
<histogram name="SB2.Network" units="ms">
+ <obsolete>
+ Deprecated in M65.
+ </obsolete>
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -105974,7 +109793,8 @@ uploading your change for review.
<histogram name="SB2.NoUserActionResourceLoadingDelay" units="ms"
expires_after="M77">
- <owner>yzshen@chromium.org</owner>
+ <owner>vakh@chromium.org</owner>
+ <owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
The total delay, in milliseconds, caused by SafeBrowsing for a resource
load, if the SafeBrowsing interstitial page is not shown and therefore no
@@ -106745,7 +110565,7 @@ uploading your change for review.
<histogram
name="SBClientDownload.DownloadFileWithoutDiskImageExtensionHasKolySignature"
- enum="Boolean">
+ enum="Boolean" expires_after="M78">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -106845,8 +110665,22 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="SBClientDownload.ExtractDmgFeaturesTime" units="ms"
- expires_after="M77">
+<histogram name="SBClientDownload.ExtractDmgFeaturesTime" units="ms">
+ <obsolete>
+ Deprecated in M76, replaced by
+ SBClientDownload.ExtractDmgFeaturesTimeMedium.
+ </obsolete>
+ <owner>drubery@chromium.org</owner>
+ <owner>chrome-safebrowsing-alerts@google.com</owner>
+ <owner>rsesek@chromium.org</owner>
+ <summary>
+ Records the time it takes for the SafeBrowsing download service to extract
+ info from a downloaded DMG file.
+ </summary>
+</histogram>
+
+<histogram name="SBClientDownload.ExtractDmgFeaturesTimeMedium" units="ms"
+ expires_after="M79">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<owner>rsesek@chromium.org</owner>
@@ -106868,6 +110702,19 @@ uploading your change for review.
</histogram>
<histogram name="SBClientDownload.ExtractRarFeaturesTime" units="ms">
+ <obsolete>
+ Deprecated in M76, replaced by
+ SBClientDownload.ExtractRarFeaturesTimeMedium.
+ </obsolete>
+ <owner>drubery@chromium.org</owner>
+ <owner>chrome-safebrowsing-alerts@google.com</owner>
+ <summary>
+ Records the time it takes for the SafeBrowsing download service to extract
+ info from a downloaded rar file.
+ </summary>
+</histogram>
+
+<histogram name="SBClientDownload.ExtractRarFeaturesTimeMedium" units="ms">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -106889,6 +110736,20 @@ uploading your change for review.
</histogram>
<histogram name="SBClientDownload.ExtractZipFeaturesTime" units="ms">
+ <obsolete>
+ Deprecated in M76, replaced by
+ SBClientDownload.ExtractZipFeaturesTimeMedium.
+ </obsolete>
+ <owner>drubery@chromium.org</owner>
+ <owner>chrome-safebrowsing-alerts@google.com</owner>
+ <owner>mattm@chromium.org</owner>
+ <summary>
+ Records the time it takes for the SafeBrowsing download service to extract
+ info from a downloaded zip file.
+ </summary>
+</histogram>
+
+<histogram name="SBClientDownload.ExtractZipFeaturesTimeMedium" units="ms">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<owner>mattm@chromium.org</owner>
@@ -107030,6 +110891,9 @@ uploading your change for review.
<histogram name="SBClientDownload.UnsupportedScheme"
enum="SBClientDownloadExtensions">
+ <obsolete>
+ Deprecated M76, since there had been no such downloads for over a year.
+ </obsolete>
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -107130,7 +110994,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="SBClientDownload.ZipTooBigToUnpack" enum="Boolean">
+<histogram name="SBClientDownload.ZipTooBigToUnpack" enum="Boolean"
+ expires_after="M78">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -107516,7 +111381,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="SBDownloadFeedback.Activations" enum="DownloadItem.DangerType">
+<histogram name="SBDownloadFeedback.Activations" enum="DownloadItem.DangerType"
+ expires_after="M78">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<owner>mattm@chromium.org</owner>
@@ -107546,7 +111412,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="SBDownloadFeedback.EmptyFilePathFailure" enum="Boolean">
+<histogram name="SBDownloadFeedback.EmptyFilePathFailure" enum="Boolean"
+ expires_after="M78">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -107566,7 +111433,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="SBDownloadFeedback.SizeEligibleKB" units="KB">
+<histogram name="SBDownloadFeedback.SizeEligibleKB" units="KB"
+ expires_after="M78">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<owner>mattm@chromium.org</owner>
@@ -107597,7 +111465,7 @@ uploading your change for review.
</histogram>
<histogram name="SBDownloadFeedback.UploadRequestedByServer"
- enum="DownloadUploadRequestedByServer">
+ enum="DownloadUploadRequestedByServer" expires_after="M78">
<owner>vakh@chromium.org</owner>
<owner>chrome-safebrowsing-alerts@google.com</owner>
<summary>
@@ -108990,7 +112858,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ScreenLocker.AuthenticationFailure" enum="UnlockType">
+<histogram name="ScreenLocker.AuthenticationFailure" enum="UnlockType"
+ expires_after="M78">
<owner>sammiequon@chromium.org</owner>
<summary>
What type of authentication was attempted when the user failed to unlock the
@@ -109004,7 +112873,8 @@ uploading your change for review.
<summary>The time spent for authentication in case of a failure.</summary>
</histogram>
-<histogram name="ScreenLocker.AuthenticationSuccess" enum="UnlockType">
+<histogram name="ScreenLocker.AuthenticationSuccess" enum="UnlockType"
+ expires_after="M78">
<owner>sammiequon@chromium.org</owner>
<summary>
What type of authentication was attempted when the user successfully
@@ -109752,7 +113622,10 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Search.ContextualSearch.All.ResultsSeen" enum="Boolean">
+<histogram name="Search.ContextualSearch.All.ResultsSeen" enum="Boolean"
+ expires_after="never">
+<!-- expires-never: dashboard metric (internal: go/cs-metrics-dashboard) -->
+
<owner>donnd@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<summary>
@@ -110411,7 +114284,9 @@ uploading your change for review.
</histogram>
<histogram name="Search.ContextualSearchPreferenceState"
- enum="ContextualSearchPreferenceState">
+ enum="ContextualSearchPreferenceState" expires_after="never">
+<!-- expires-never: dashboard metric (internal: go/cs-metrics-dashboard) -->
+
<owner>donnd@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<summary>
@@ -110421,7 +114296,9 @@ uploading your change for review.
</histogram>
<histogram name="Search.ContextualSearchPreferenceStateChange"
- enum="ContextualSearchPreferenceState" expires_after="M77">
+ enum="ContextualSearchPreferenceState" expires_after="never">
+<!-- expires-never: dashboard metric (internal: go/cs-metrics-dashboard) -->
+
<owner>donnd@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<summary>
@@ -110557,7 +114434,7 @@ uploading your change for review.
</histogram>
<histogram name="Search.ContextualSearchQuickActions.Clicked"
- enum="BooleanClicked">
+ enum="BooleanClicked" expires_after="M80">
<owner>donnd@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<summary>
@@ -110676,7 +114553,9 @@ uploading your change for review.
</histogram>
<histogram name="Search.ContextualSearchResultsSeen"
- enum="ContextualSearchResultsSeen" expires_after="M77">
+ enum="ContextualSearchResultsSeen" expires_after="never">
+<!-- expires-never: dashboard metric (internal: go/cs-metrics-dashboard) -->
+
<owner>donnd@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<summary>
@@ -110686,7 +114565,9 @@ uploading your change for review.
</histogram>
<histogram name="Search.ContextualSearchResultsSeenByGesture"
- enum="ContextualSearchSeenByGesture">
+ enum="ContextualSearchSeenByGesture" expires_after="never">
+<!-- expires-never: dashboard metric (internal: go/cs-metrics-dashboard) -->
+
<owner>donnd@chromium.org</owner>
<owner>twellington@chromium.org</owner>
<summary>
@@ -111234,7 +115115,7 @@ uploading your change for review.
<histogram
name="Security.CertificateTransparency.MainFrameNavigationCompliance"
- enum="CTComplianceStatus">
+ enum="CTComplianceStatus" expires_after="M78">
<owner>estark@chromium.org</owner>
<summary>
The compliance of each main frame navigation's connection with the
@@ -111598,6 +115479,12 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="SendTabToSelf.AndroidShareSheet.ClickResult"
+ enum="SendTabToSelfClickResult" expires_after="M84">
+ <owner>tgupta@chromium.org</owner>
+ <summary>Tracks the user flow for sending a tab for SendTabToSelf.</summary>
+</histogram>
+
<histogram base="true" name="SendTabToSelf.ClickResult"
enum="SendTabToSelfClickResult" expires_after="M78">
<owner>jeffreycohen@chromium.org</owner>
@@ -111608,6 +115495,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram base="true" name="SendTabToSelf.DeviceCount" units="device_counts"
+ expires_after="M78">
+ <owner>jeffreycohen@chromium.org</owner>
+ <owner>sebsg@chromium.org</owner>
+ <owner>tgupta@chromium.org</owner>
+ <summary>
+ Record how many valid devices are shown when user trigger to see the device
+ list.
+ </summary>
+</histogram>
+
<histogram name="SendTabToSelf.Notification" enum="SendTabToSelfNotification"
expires_after="M77">
<owner>sebsg@chromium.org</owner>
@@ -111631,6 +115529,16 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="SendTabToSelf.Sync.ApplySyncChangesStatus"
+ enum="SendTabToSelfApplySyncChanges" expires_after="M84">
+ <owner>jeffreycohen@chromium.org</owner>
+ <owner>sebsg@chromium.org</owner>
+ <summary>
+ The result of the ApplySyncChanges method when a tab is shared via
+ SendTabToSelf
+ </summary>
+</histogram>
+
<histogram name="SendTabToSelf.Sync.ModelLoadedInTime" enum="Boolean"
expires_after="M78">
<owner>tgupta@chromium.org</owner>
@@ -111640,6 +115548,15 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="SendTabToSelf.Sync.NotifyLocalDevice"
+ enum="SendTabToSelfNotifyLocalDevice" expires_after="M84">
+ <owner>jeffreycohen@chromium.org</owner>
+ <owner>tgupta@chromium.org</owner>
+ <summary>
+ The number of entry that are sent to the SendTabToSelf NotificationHandler.
+ </summary>
+</histogram>
+
<histogram name="SequencedWorkerPool.ShutdownDelayTime" units="ms"
expires_after="2018-02-22">
<obsolete>
@@ -111765,7 +115682,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ServiceWorker.BackgroundFetchAbortEvent.Time" units="ms">
+<histogram name="ServiceWorker.BackgroundFetchAbortEvent.Time" units="ms"
+ expires_after="M78">
<owner>peter@chromium.org</owner>
<summary>
The time taken between dispatching a BackgroundFetchAbortEvent to a Service
@@ -111806,7 +115724,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ServiceWorker.BackgroundFetchSuccessEvent.Time" units="ms">
+<histogram name="ServiceWorker.BackgroundFetchSuccessEvent.Time" units="ms"
+ expires_after="M78">
<owner>nator@chromium.org</owner>
<owner>peter@chromium.org</owner>
<owner>rayankans@chromium.org</owner>
@@ -111839,7 +115758,7 @@ uploading your change for review.
<histogram
name="ServiceWorker.CacheStorageInstalledScript.CachedMetadataTotalSize"
- units="bytes">
+ units="bytes" expires_after="M78">
<owner>horo@chromium.org</owner>
<summary>
The total length of cached metadata of scripts which are stored to the
@@ -112502,6 +116421,21 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="ServiceWorker.LookupRegistration.MainResource.Time" units="ms"
+ expires_after="2021-10-31">
+ <owner>shimazu@chromium.org</owner>
+ <owner>chrome-worker@google.com</owner>
+ <summary>
+ The time taken from (a) a resource loading request is routed to service
+ worker path, to (b) existance of a registered service worker is looked up.
+ This metric only cares about looking up a registration for navigation. This
+ doesn't include look-ups for updating a service worker.
+
+ Please refer to the suffixed histograms for each of the cases where a
+ registration is found, not found, and an error happens.
+ </summary>
+</histogram>
+
<histogram name="ServiceWorker.MainFramePageLoad" enum="ServiceWorkerSite">
<owner>horo@chromium.org</owner>
<summary>
@@ -112827,6 +116761,17 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="ServiceWorker.PeriodicBackgroundSyncEvent.Time" units="ms"
+ expires_after="M87">
+ <owner>nator@chromium.org</owner>
+ <owner>platform-capabilities@chromium.org</owner>
+ <summary>
+ The time taken between dispatching a PeriodicSyncEvent to a Service Worker
+ and receiving a message that it finished handling the event. Includes the
+ time for the waitUntil() promise to settle.
+ </summary>
+</histogram>
+
<histogram name="ServiceWorker.PushEvent.Time" units="ms" expires_after="M77">
<owner>peter@chromium.org</owner>
<summary>
@@ -112871,7 +116816,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="ServiceWorker.ScriptCachedMetadataSize" units="bytes">
+<histogram name="ServiceWorker.ScriptCachedMetadataSize" units="bytes"
+ expires_after="M78">
<owner>horo@chromium.org</owner>
<summary>
The length of cached metadata of Service Worker scripts. Logged on each load
@@ -112989,6 +116935,24 @@ uploading your change for review.
</summary>
</histogram>
+<histogram name="ServiceWorker.StartTiming.BrowserThreadHopTime"
+ units="microseconds" expires_after="M80">
+ <owner>kinuko@chromium.org</owner>
+ <summary>
+ The sum of all the times spent posting tasks between the UI and IO threads
+ during ServiceWorker startup. Recorded on a successful startup and when
+ DevTools was not attached.
+
+ Note: This metric drops reports on clients with low-resolution clocks, which
+ means these reports will be biased against a portion of the population on
+ Windows. See Windows.HasHighResolutionTimeTicks for the affected sample.
+
+ Also note that this one's recorded slightly different from others as it's
+ recorded even if the inter-process timings were inconsistent (see
+ ServiceWorker.StartTiming.ClockConsistency).
+ </summary>
+</histogram>
+
<histogram name="ServiceWorker.StartTiming.ClockConsistency"
enum="CrossProcessTimeDelta" expires_after="2019-07-30">
<owner>falken@chromium.org</owner>
@@ -113141,7 +117105,8 @@ uploading your change for review.
<histogram
name="ServiceWorker.StartWorker.InstalledScriptsSender.FinishedReason"
- enum="ServiceWorkerInstalledScriptsManager.FinishedReason">
+ enum="ServiceWorkerInstalledScriptsManager.FinishedReason"
+ expires_after="M78">
<owner>shimazu@chromium.org</owner>
<summary>
The result of sending installed scripts over
@@ -113795,7 +117760,7 @@ uploading your change for review.
</histogram>
<histogram name="SessionRestore.BackgroundUseCaseTabCount.Restored"
- units="tabs" expires_after="2019-04-30">
+ units="tabs" expires_after="2019-11-30">
<owner>chrisha@chromium.org</owner>
<summary>
The number of tabs involved in a single session restore that were observed
@@ -113805,7 +117770,7 @@ uploading your change for review.
</histogram>
<histogram name="SessionRestore.BackgroundUseCaseTabCount.Total" units="tabs"
- expires_after="2019-04-30">
+ expires_after="2019-11-30">
<owner>chrisha@chromium.org</owner>
<summary>
The number of tabs involved in a single session restore that were observed
@@ -114106,6 +118071,9 @@ uploading your change for review.
<histogram name="SessionRestore.SubFrameUniqueNameChangedBeforeFirstCommit"
enum="BooleanSuccess" expires_after="M77">
+ <obsolete>
+ Deprecated 2019-05 as data is no longer needed.
+ </obsolete>
<owner>dcheng@chromium.org</owner>
<summary>
How often a subframe is assigned a new name between the initial empty
@@ -115468,7 +119436,7 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Shutdown.end_session.time2">
+<histogram name="Shutdown.end_session.time2" expires_after="M78">
<owner>hashimoto@chromium.org</owner>
<summary>
Time for shutdown initiated by an end session (user logs off, shuts down or
@@ -115779,7 +119747,7 @@ uploading your change for review.
</histogram>
<histogram name="Signin.AccountTracker.CountOfLoadedAccounts" units="Accounts"
- expires_after="M76">
+ expires_after="M80">
<owner>msarda@chromium.org</owner>
<owner>sdefresne@chromium.org</owner>
<summary>
@@ -115791,7 +119759,10 @@ uploading your change for review.
</histogram>
<histogram name="Signin.AccountTracker.DeprecatedServiceFlagDeleted"
- enum="BooleanDeletedOrNot" expires_after="M76">
+ enum="BooleanDeletedOrNot" expires_after="2019-05-30">
+ <obsolete>
+ Instrumentation code has been removed as the conversion has been completed.
+ </obsolete>
<owner>msarda@chromium.org</owner>
<owner>sdefresne@chromium.org</owner>
<summary>
@@ -115808,7 +119779,7 @@ uploading your change for review.
</histogram>
<histogram name="Signin.AccountTracker.GaiaIdMigrationState"
- enum="OAuth2LoginAccountRevokedMigrationState" expires_after="M76">
+ enum="OAuth2LoginAccountRevokedMigrationState" expires_after="M80">
<owner>msarda@chromium.org</owner>
<owner>sdefresne@chromium.org</owner>
<summary>
@@ -115842,7 +119813,8 @@ uploading your change for review.
</summary>
</histogram>
-<histogram name="Signin.AndroidGetAccountIdsTime" units="ms">
+<histogram name="Signin.AndroidGetAccountIdsTime" units="ms"
+ expires_after="M78">
<owner>bsazonov@chromium.org</owner>
<summary>
The time it takes to retrieve Gaia ids for all accounts from GoogleAuthUtil.
@@ -116165,6 +120137,9 @@ uploading your change for review.
<histogram name="Signin.MultiloginFinished" enum="GoogleServiceAuthError"
expires_after="2019-11-01">
+ <obsolete>
+ Removed in M76. Use Signin.OAuthMultiloginResponseStatus instead.
+ </obsolete>
<owner>droger@chromium.org</owner>
<owner>msarda@chromium.org</owner>
<summary>
@@ -116176,6 +120151,9 @@ uploading your change for review.
<histogram name="Signin.MultiloginRetry" enum="GoogleServiceAuthError"
expires_after="2019-11-01">
+ <obsolete>
+ Removed in M76, because multilogin switched to a new error type.
+ </obsolete>
<owner>droger@chromium.org</owner>
<owner>msarda@chromium.org</owner>
<summary>
@@ -116485,6 +120463,16 @@ uploading your change for review.
<summary>Track how a profile gets signed out.</summary>
</histogram>
+<histogram name="Signin.SSOAuth.GetIdentities.ErrorCode"
+ enum="SigninSSOAuthGetIdentitiesErrorCode" expires_after="2019-12-01">
+ <owner>jlebel@chromium.org</owner>
+ <owner>chrome-signin-team@google.com</owner>
+ <summary>
+ Tracks the error code by -[SSOService identitiesWithError:]. See:
+ https://crbug.com/981082.
+ </summary>
+</histogram>
+
<histogram name="Signin.SSOWKWebView.GetAllCookies.CookieCount" units="cookies">
<owner>jlebel@chromium.org</owner>
<summary>
@@ -117843,6 +121831,9 @@ should be kept until we use this API. -->
</histogram>
<histogram name="SiteIsolation.AllResponses">
+ <obsolete>
+ Removed in March 2018; in M67+, browser-process CORB policy is enabled.
+ </obsolete>
<owner>creis@chromium.org</owner>
<summary>
The count of all network responses received by a renderer. Each response is
@@ -118075,6 +122066,20 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="SiteIsolation.PendingSitelessNavigationDisallowsProcessReuse"
+ enum="BooleanProcessReuseDisallowed" expires_after="M82">
+ <owner>alexmos@chromium.org</owner>
+ <owner>creis@chromium.org</owner>
+ <owner>site-isolation-dev@chromium.org</owner>
+ <summary>
+ Whether or not the RenderProcessHost is disqualified from process reuse
+ because it has a pending navigation to a URL for which SiteInstance does not
+ assign a site URL, such as chrome-native://newtab. This is intended to
+ measure how often this scenario results in spinning up extra processes.
+ Measured once per IsSuitableHost() invocation.
+ </summary>
+</histogram>
+
<histogram name="SiteIsolation.ProxyCount">
<owner>creis@chromium.orgnick@chromium.org</owner>
<owner>site-isolation-dev@chromium.org</owner>
@@ -118140,7 +122145,7 @@ should be kept until we use this API. -->
The total count of responses that were would be blocked by the cross-site
document blocking logic in the browser process, but were only allowed
because the request was initiated by a content script of an extension.
- Sampled with a resource type (0-17) when the response is allowed.
+ Recorded with a resource type (0-17) when the response is allowed.
Note that this histogram is not reimplemented in the NetworkService version
of Cross-Origin Read Blocking feature. This should be okay since we hope to
@@ -118155,13 +122160,24 @@ should be kept until we use this API. -->
<owner>creis@chromium.org</owner>
<summary>
The total count of responses that were blocked by the cross-site document
- blocking logic in the browser process. Sampled with a resource type (0-17)
+ blocking logic in the browser process. Recorded with a resource type (0-17)
when the response is blocked; up to 1024 bytes of the response are
considered. This is also recorded with a suffix indicating the MIME type
category.
</summary>
</histogram>
+<histogram name="SiteIsolation.XSD.Browser.Blocked.CanonicalMimeType"
+ enum="CorbCanonicalMimeType" expires_after="M79">
+ <owner>creis@chromium.org</owner>
+ <owner>lukasza@chromium.org</owner>
+ <summary>
+ The total count of responses that were blocked by the cross-site document
+ blocking logic in the browser process. Recorded with a canonical MIME type
+ when the response is blocked.
+ </summary>
+</histogram>
+
<histogram
name="SiteIsolation.XSD.Browser.Blocked.ContentLength.ValueIfAvailable"
units="bytes">
@@ -118192,8 +122208,8 @@ should be kept until we use this API. -->
The total count of responses that were blocked by the cross-site document
blocking logic in the browser process, due to the presence of a Javascript
parser-breaker pattern (like &quot;for(;;);&quot;, or &quot;)]}'&quot;, or a
- non-empty JSON dictionary like &quot;{\&quot;a\&quot;:&quot;. Sampled with a
- resource type (0-17) when the response is blocked; up to 1024 bytes of the
+ non-empty JSON dictionary like &quot;{\&quot;a\&quot;:&quot;. Recorder with
+ a resource type (0-17) when the response is blocked; up to 1024 bytes of the
response are considered.
</summary>
</histogram>
@@ -118489,6 +122505,9 @@ should be kept until we use this API. -->
<histogram name="SiteIsolation.XSD.NetworkService.InitiatorLockCompatibility"
enum="CorbResultVsInitiatorLockCompatibility" expires_after="2019-06-13">
+ <obsolete>
+ Removed in May 2019.
+ </obsolete>
<owner>creis@chromium.org</owner>
<owner>lukasza@chromium.org</owner>
<summary>
@@ -119180,6 +123199,9 @@ should be kept until we use this API. -->
<histogram name="SoftwareReporter.Cleaner.RebootPromptShown"
enum="SoftwareReporterRebootPromptType">
+ <obsolete>
+ Deprecated on 2019-05-29.
+ </obsolete>
<owner>veranika@chromium.org</owner>
<summary>
Indicates how the user was prompted to reboot the machine to complete a run
@@ -120057,6 +124079,30 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Stability.Android.OomKillReverseRank" units="rank"
+ expires_after="2020-04-10">
+ <owner>boliu@chromium.org</owner>
+ <owner>ssid@chromium.org</owner>
+ <summary>
+ Records the reverse rank of a child process when it is killed by android if
+ applicable. Chrome on Android ranks some child processes and provides hints
+ to android that it should kill from lowest to highest ranked. The lowest
+ ranked process has reverse rank 0. This is a measure how good the hints to
+ android are; if hints were perfect, then all android kills should have
+ reverse rank 0.
+ </summary>
+</histogram>
+
+<histogram name="Stability.Android.OomKillReverseRankSuccess"
+ enum="BooleanSuccess" expires_after="2020-04-10">
+ <owner>boliu@chromium.org</owner>
+ <owner>ssid@chromium.org</owner>
+ <summary>
+ Getting value for OomKillReverseRank may fail. Recorded when an applicable
+ child process is killed by android.
+ </summary>
+</histogram>
+
<histogram name="Stability.Android.PendingMinidumpsOnStartup" units="minidumps"
expires_after="2017-05-16">
<obsolete>
@@ -120107,6 +124153,10 @@ should be kept until we use this API. -->
<histogram name="Stability.Android.ProcessedMinidumps"
enum="AndroidProcessedMinidumps" expires_after="M76">
+ <obsolete>
+ Removed 04/2019 as we no longer record it in favour of the two variants
+ below.
+ </obsolete>
<owner>mheikal@chromium.org</owner>
<owner>smaier@chromium.org</owner>
<owner>wnwen@chromium.org</owner>
@@ -120118,6 +124168,32 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Stability.Android.ProcessedRealMinidumps"
+ enum="AndroidProcessedMinidumps" expires_after="M81">
+ <owner>mheikal@chromium.org</owner>
+ <owner>smaier@chromium.org</owner>
+ <owner>wnwen@chromium.org</owner>
+ <summary>
+ Records the number of non-simulated minidumps processed by Crashpad, split
+ by process type. This metric is similar to one that could be computed
+ server-side based on received crash uploads; but the client-side metric also
+ includes any minidumps that were not successfully uploaded.
+ </summary>
+</histogram>
+
+<histogram name="Stability.Android.ProcessedSimulatedMinidumps"
+ enum="AndroidProcessedMinidumps" expires_after="M81">
+ <owner>mheikal@chromium.org</owner>
+ <owner>smaier@chromium.org</owner>
+ <owner>wnwen@chromium.org</owner>
+ <summary>
+ Records the number of simulated minidumps processed by Crashpad, split by
+ process type. This metric is similar to one that could be computed
+ server-side based on received crash uploads; but the client-side metric also
+ includes any minidumps that were not successfully uploaded.
+ </summary>
+</histogram>
+
<histogram name="Stability.Android.RendererCrash" enum="Boolean">
<owner>wnwen@chromium.org</owner>
<summary>
@@ -120232,6 +124308,27 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Stability.ChildFrameCrash.TabMarkedForReload"
+ enum="BooleanMarkedForReload" expires_after="M82">
+ <owner>alexmos@chromium.org</owner>
+ <owner>boliu@chromium.org</owner>
+ <summary>
+ Logs whether or not a tab is marked for reload when a cross-process subframe
+ crashes. Logged once per subframe process crash.
+ </summary>
+</histogram>
+
+<histogram name="Stability.ChildFrameCrash.TabMarkedForReload.Visibility"
+ enum="FrameVisibility" expires_after="M82">
+ <owner>alexmos@chromium.org</owner>
+ <owner>boliu@chromium.org</owner>
+ <summary>
+ Logs the visibility of a subframe when a subframe process crashes and the
+ corresponding tab is marked for reload. This indicates whether the crashed
+ subframe was visible or scrolled out of view at the time of crash.
+ </summary>
+</histogram>
+
<histogram name="Stability.ChildFrameCrash.Visibility" enum="CrashVisibility">
<owner>boliu@chromium.org</owner>
<owner>lfg@chromium.org</owner>
@@ -120335,6 +124432,9 @@ should be kept until we use this API. -->
<histogram name="StackSamplingProfiler.DeserializeAllPendingProfilesTime"
units="ms" expires_after="2019-05-21">
+ <obsolete>
+ Removed 5/2019 after having collected enough data to analyze jank.
+ </obsolete>
<owner>chengx@chromium.org</owner>
<owner>wittman@chromium.org</owner>
<summary>
@@ -121143,7 +125243,7 @@ should be kept until we use this API. -->
<histogram
name="Startup.FirstWebContents.RenderProcessHostInit.ToNonEmptyPaint"
- units="ms">
+ units="ms" expires_after="M78">
<owner>hans@chromium.org</owner>
<summary>
Time between RenderFrameHostImpl::Init and
@@ -122226,6 +126326,9 @@ should be kept until we use this API. -->
</histogram>
<histogram name="SubresourceFilter.AdDelay.Delay" units="ms">
+ <obsolete>
+ Removed April 2019
+ </obsolete>
<owner>csharrison@chromium.org</owner>
<owner>jkarlin@chromium.org</owner>
<summary>
@@ -122236,6 +126339,9 @@ should be kept until we use this API. -->
<histogram name="SubresourceFilter.AdDelay.Delay.Expected" units="ms"
expires_after="M77">
+ <obsolete>
+ Removed April 2019
+ </obsolete>
<owner>csharrison@chromium.org</owner>
<owner>jkarlin@chromium.org</owner>
<summary>
@@ -122247,6 +126353,9 @@ should be kept until we use this API. -->
<histogram name="SubresourceFilter.AdDelay.Delay.Queuing" units="ms"
expires_after="M77">
+ <obsolete>
+ Removed April 2019
+ </obsolete>
<owner>csharrison@chromium.org</owner>
<owner>jkarlin@chromium.org</owner>
<summary>
@@ -122329,7 +126438,7 @@ should be kept until we use this API. -->
<histogram
name="SubresourceFilter.DocumentLoad.ActivationComputingDelay.MainFrame"
- units="microseconds">
+ units="microseconds" expires_after="M78">
<owner>csharrison@chromium.org</owner>
<summary>
Records the total time the activation state navigation throttle within a
@@ -122371,7 +126480,7 @@ should be kept until we use this API. -->
<histogram
name="SubresourceFilter.DocumentLoad.NumSubresourceLoads.MatchedRules"
- units="resource loads">
+ units="resource loads" expires_after="M78">
<owner>engedy@chromium.org</owner>
<summary>
Whenever a document load is finished in a main frame or subframe with
@@ -122444,7 +126553,7 @@ should be kept until we use this API. -->
<histogram
name="SubresourceFilter.DocumentLoad.SubresourceEvaluation.TotalWallDuration"
- units="microseconds">
+ units="microseconds" expires_after="M78">
<owner>pkalinnikov@chromium.org</owner>
<summary>
Whenever a document load is finished in a main frame or subframe with
@@ -122542,6 +126651,10 @@ should be kept until we use this API. -->
<histogram name="SubresourceFilter.PageLoad.Activation.RedirectPosition"
enum="SafeBrowsingActivationPosition">
+ <obsolete>
+ Deprecated in favor of
+ SubresourceFilter.PageLoad.Activation.RedirectPosition2
+ </obsolete>
<owner>ericrobinson@chromium.org</owner>
<summary>
For pages that trigger Safe Browsing activations (not including dry runs),
@@ -122551,6 +126664,17 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram
+ name="SubresourceFilter.PageLoad.Activation.RedirectPosition2.Enforcement"
+ enum="RedirectPosition" expires_after="M78">
+ <owner>ericrobinson@chromium.org</owner>
+ <owner>csharrison@chromium.org</owner>
+ <summary>
+ For pages that match a given subresource_filter activation list, records the
+ position in the redirect chain of the latest non-NONE list.
+ </summary>
+</histogram>
+
<histogram name="SubresourceFilter.PageLoad.Activation.WallDuration"
units="microseconds" expires_after="2018-08-30">
<owner>csharrison@chromium.org</owner>
@@ -122738,7 +126862,7 @@ should be kept until we use this API. -->
<histogram
name="SubresourceFilter.PageLoad.SubresourceEvaluation.TotalCPUDuration"
- units="microseconds">
+ units="microseconds" expires_after="M78">
<owner>pkalinnikov@chromium.org</owner>
<summary>
Whenever a page load is finished with subresource filtering activated,
@@ -122752,7 +126876,7 @@ should be kept until we use this API. -->
<histogram
name="SubresourceFilter.PageLoad.SubresourceEvaluation.TotalWallDuration"
- units="microseconds">
+ units="microseconds" expires_after="M78">
<owner>pkalinnikov@chromium.org</owner>
<summary>
Whenever a page load is finished with subresource filtering activated,
@@ -122820,6 +126944,9 @@ should be kept until we use this API. -->
</histogram>
<histogram name="SubresourceFilter.SafeBrowsing.CheckTime" units="ms">
+ <obsolete>
+ Deprecated in May 2019 in favor of the TotalCheckTime variant.
+ </obsolete>
<owner>csharrison@chromium.org</owner>
<summary>
The time an individual Safe Browsing URL check took before finishing. Logged
@@ -122829,6 +126956,7 @@ should be kept until we use this API. -->
<histogram name="SubresourceFilter.SafeBrowsing.TotalCheckTime" units="ms">
<owner>csharrison@chromium.org</owner>
+ <owner>ericrobinson@chromium.org</owner>
<summary>
The time an individual Safe Browsing URL check took before finishing,
including posting tasks to and from the IO thread. Measured on the UI
@@ -122967,7 +127095,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="Supervision.StatusReport.Event"
- enum="SupervisionStatusReportEvent" expires_after="M76">
+ enum="SupervisionStatusReportEvent" expires_after="M85">
<owner>escordeiro@google.com</owner>
<owner>brunoad@google.com</owner>
<owner>ldaguilar@google.com</owner>
@@ -123791,7 +127919,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Sync.DeviceCount2">
+<histogram name="Sync.DeviceCount2" expires_after="M78">
<owner>mastiz@chromium.org</owner>
<owner>jkrcal@chromium.org</owner>
<summary>
@@ -124062,8 +128190,10 @@ should be kept until we use this API. -->
<owner>jkrcal@chromium.org</owner>
<summary>
Records the availability status (local, sync or non-available) for each
- favicon in a certain interface. Recorded when responding to the request done
- to chrome://favicon URL.
+ favicon displayed by an interface. Recorded when the recent tabs menu is
+ opened or when a request is done to chrome://favicon by page url, which
+ happens for example for the chrome://history and chrome://history/syncedTabs
+ interfaces.
</summary>
</histogram>
@@ -124487,6 +128617,18 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Sync.MissingBookmarkPermanentNodes"
+ enum="SyncMissingBookmarkPermanentNodes" expires_after="M80">
+ <owner>mamir@chromium.org</owner>
+ <owner>mastiz@chromium.org</owner>
+ <summary>
+ Recorded after applying the first sync merge for Bookmarks in case of merge
+ failure. Merge failure is detected by missing one or more permanent nodes in
+ the merge result. This metric records which permanent nodes are missing.
+ It's recorded only for USS infrastrucre.
+ </summary>
+</histogram>
+
<histogram base="true" name="Sync.ModelTypeConfigurationTime.Ephemeral"
units="ms" expires_after="2020-05-01">
<owner>jkrcal@chromium.org</owner>
@@ -125096,6 +129238,9 @@ should be kept until we use this API. -->
<histogram base="true" name="Sync.ReceivedDataTypeGetUpdatesResponseWithToken"
enum="SyncGetUpdatesToken" expires_after="2019-06-01">
+ <obsolete>
+ Deprecated 05/2019.
+ </obsolete>
<owner>jkrcal@chromium.org</owner>
<owner>mastiz@chromium.org</owner>
<summary>
@@ -125149,7 +129294,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Sync.ResolveConflict" enum="SyncConflictResolutions">
+<histogram name="Sync.ResolveConflict" enum="SyncConflictResolutions"
+ expires_after="M78">
<owner>treib@chromium.org</owner>
<owner>mastiz@chromium.org</owner>
<summary>
@@ -125159,7 +129305,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="Sync.ResolveSimpleConflict"
- enum="SyncSimpleConflictResolutions">
+ enum="SyncSimpleConflictResolutions" expires_after="M78">
<owner>zea@chromium.org</owner>
<summary>Enumeration of types of simple conflict resolutions.</summary>
</histogram>
@@ -125403,6 +129549,19 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Sync.SizeOfFaviconServerRequestGroup"
+ expires_after="2020-05-15">
+ <owner>victorvianna@google.com</owner>
+ <owner>jkrcal@chromium.org</owner>
+ <summary>
+ Records the number of active requests simultaneously done to the Google
+ favicon server that were associated with a same icon url and could have thus
+ been grouped. Recorded when opening the recent tabs menu, chrome://history
+ or chrome://history/syncedTabs with both history sync and the
+ EnableHistoryFaviconsGoogleServerQuery feature enabled.
+ </summary>
+</histogram>
+
<histogram name="Sync.Startup.DeferredInitTrigger"
enum="SyncDeferredInitTrigger" expires_after="M77">
<owner>zea@chromium.org</owner>
@@ -125723,6 +129882,9 @@ should be kept until we use this API. -->
<histogram name="Sync.Wallet.EntitiesClearedWhenDisabled" units="entities"
expires_after="M74">
+ <obsolete>
+ Deprecated as of 05/2019.
+ </obsolete>
<owner>jkrcal@chromium.org</owner>
<owner>feuunk@chromium.org</owner>
<summary>
@@ -125731,6 +129893,15 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Sync.WalletMetadata.DeletedOldOrphans" units="entities"
+ expires_after="M76">
+ <owner>jkrcal@chromium.org</owner>
+ <owner>mastiz@chromium.org</owner>
+ <summary>
+ Counts number of old orphan metadata entities that are removed on startup.
+ </summary>
+</histogram>
+
<histogram name="Sync.WifiCredentialsAssociationTime" units="ms"
expires_after="2016-06-20">
<obsolete>
@@ -126569,7 +130740,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="TabGroups.UserTabGroupCount" units="groups"
+<histogram name="TabGroups.UserGroupCount" units="groups"
expires_after="2020-01-01">
<owner>yusufo@chromium.org</owner>
<owner>wychen@chromium.org</owner>
@@ -126579,6 +130750,30 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="TabHoverCards.TabHoverCardsSeenBeforeTabSelection"
+ expires_after="2020-01-01">
+ <owner>corising@chromium.org</owner>
+ <owner>chrome-desktop-ui-sea@google.com</owner>
+ <summary>
+ This histogram records the number of tab hover cards seen between the last
+ active tab change and a tab change by mouse click.
+ </summary>
+</histogram>
+
+<histogram name="TabHoverCards.TimeSinceLastVisible" units="ms"
+ expires_after="2019-08-01">
+ <owner>corising@chromium.org</owner>
+ <owner>chrome-desktop-ui-sea@google.com</owner>
+ <summary>
+ This histogram records the time between when a hover card was last hidden to
+ when it is shown again. Since users can easily hover out of the tab strip we
+ want to reshow the tab hover card with no delay if we think they
+ unintentionally exited the tab strip. If the user reenters the tab strip
+ within X ms we want to reshow the hover card immediately. This histogram
+ will help to better refine that number.
+ </summary>
+</histogram>
+
<histogram name="Tablet.AppDrag.EndWindowState"
enum="AppWindowDragEndWindowState" expires_after="2019-12-20">
<owner>minch@chromium.org</owner>
@@ -126611,6 +130806,16 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Tablet.CountOfVolumeAdjustType" units="numbers"
+ expires_after="2021-12-20">
+ <owner>minch@chromium.org</owner>
+ <owner>omrilio@chromium.org</owner>
+ <summary>
+ The number of each volume adjust type in tablet mode. Logged when starts
+ volume adjust while in tablet mode.
+ </summary>
+</histogram>
+
<histogram name="Tablet.TabDrag.CountOfPerUserSession" units="times"
expires_after="2019-12-20">
<owner>minch@chromium.org</owner>
@@ -127039,7 +131244,7 @@ should be kept until we use this API. -->
<histogram
name="TabManager.Experimental.SessionRestore.CompressedPagesPerSecond"
- units="pages/s">
+ units="pages/s" expires_after="M78">
<owner>shaseley@chromium.org</owner>
<owner>panicker@chromium.org</owner>
<summary>
@@ -127058,7 +131263,7 @@ should be kept until we use this API. -->
<histogram
name="TabManager.Experimental.SessionRestore.DecompressedPagesPerSecond"
- units="pages/s">
+ units="pages/s" expires_after="M78">
<owner>shaseley@chromium.org</owner>
<owner>panicker@chromium.org</owner>
<summary>
@@ -127077,7 +131282,7 @@ should be kept until we use this API. -->
<histogram
name="TabManager.Experimental.SessionRestore.ForegroundTab.FirstContentfulPaint"
- units="ms">
+ units="ms" expires_after="M78">
<owner>shaseley@chromium.org</owner>
<owner>panicker@chromium.org</owner>
<summary>
@@ -127099,7 +131304,7 @@ should be kept until we use this API. -->
<histogram
name="TabManager.Experimental.SessionRestore.ForegroundTab.FirstPaint"
- units="ms">
+ units="ms" expires_after="M78">
<owner>shaseley@chromium.org</owner>
<owner>panicker@chromium.org</owner>
<summary>
@@ -127170,7 +131375,7 @@ should be kept until we use this API. -->
<histogram
name="TabManager.Experimental.SessionRestore.TabSwitchLoadTime.UntilTabIsLoaded"
- units="ms">
+ units="ms" expires_after="M78">
<owner>shaseley@chromium.org</owner>
<owner>panicker@chromium.org</owner>
<summary>
@@ -127232,7 +131437,7 @@ should be kept until we use this API. -->
<histogram
name="TabManager.Heuristics.FromBackgroundedToFirstNonPersistentNotificationCreated"
- units="ms">
+ units="ms" expires_after="M78">
<owner>chrisha@chromium.org</owner>
<owner>lpy@chromium.org</owner>
<summary>
@@ -127651,6 +131856,18 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram base="true" name="Tabs.FrozenTabPercentage" units="%"
+ expires_after="2019-08-31">
+<!-- Name completed by histogram_suffixes name="FrozenTabPercentage" -->
+
+ <owner>adityakeerthi@google.com</owner>
+ <owner>fdoray@chromium.org</owner>
+ <summary>
+ The percentage of hidden tabs that are frozen. This metric is recorded every
+ 5 minutes, as a tab heartbeat metric. Desktop only.
+ </summary>
+</histogram>
+
<histogram name="Tabs.iOS_PostRedirectPLT" units="ms">
<owner>pauljensen@chromium.org</owner>
<summary>
@@ -127667,11 +131884,14 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Tabs.MaxTabsInADay" units="tabs">
+<histogram name="Tabs.MaxTabsInADay" units="tabs" expires_after="never">
+<!-- expires-never: https://crbug.com/966137 -->
+
<owner>sebmarchand@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
<summary>
The maximum number of tabs that Chrome displays at the same time over the
- course of a day.
+ course of a day. Desktop only.
NOTE: This metric is asynchronous, the value reported on a given day
represents the previous day's observations (which can be from a different
@@ -127679,11 +131899,15 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Tabs.MaxTabsPerWindowInADay" units="tabs">
+<histogram name="Tabs.MaxTabsPerWindowInADay" units="tabs"
+ expires_after="never">
+<!-- expires-never: https://crbug.com/966137 -->
+
<owner>sebmarchand@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
<summary>
The maximum number of tabs per window that Chrome displays over the course
- of a day.
+ of a day. Desktop Only.
NOTE: This metric is asynchronous, the value reported on a given day
represents the previous day's observations (which can be from a different
@@ -127691,11 +131915,14 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Tabs.MaxWindowsInADay" units="tabs">
+<histogram name="Tabs.MaxWindowsInADay" units="tabs" expires_after="never">
+<!-- expires-never: https://crbug.com/966137 -->
+
<owner>sebmarchand@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
<summary>
The maximum number of windows existing at the same time over the course of a
- day.
+ day. Desktop only.
NOTE: This metric is asynchronous, the value reported on a given day
represents the previous day's observations (which can be from a different
@@ -127703,8 +131930,11 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Tabs.NumberOfTabsOnResume" units="tabs">
+<histogram name="Tabs.NumberOfTabsOnResume" units="tabs" expires_after="never">
+<!-- expires-never: https://crbug.com/966137 -->
+
<owner>sebmarchand@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
<summary>
The number of tabs total at resume from sleep/hibernate. This is being
logged on all desktop platforms.
@@ -127836,6 +132066,30 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Tabs.ScrubbedInInterval.KeyPress" units="tabs"
+ expires_after="2019-12-01">
+ <owner>corising@chromium.org</owner>
+ <owner>chrome-desktop-ui-sea@google.com</owner>
+ <summary>
+ This histogram records the number of tabs that are 'scrubbed' by key press
+ during a given interval of time (i.e. ctrl+tab navigation). For this metric,
+ a tab is considered 'scrubbed' if it was active for less than or equal to a
+ given amount of time.
+ </summary>
+</histogram>
+
+<histogram name="Tabs.ScrubbedInInterval.MousePress" units="tabs"
+ expires_after="2019-12-01">
+ <owner>corising@chromium.org</owner>
+ <owner>chrome-desktop-ui-sea@google.com</owner>
+ <summary>
+ This histogram records the number of tabs that are 'scrubbed' by mouse press
+ during a given interval of time. For this metric, a tab is considered
+ 'scrubbed' if it was active for less than or equal to a given amount of
+ time.
+ </summary>
+</histogram>
+
<histogram name="Tabs.ScrubDistance" units="tabs" expires_after="2018-08-30">
<owner>Please list the metric's owners. Add more owner tags as needed.</owner>
<summary>
@@ -127997,8 +132251,11 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Tabs.TabCount" units="tabs">
+<histogram name="Tabs.TabCount" units="tabs" expires_after="never">
+<!-- expires-never: https://crbug.com/966137 -->
+
<owner>sebmarchand@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
<summary>
Counts the number of tabs across all windows, reported every 5 minutes.
Desktop only.
@@ -128190,6 +132447,18 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Tabs.TimeSinceLastView.OnTabClobber" units="seconds"
+ expires_after="M82">
+ <owner>mattsimmons@chromium.org</owner>
+ <owner>memex-team@google.com</owner>
+ <summary>
+ When a tab is revisited and subsequently the omnibox is focused within a
+ certain threshold of time, this reports the amount of time in seconds that
+ has passed since the last user engagement with the tab. Currently
+ Android-only.
+ </summary>
+</histogram>
+
<histogram name="Tabs.TimeSinceLastView.OnTabClose" units="seconds"
expires_after="M82">
<owner>mattsimmons@chromium.org</owner>
@@ -128246,8 +132515,11 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Tabs.WindowCount" units="tabs" expires_after="M77">
+<histogram name="Tabs.WindowCount" units="tabs" expires_after="never">
+<!-- expires-never: https://crbug.com/966137 -->
+
<owner>sebmarchand@chromium.org</owner>
+ <owner>catan-team@chromium.org</owner>
<summary>
Counts the number of Chrome windows, reported every 5 minutes. Desktop only.
</summary>
@@ -128486,6 +132758,61 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="TextFragmentAnchor.AmbiguousMatch" enum="Boolean"
+ expires_after="M81">
+ <owner>nburris@chromium.org</owner>
+ <owner>bokan@chromium.org</owner>
+ <summary>Whether we found multiple matches for a selector.</summary>
+</histogram>
+
+<histogram name="TextFragmentAnchor.DidScrollIntoView" enum="Boolean"
+ expires_after="M81">
+ <owner>nburris@chromium.org</owner>
+ <owner>bokan@chromium.org</owner>
+ <summary>
+ Whether the page did a non-zero scroll in order to scroll the match into
+ view. Only recorded if we found a match and scrolled it into view.
+ </summary>
+</histogram>
+
+<histogram name="TextFragmentAnchor.MatchRate" units="%" expires_after="M81">
+ <owner>nburris@chromium.org</owner>
+ <owner>bokan@chromium.org</owner>
+ <summary>
+ The percentage of selectors for which a match was found in the document.
+ </summary>
+</histogram>
+
+<histogram name="TextFragmentAnchor.ScrollCancelled" enum="Boolean"
+ expires_after="M81">
+ <owner>nburris@chromium.org</owner>
+ <owner>bokan@chromium.org</owner>
+ <summary>
+ Whether the scroll into view was cancelled by a user gesture or programmatic
+ scroll.
+ </summary>
+</histogram>
+
+<histogram name="TextFragmentAnchor.SelectorCount" units="selectors"
+ expires_after="M81">
+ <owner>nburris@chromium.org</owner>
+ <owner>bokan@chromium.org</owner>
+ <summary>
+ The number of selectors in the text fragment anchor if it is present.
+ </summary>
+</histogram>
+
+<histogram name="TextFragmentAnchor.TimeToScrollIntoView" units="ms"
+ expires_after="M81">
+ <owner>nburris@chromium.org</owner>
+ <owner>bokan@chromium.org</owner>
+ <summary>
+ The time between creating the TextFragmentAnchor (i.e. when it is parsed)
+ and scrolling the target into view. Only recorded if there is a match and we
+ scroll it into view.
+ </summary>
+</histogram>
+
<histogram name="TextToSpeech.Event" enum="TextToSpeechEvent">
<owner>dmazzoni@chromium.org</owner>
<summary>
@@ -128993,7 +133320,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Thumbnails.CopyFromSurfaceTime" units="ms">
+<histogram name="Thumbnails.CopyFromSurfaceTime" units="ms" expires_after="M78">
<owner>treib@chromium.org</owner>
<summary>
While taking a screenshot of the current tab for use as a thumbnail on the
@@ -129021,7 +133348,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="Thumbnails.ProcessBitmapTime" units="ms">
+<histogram name="Thumbnails.ProcessBitmapTime" units="ms" expires_after="M78">
<owner>treib@chromium.org</owner>
<summary>
While taking a screenshot of the current tab for use as a thumbnail on the
@@ -129822,7 +134149,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="Translate.LanguageVerification"
- enum="TranslateLanguageVerification">
+ enum="TranslateLanguageVerification" expires_after="M78">
<owner>yyushkina@chromium.org</owner>
<summary>
For each page load, measures whether the provided HTML language (i.e. the
@@ -130195,7 +134522,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="TrustedWebActivity.TranslucencyRemovalFailed" enum="Boolean"
- expires_after="M80">
+ expires_after="M76">
<owner>pshmakov@chromium.org</owner>
<owner>peconn@chromium.org</owner>
<owner>peter@chromium.org</owner>
@@ -130450,7 +134777,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="UKM.SyncDisable.Purge" enum="Boolean"
- expires_after="2019-05-01">
+ expires_after="2020-05-01">
<owner>bcwhite@chromium.org</owner>
<owner>rkaplow@chromium.org</owner>
<summary>
@@ -131079,7 +135406,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="UMA.LogUpload.Canceled.CellularConstraint"
- enum="BooleanCanceled" expires_after="2019-04-30">
+ enum="BooleanCanceled" expires_after="2020-04-30">
<owner>holte@chromium.org</owner>
<owner>asvitkine@chromium.org</owner>
<summary>
@@ -131301,6 +135628,16 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="UMA.PersistentHistograms.TmpRemovals" expires_after="M77">
+ <owner>bcwhite@chromium.org</owner>
+ <owner>asvitkine@chromium.org</owner>
+ <summary>
+ Number of old .tmp files of the kind that Windows creates and leaves around
+ when trying to rename a file to another one that already exists. See
+ https://crbug.com/934164
+ </summary>
+</histogram>
+
<histogram name="UMA.PrimaryUserType" enum="UserType"
expires_after="2020-04-01">
<owner>michaelpg@chromium.org</owner>
@@ -131446,7 +135783,7 @@ should be kept until we use this API. -->
</details>
</histogram>
-<histogram name="UMA.UnsentLogs.Dropped" expires_after="2019-04-30">
+<histogram name="UMA.UnsentLogs.Dropped" expires_after="2019-08-30">
<owner>holte@chromium.org</owner>
<owner>asvitkine@chromium.org</owner>
<summary>
@@ -132296,6 +136633,16 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="UpgradeDetector.DaysBeforeUpgrade" units="days"
+ expires_after="M80">
+ <owner>ksspiers@chromium.org</owner>
+ <owner>nrpeter@chromium.org</owner>
+ <summary>
+ Measures the time elapsed from an update being visible to the browser and
+ the browser being restarted or quit.
+ </summary>
+</histogram>
+
<histogram name="UpgradeDetector.NotificationStage"
enum="UpgradeNotificationStage" expires_after="M77">
<owner>spqchan@chromium.org</owner>
@@ -132305,9 +136652,9 @@ should be kept until we use this API. -->
</histogram>
<histogram name="UpgradeDetector.RollbackReason"
- enum="UpgradeDetectorRollbackReason" expires_after="M76">
- <owner>hunyadym@chromium.org</owner>
- <owner>zentaro@chromium.org</owner>
+ enum="UpgradeDetectorRollbackReason" expires_after="M80">
+ <owner>isandrk@chromium.org</owner>
+ <owner>poromov@chromium.org</owner>
<summary>
Tracks what is the reason we're doing a rollback instead of an update (going
to a more stable channel or admin-initiated enterprise rollback). We're
@@ -133126,7 +137473,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCBackgroundScavenger" units="ms" expires_after="M77">
+<histogram name="V8.GCBackgroundScavenger" units="ms"
+ expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<summary>
Time spent in background tasks doing scavenging in one GC cycle. It is
@@ -133134,7 +137482,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCBackgroundSweeping" units="ms" expires_after="M77">
+<histogram name="V8.GCBackgroundSweeping" units="ms" expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<summary>
Time spent in background tasks doing sweeping in one GC cycle. It is
@@ -133147,21 +137495,23 @@ should be kept until we use this API. -->
<summary>Time spent in mark-sweep phase of GC.</summary>
</histogram>
-<histogram name="V8.GCCompactorBackground" units="ms" expires_after="M77">
+<histogram name="V8.GCCompactorBackground" units="ms"
+ expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>
Time spent in mark-sweep phase of GC in a background isolate.
</summary>
</histogram>
-<histogram name="V8.GCCompactorForeground" units="ms" expires_after="M77">
+<histogram name="V8.GCCompactorForeground" units="ms"
+ expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>
Time spent in mark-sweep phase of GC in a foreground isolate.
</summary>
</histogram>
-<histogram name="V8.GCContext" units="ms" expires_after="M77">
+<histogram name="V8.GCContext" units="ms" expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>Time spent doing a full GC during an IdleNotification.</summary>
</histogram>
@@ -133175,7 +137525,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCFinalizeMC.Clear" units="ms" expires_after="M77">
+<histogram name="V8.GCFinalizeMC.Clear" units="ms" expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133184,7 +137534,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCFinalizeMC.Epilogue" units="ms" expires_after="M77">
+<histogram name="V8.GCFinalizeMC.Epilogue" units="ms"
+ expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133192,7 +137543,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCFinalizeMC.Evacuate" units="ms" expires_after="M77">
+<histogram name="V8.GCFinalizeMC.Evacuate" units="ms"
+ expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133201,7 +137553,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCFinalizeMC.Finish" units="ms" expires_after="M77">
+<histogram name="V8.GCFinalizeMC.Finish" units="ms" expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133210,7 +137562,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCFinalizeMC.Mark" units="ms">
+<histogram name="V8.GCFinalizeMC.Mark" units="ms" expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133219,7 +137571,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCFinalizeMC.Prologue" units="ms" expires_after="M77">
+<histogram name="V8.GCFinalizeMC.Prologue" units="ms"
+ expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133227,7 +137580,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCFinalizeMC.Sweep" units="ms" expires_after="M77">
+<histogram name="V8.GCFinalizeMC.Sweep" units="ms" expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133236,7 +137589,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCFinalizeMCBackground" units="ms" expires_after="M77">
+<histogram name="V8.GCFinalizeMCBackground" units="ms"
+ expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133264,7 +137618,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="V8.GCFinalizeMCReduceMemoryBackground" units="ms"
- expires_after="M77">
+ expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133274,7 +137628,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="V8.GCFinalizeMCReduceMemoryForeground" units="ms"
- expires_after="M77">
+ expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<owner>hpayer@chromium.org</owner>
<summary>
@@ -133283,7 +137637,7 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCIdleNotification" units="ms" expires_after="M77">
+<histogram name="V8.GCIdleNotification" units="ms" expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>Time spent in IdleNotifications.</summary>
</histogram>
@@ -133319,13 +137673,13 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCIncrementalMarking" units="ms" expires_after="M77">
+<histogram name="V8.GCIncrementalMarking" units="ms" expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>Time spent doing incremental marking steps during GC.</summary>
</histogram>
<histogram name="V8.GCIncrementalMarkingFinalize" units="ms"
- expires_after="M77">
+ expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>Time spent in finalizing incremental marking.</summary>
</histogram>
@@ -133335,7 +137689,8 @@ should be kept until we use this API. -->
<summary>Reason an incremental marking was started in V8.</summary>
</histogram>
-<histogram name="V8.GCIncrementalMarkingStart" units="ms" expires_after="M77">
+<histogram name="V8.GCIncrementalMarkingStart" units="ms"
+ expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>Time spent in starting incremental marking.</summary>
</histogram>
@@ -133348,7 +137703,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCLowMemoryNotification" units="ms" expires_after="M77">
+<histogram name="V8.GCLowMemoryNotification" units="ms"
+ expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>Time spent in LowMemoryNotifications.</summary>
</histogram>
@@ -133378,7 +137734,7 @@ should be kept until we use this API. -->
<summary>Reason a mark-compact garbage collection was started in V8.</summary>
</histogram>
-<histogram name="V8.GCMarkingSum" units="ms" expires_after="2020-04-01">
+<histogram name="V8.GCMarkingSum" units="ms" expires_after="2020-06-01">
<owner>mlippautz@chromium.org</owner>
<summary>
Sum of all durations of all marking phases (incremental and non-incremental)
@@ -133400,12 +137756,14 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="V8.GCScavenger.ScavengeRoots" units="ms" expires_after="M77">
+<histogram name="V8.GCScavenger.ScavengeRoots" units="ms"
+ expires_after="2020-06-01">
<owner>mlippautz@chromium.org</owner>
<summary>Time spent in scavenging the roots during a V8 scavenge.</summary>
</histogram>
-<histogram name="V8.GCScavengerBackground" units="ms" expires_after="M77">
+<histogram name="V8.GCScavengerBackground" units="ms"
+ expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>
Time spent in scavenging phase of GC in a background isolate.
@@ -133413,7 +137771,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="V8.GCScavengeReason" enum="GarbageCollectionReason"
- expires_after="M77">
+ expires_after="2020-06-01">
<owner>ulan@chromium.org</owner>
<summary>Reason a scavenge garbage collection was started in V8.</summary>
</histogram>
@@ -133463,7 +137821,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="V8.MemoryExternalFragmentationLoSpace" units="%"
- expires_after="M77">
+ expires_after="2020-06-01">
<owner>hpayer@chromium.org</owner>
<summary>
External memory fragmentation in the large object space after each GC in
@@ -133935,6 +138293,19 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="V8.WasmCodeGCTime" units="microseconds"
+ expires_after="2020-03-31">
+ <owner>titzer@chromium.org</owner>
+ <owner>adamk@chromium.org</owner>
+ <owner>clemensh@chromium.org</owner>
+ <summary>
+ Time to execute a single WebAssembly code GC, measured from when it is
+ triggered until all isolates reported live code and all dead code was freed.
+ Recorded after each WebAssembly code GC if a high-resolution clock is
+ available.
+ </summary>
+</histogram>
+
<histogram name="V8.WasmCompileFunctionMicroSeconds" units="microseconds">
<owner>titzer@chromium.org</owner>
<owner>adamk@chromium.org</owner>
@@ -134146,6 +138517,17 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="V8.WasmModuleCodeSizeFreed" units="MB"
+ expires_after="2020-03-31">
+ <owner>titzer@chromium.org</owner>
+ <owner>adamk@chromium.org</owner>
+ <owner>clemensh@chromium.org</owner>
+ <summary>
+ The amount of WebAssembly code freed by garbage collection, in MiB. Recorded
+ for each live module after each full GC.
+ </summary>
+</histogram>
+
<histogram name="V8.WasmModuleCodeSizeMiB" units="MB"
expires_after="2020-03-31">
<owner>titzer@chromium.org</owner>
@@ -134157,6 +138539,18 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="V8.WasmModuleCodeSizePercentFreed" units="%"
+ expires_after="2020-03-31">
+ <owner>titzer@chromium.org</owner>
+ <owner>adamk@chromium.org</owner>
+ <owner>clemensh@chromium.org</owner>
+ <summary>
+ The percentage of WebAssembly code freed by garbage collection (ratio of
+ total freed code to total generated code so far). Recorded for each live
+ module after each full GC.
+ </summary>
+</histogram>
+
<histogram name="V8.WasmModuleCodeSizeTopTierMiB" units="MB"
expires_after="2020-03-31">
<owner>titzer@chromium.org</owner>
@@ -134168,6 +138562,17 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="V8.WasmModuleNumberOfCodeGCsTriggered" units="gcs"
+ expires_after="2020-03-31">
+ <owner>titzer@chromium.org</owner>
+ <owner>adamk@chromium.org</owner>
+ <owner>clemensh@chromium.org</owner>
+ <summary>
+ Number of code GCs triggered per WebAssembly module. Recorded after each
+ code GC.
+ </summary>
+</histogram>
+
<histogram name="V8.WasmModuleSizeBytes" units="bytes">
<owner>titzer@chromium.org</owner>
<owner>adamk@chromium.org</owner>
@@ -134634,7 +139039,7 @@ should be kept until we use this API. -->
</histogram>
<histogram name="Variations.SeedProcessingTime" units="ms"
- expires_after="2019-04-30">
+ expires_after="2020-04-30">
<owner>isherman@chromium.org</owner>
<owner>asvitkine@chromium.org</owner>
<summary>
@@ -135996,7 +140401,21 @@ should be kept until we use this API. -->
The HTTP status code class returned for each icon loaded during a WebApp's
creation. See corresponding
Extensions.BookmarkApp.Icon.HttpStatusCodeClassOnCreate histogram for legacy
- extension-based system.
+ extension-based system. Recorded when WebAppDataRetriever starts downloading
+ icons.
+ </summary>
+</histogram>
+
+<histogram name="WebApp.Icon.HttpStatusCodeClassOnSync"
+ enum="HttpStatusCodeClass" expires_after="2021-01-01">
+ <owner>alancutter@chromium.org</owner>
+ <owner>mgiuca@chromium.org</owner>
+ <owner>loyso@chromium.org</owner>
+ <summary>
+ The HTTP status code class returned for each icon loaded when syncing a
+ WebApp. See Extensions.BookmarkApp.Icon.HttpStatusCodeClassOnSync histogram
+ for legacy extension-based system. Recorded when WebAppDataRetriever starts
+ downloading icons.
</summary>
</histogram>
@@ -136010,6 +140429,17 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="Webapp.Install.InstallBounce" enum="WebappInstallSource"
+ expires_after="2021-01-01">
+ <owner>dominickn@chromium.org</owner>
+ <owner>alancutter@chromium.org</owner>
+ <summary>
+ Records when a web app install bounced for different install sources. A
+ bounce is when the user uninstalls the web app within 1 hour of installing
+ it.
+ </summary>
+</histogram>
+
<histogram name="Webapp.Install.InstallEvent" enum="WebappInstallSource">
<owner>dominickn@chromium.org</owner>
<owner>loyso@chromium.org</owner>
@@ -136498,9 +140928,19 @@ should be kept until we use this API. -->
<owner>kenrb@chromium.org</owner>
<owner>kpaulhamus@chromium.org</owner>
<summary>
- Records the transport used for a WebAuthentication GetAssertion request to
- an authenticator device, to help understand the breakdown of authenticator
- types in use.
+ Records the transport used for all WebAuthentication GetAssertion requests
+ sent to authenticators. This does not necessarily mean that there was a
+ success response from any given authenticator.
+ </summary>
+</histogram>
+
+<histogram name="WebAuthentication.GetAssertionResponseTransport"
+ enum="WebAuthenticationFidoTransport" expires_after="2019-12-31">
+ <owner>kenrb@chromium.org</owner>
+ <owner>kpaulhamus@chromium.org</owner>
+ <summary>
+ Records the transport used when an authenticator responds with success to a
+ WebAuthentication GetAssertion request.
</summary>
</histogram>
@@ -136514,6 +140954,27 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="WebAuthentication.MakeCredentialRequestTransport"
+ enum="WebAuthenticationFidoTransport" expires_after="2019-12-31">
+ <owner>kenrb@chromium.org</owner>
+ <owner>kpaulhamus@chromium.org</owner>
+ <summary>
+ Records the transport used for all WebAuthentication MakeCredential requests
+ sent to authenticators. This does not necessarily mean that there was a
+ success response from any given authenticator.
+ </summary>
+</histogram>
+
+<histogram name="WebAuthentication.MakeCredentialResponseTransport"
+ enum="WebAuthenticationFidoTransport" expires_after="2019-12-31">
+ <owner>kenrb@chromium.org</owner>
+ <owner>kpaulhamus@chromium.org</owner>
+ <summary>
+ Records the transport used when an authenticator responds with success to a
+ WebAuthentication MakeCredential request.
+ </summary>
+</histogram>
+
<histogram name="WebAuthentication.RelyingPartySecurityCheckFailure"
enum="WebAuthenticationRelyingPartySecurityCheckFailure"
expires_after="2019-12-31">
@@ -136543,6 +141004,15 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="WebController.BackForwardListOutOfSync" enum="BooleanHit">
+ <owner>gambard@chromium.org</owner>
+ <summary>
+ [iOS] Counts the number of time the backForwardList of the WebView gets out
+ of sync with the URL exposed by the WebView. This should not happen and is
+ probably an issue in WebKit. This is only recorded when there is an error.
+ </summary>
+</histogram>
+
<histogram name="WebController.CertVerificationErrorsCacheHit"
enum="BooleanCacheHit" expires_after="M77">
<owner>eugenebut@chromium.org</owner>
@@ -137358,7 +141828,7 @@ should be kept until we use this API. -->
<histogram
name="WebCore.IndexedDB.TombstoneSweeper.DeletionCommitTime.Complete"
- units="ms">
+ units="ms" expires_after="M78">
<owner>dmurph@chromium.org</owner>
<summary>
Records the time it takes for the IndexedDB Tombstone Sweeper to commit
@@ -137476,7 +141946,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="WebCore.IndexedDB.Transaction.ReadOnly.TimeActive" units="ms">
+<histogram name="WebCore.IndexedDB.Transaction.ReadOnly.TimeActive" units="ms"
+ expires_after="M78">
<owner>dmurph@chromium.org</owner>
<summary>
The time it takes for an IndexedDB ReadOnly Transaction to commit, starting
@@ -138383,6 +142854,10 @@ should be kept until we use this API. -->
</histogram>
<histogram name="WebRTC.AecDelayBasedQuality" enum="DelayBasedEchoQuality">
+ <obsolete>
+ Deprecated 5/2019 in issue bugs.webrtc.org/10563 due to the reporting
+ component (AEC2) being deprecated.
+ </obsolete>
<owner>hlundin@chromium.org</owner>
<summary>
Captures if the estimated delay between rendered and captured audio is out
@@ -138442,6 +142917,10 @@ should be kept until we use this API. -->
</histogram>
<histogram name="WebRTC.Audio.AecDelayAdjustmentMsAgnosticValue" units="ms">
+ <obsolete>
+ Deprecated 4/2019 in issue bugs.webrtc.org/10563 due to the reporting
+ component (AEC2) being deprecated.
+ </obsolete>
<owner>hlundin@chromium.org</owner>
<summary>
The AEC in WebRTC will sometimes realign the far- and near-end signal
@@ -138453,6 +142932,10 @@ should be kept until we use this API. -->
</histogram>
<histogram name="WebRTC.Audio.AecDelayAdjustmentMsSystemValue" units="ms">
+ <obsolete>
+ Deprecated 4/2019 in issue bugs.webrtc.org/10563 due to the reporting
+ component (AEC2) being deprecated.
+ </obsolete>
<owner>hlundin@chromium.org</owner>
<summary>
The AEC in WebRTC will sometimes realign the far- and near-end signal
@@ -139031,7 +143514,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="WebRTC.Audio.JitterBufferFullPerMinute" units="events/minute">
+<histogram name="WebRTC.Audio.JitterBufferFullPerMinute" units="events/minute"
+ expires_after="M78">
<owner>minyue@chromium.org</owner>
<summary>
Frequency that audio packets hits the capacity of WebRTC jitter buffer. A
@@ -139176,7 +143660,8 @@ should be kept until we use this API. -->
</summary>
</histogram>
-<histogram name="WebRTC.AudioInputSampleRate" enum="AudioSampleRate">
+<histogram name="WebRTC.AudioInputSampleRate" enum="AudioSampleRate"
+ expires_after="M78">
<owner>henrika@chromium.org</owner>
<summary>Audio input sample rate for WebRTC (in Hz).</summary>
</histogram>
@@ -141449,6 +145934,17 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="WebRtcEventLogging.NetError" expires_after="2019-12-31">
+ <owner>eladalon@chromium.org</owner>
+ <owner>saeedj@google.com</owner>
+ <owner>manj@google.com</owner>
+ <owner>dmitriyg@google.com</owner>
+ <summary>
+ NetError returned by the SimpleURLLoader object in charge of uploading a
+ WebRTC event log file.
+ </summary>
+</histogram>
+
<histogram name="WebRtcEventLogging.Upload" enum="WebRtcEventLoggingUploadEnum"
expires_after="2019-12-31">
<owner>eladalon@chromium.org</owner>
@@ -141511,6 +146007,18 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="WebShare.Unverified" enum="SBClientDownloadExtensions"
+ expires_after="M82">
+ <owner>ericwilligers@chromium.org</owner>
+ <owner>hartmanng@chromium.org</owner>
+ <owner>hzjian@chromium.org</owner>
+ <owner>yfriedman@chromium.org</owner>
+ <summary>
+ File types included in navigator.share() requests, where file content and
+ source URLs were not verified with Safe Browsing.
+ </summary>
+</histogram>
+
<histogram name="WebsiteSettings.Action" enum="WebsiteSettingsAction">
<owner>estark@chromium.org</owner>
<summary>
@@ -142599,8 +147107,9 @@ should be kept until we use this API. -->
</histogram>
<histogram name="XHR.Sync.PageDismissal_forbidden" enum="XHRPageDismissalState"
- expires_after="2019-06-01">
- <owner>kdillon@chromium.org, panicker@chromium.org</owner>
+ expires_after="2019-09-05">
+ <owner>kdillon@chromium.org</owner>
+ <owner>panicker@chromium.org</owner>
<summary>
Records occurence of sync XHR requests during page dismissal state (unload,
beforeunload, pagehide etc) that were forbidden.
@@ -142614,6 +147123,14 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="XR.RuntimeUsed" enum="XRDeviceId">
+ <owner>billorr@chromium.org</owner>
+ <summary>
+ Indicates which XR runtime was used for a session. Recorded when the session
+ was successfully created.
+ </summary>
+</histogram>
+
<histogram name="XR.VRSession.StartAction" enum="VRSessionStartAction">
<owner>billorr@chromium.org</owner>
<summary>
@@ -142622,6 +147139,46 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="XR.WebXR.ConsentFlow" enum="XRSessionRequestDialogAction"
+ expires_after="M80">
+ <owner>sumankancherla@chromium.org</owner>
+ <owner>xr-dev@chromium.org</owner>
+ <summary>
+ Records the actions of a user consent dialog which is displayed on
+ requesting an XR session.
+ </summary>
+</histogram>
+
+<histogram name="XR.WebXR.ConsentFlowDuration.ConsentFlowAborted" units="ms"
+ expires_after="M80">
+ <owner>sumankancherla@chromium.org</owner>
+ <owner>xr-dev@chromium.org</owner>
+ <summary>
+ Time the user takes to abort the consent flow by clicking on the
+ window-close system button of a session request consent dialog.
+ </summary>
+</histogram>
+
+<histogram name="XR.WebXR.ConsentFlowDuration.ConsentGranted" units="ms"
+ expires_after="M80">
+ <owner>sumankancherla@chromium.org</owner>
+ <owner>xr-dev@chromium.org</owner>
+ <summary>
+ Time the user takes to click on the allow-and-enter-VR button on a session
+ request consent dialog.
+ </summary>
+</histogram>
+
+<histogram name="XR.WebXR.ConsentFlowDuration.ConsentNotGranted" units="ms"
+ expires_after="M80">
+ <owner>sumankancherla@chromium.org</owner>
+ <owner>xr-dev@chromium.org</owner>
+ <summary>
+ Time the user takes to click on dont-allow button on a session request
+ consent dialog.
+ </summary>
+</histogram>
+
<histogram name="XR.WebXR.PresentationSession" enum="VRPresentationStartAction">
<owner>billorr@chromium.org</owner>
<summary>
@@ -142630,6 +147187,22 @@ should be kept until we use this API. -->
</summary>
</histogram>
+<histogram name="XR.WebXR.ReferenceSpace.Requested" enum="XRReferenceSpaceType">
+ <owner>billorr@chromium.org</owner>
+ <summary>
+ Records which reference space was requested when a site calls
+ XRSession.requestReferenceSpace().
+ </summary>
+</histogram>
+
+<histogram name="XR.WebXR.ReferenceSpace.Succeeded" enum="XRReferenceSpaceType">
+ <owner>billorr@chromium.org</owner>
+ <summary>
+ Records which reference spaces are successfully created when the promise
+ returned by XRSession.requestReferenceSpace() is resolved.
+ </summary>
+</histogram>
+
<histogram name="XR.WebXR.RenderPath.Used" enum="XRRenderPath"
expires_after="M77">
<owner>klausw@chromium.org</owner>
@@ -142681,6 +147254,8 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="AccessorySheetType" separator=".">
+ <suffix name="Addresses" label="Address suggestions."/>
+ <suffix name="CreditCards" label="Payment suggestions."/>
<suffix name="Passwords" label="Password suggestions and generation."/>
<affected-histogram name="KeyboardAccessory.AccessorySheetSuggestionCount"/>
<affected-histogram
@@ -142747,6 +147322,8 @@ should be kept until we use this API. -->
<affected-histogram
name="AutoScreenBrightness.AdapterDecisionAtUserChange.Darken.AlsStd"/>
<affected-histogram
+ name="AutoScreenBrightness.AdapterDecisionAtUserChange.ModelIteration"/>
+ <affected-histogram
name="AutoScreenBrightness.AdapterDecisionAtUserChange.Unknown.AlsStd"/>
</histogram_suffixes>
@@ -142826,9 +147403,15 @@ should be kept until we use this API. -->
<affected-histogram
name="PageLoad.Clients.Ads.Cpu.AdFrames.PerFrame.PercentUsage.Activated"/>
<affected-histogram
+ name="PageLoad.Clients.Ads.Cpu.AdFrames.PerFrame.TotalUsage.Activated"/>
+ <affected-histogram
name="PageLoad.Clients.Ads.NonVisible.Cpu.AdFrames.PerFrame.PercentUsage.Activated"/>
<affected-histogram
+ name="PageLoad.Clients.Ads.NonVisible.Cpu.AdFrames.PerFrame.TotalUsage.Activated"/>
+ <affected-histogram
name="PageLoad.Clients.Ads.Visible.Cpu.AdFrames.PerFrame.PercentUsage.Activated"/>
+ <affected-histogram
+ name="PageLoad.Clients.Ads.Visible.Cpu.AdFrames.PerFrame.TotalUsage.Activated"/>
</histogram_suffixes>
<histogram_suffixes name="AdsPageLoadMetricsBytes" separator=".">
@@ -142847,33 +147430,53 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="AdsPageLoadMetricsCpu" separator=".">
- <suffix base="true" name="AdFrames.PerFrame.PercentUsage"
+ <suffix name="AdFrames.PerFrame.PeakWindowedPercent"
+ label="The peak load over all 30 second windows while the page is
+ unactivated of an ad creative. This is measured as percentage of
+ a cpu core used and capped at 100% for multicore systems."/>
+ <suffix name="AdFrames.PerFrame.PercentUsage"
label="The average load of an ad creative across the life of the page.
- This is measured at percentage of a cpu core used and capped at
+ This is measured as percentage of a cpu core used and capped at
100% for multicore systems."/>
+ <suffix name="AdFrames.PerFrame.TotalUsage"
+ label="The total load of an ad creative across the life of the page.
+ This is measured in milliseconds and capped at 10 seconds."/>
<affected-histogram name="PageLoad.Clients.Ads.Cpu"/>
<affected-histogram name="PageLoad.Clients.Ads.NonVisible.Cpu"/>
<affected-histogram name="PageLoad.Clients.Ads.Visible.Cpu"/>
</histogram_suffixes>
<histogram_suffixes name="AdsPageLoadMetricsCpuActivated" separator=".">
- <suffix base="true" name="Activated"
+ <suffix name="Activated"
label="Includes only creatives that have had a user gesture."/>
- <suffix base="true" name="Unactivated"
+ <suffix name="Unactivated"
label="Includes only creatives without a user gesture."/>
<affected-histogram
name="PageLoad.Clients.Ads.Cpu.AdFrames.PerFrame.PercentUsage"/>
<affected-histogram
+ name="PageLoad.Clients.Ads.Cpu.AdFrames.PerFrame.TotalUsage"/>
+ <affected-histogram
name="PageLoad.Clients.Ads.NonVisible.Cpu.AdFrames.PerFrame.PercentUsage"/>
<affected-histogram
+ name="PageLoad.Clients.Ads.NonVisible.Cpu.AdFrames.PerFrame.TotalUsage"/>
+ <affected-histogram
name="PageLoad.Clients.Ads.Visible.Cpu.AdFrames.PerFrame.PercentUsage"/>
+ <affected-histogram
+ name="PageLoad.Clients.Ads.Visible.Cpu.AdFrames.PerFrame.TotalUsage"/>
</histogram_suffixes>
<histogram_suffixes name="AdsPageLoadMetricsCpuFullPage" separator=".">
- <suffix base="true" name="FullPage.PercentUsage"
+ <suffix name="FullPage.PeakWindowedPercent"
+ label="The peak load over all 30 second windows during the lifetime of
+ the page. This is measured as percentage of a cpu core used and
+ capped at 100% for multicore systems."/>
+ <suffix name="FullPage.PercentUsage"
label="The average load of the page across its lifetime. This is
- measured at percentage of a cpu core used and capped at 100% for
+ measured as percentage of a cpu core used and capped at 100% for
multicore systems."/>
+ <suffix name="FullPage.TotalUsage"
+ label="The total load of the page across its lifetime. This is measured
+ in milliseconds and capped at 10 minutes."/>
<affected-histogram name="PageLoad.Clients.Ads.Cpu"/>
</histogram_suffixes>
@@ -142883,11 +147486,18 @@ should be kept until we use this API. -->
<suffix name="PreInteractive" label="Usage before the page is interactive."/>
<affected-histogram
name="PageLoad.Clients.Ads.Cpu.AdFrames.PerFrame.PercentUsage.Unactivated"/>
+ <affected-histogram
+ name="PageLoad.Clients.Ads.Cpu.AdFrames.PerFrame.TotalUsage.Unactivated"/>
<affected-histogram name="PageLoad.Clients.Ads.Cpu.FullPage.PercentUsage"/>
+ <affected-histogram name="PageLoad.Clients.Ads.Cpu.FullPage.TotalUsage"/>
<affected-histogram
name="PageLoad.Clients.Ads.NonVisible.Cpu.AdFrames.PerFrame.PercentUsage.Unactivated"/>
<affected-histogram
+ name="PageLoad.Clients.Ads.NonVisible.Cpu.AdFrames.PerFrame.TotalUsage.Unactivated"/>
+ <affected-histogram
name="PageLoad.Clients.Ads.Visible.Cpu.AdFrames.PerFrame.PercentUsage.Unactivated"/>
+ <affected-histogram
+ name="PageLoad.Clients.Ads.Visible.Cpu.AdFrames.PerFrame.TotalUsage.Unactivated"/>
</histogram_suffixes>
<histogram_suffixes name="AdsPageLoadMetricsMainFrameBytes" separator=".">
@@ -143105,14 +147715,24 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="AndroidFeatureModuleInstallDuration" separator=".">
- <suffix name="Downloading"
+ <suffix name="Download"
label="Duration between download start and download end"/>
+ <suffix name="Downloading"
+ label="Duration between download start and download end">
+ <obsolete>
+ Deprecated in favor of 'Download'
+ </obsolete>
+ </suffix>
<suffix name="Installing"
label="Duration between install start and install end"/>
<suffix name="PendingDownload"
- label="Duration between request and downloast start"/>
+ label="Duration between request and download start"/>
<suffix name="PendingInstall"
- label="Duration between download end and install start"/>
+ label="Duration between download end and install start">
+ <obsolete>
+ State does not exist
+ </obsolete>
+ </suffix>
<affected-histogram name="Android.FeatureModules.CachedInstallDuration"/>
<affected-histogram name="Android.FeatureModules.UncachedInstallDuration"/>
</histogram_suffixes>
@@ -143120,6 +147740,7 @@ should be kept until we use this API. -->
<histogram_suffixes name="AndroidFeatureModuleName" separator=".">
<suffix name="ar" label="Augmented Reality Module"/>
<suffix name="autofill_assistant" label="Assistant-in-Chrome Module"/>
+ <suffix name="devtools" label="Developer Tools Module"/>
<suffix name="tab_ui" label="Tab Management Module"/>
<suffix name="vr" label="Virtual Reality Module"/>
<affected-histogram name="Android.FeatureModules.CachedInstallDuration"/>
@@ -143223,6 +147844,22 @@ should be kept until we use this API. -->
<affected-histogram name="Apps.AppListAppLaunchedV2"/>
</histogram_suffixes>
+<histogram_suffixes name="AppListTabletModeTransition" separator=".">
+ <suffix name="DragReleaseHide" label="Release drag to hide the app list"/>
+ <suffix name="DragReleaseShow" label="Release drag to show the app list"/>
+ <suffix name="EnterFullscreenAllApps"
+ label="Enter kFullScreenAllApps state in tablet"/>
+ <suffix name="EnterFullscreenSearch"
+ label="Enter kFullscreenSearch state in tablet"/>
+ <suffix name="EnterOverview" label="Enter overview mode in tablet"/>
+ <suffix name="ExitOverview" label="Exit overview mode in tablet"/>
+ <suffix name="HideLauncherForWindow"
+ label="Active a window to hide the app list"/>
+ <suffix name="PressAppListButtonShow"
+ label="Press the AppList button to show the app list"/>
+ <affected-histogram name="Apps.HomeLauncherTransition.AnimationSmoothness"/>
+</histogram_suffixes>
+
<histogram_suffixes name="AppListTargetState" separator=".">
<suffix name="Close.ClamshellMode" label="Closing the app list"/>
<suffix name="FullscreenAllApps.ClamshellMode"
@@ -143247,6 +147884,16 @@ should be kept until we use this API. -->
<affected-histogram name="Apps.ContextMenuUserJourneyTime"/>
</histogram_suffixes>
+<histogram_suffixes name="ArcPerformanceAppCategories" separator=".">
+ <suffix name="CasualGame" label="Casual game."/>
+ <suffix name="OnlineGame" label="Online game."/>
+ <suffix name="ShooterGame" label="Shooter game."/>
+ <suffix name="Video" label="Video playback app."/>
+ <affected-histogram name="Arc.Runtime.Performance.CommitDeviation"/>
+ <affected-histogram name="Arc.Runtime.Performance.FPS"/>
+ <affected-histogram name="Arc.Runtime.Performance.RenderQuality"/>
+</histogram_suffixes>
+
<histogram_suffixes name="ArcUserTypes" separator=".">
<suffix name="ActiveDirectory" label="User with active directory account"/>
<suffix name="Child" label="User with child accounts."/>
@@ -143320,21 +147967,24 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="AutofillAddressFormType" separator=".">
- <suffix name="AddressOnly" label="Form has name and address fields"/>
+ <suffix name="AddressOnly" label="Form has address and maybe name fields"/>
<suffix name="AddressPlusContact"
label="Encompasses AddressPlusEmail, AddressPlusPhone, and
AddressPlusEmailPlusPhone"/>
<suffix name="AddressPlusEmail"
- label="Form has name, address, and email fields"/>
+ label="Form has address, email, and maybe name fields"/>
<suffix name="AddressPlusEmailPlusPhone"
- label="Form has name, address, email, and phone fields"/>
+ label="Form has address, email, phone, and maybe name fields"/>
<suffix name="AddressPlusPhone"
- label="Form has name, address, and phone fields"/>
- <suffix name="ContactOnly" label="Form has name and phone or email fields"/>
+ label="Form has address, phone, and maybe name fields"/>
+ <suffix name="ContactOnly"
+ label="Form has name and phone; name and email; or phone, email, and
+ maybe name fields"/>
<suffix name="Other"
label="Another form type was encountered, such as a form with all
unknown fields"/>
<affected-histogram name="Autofill.FormEvents.Address"/>
+ <affected-histogram name="Autofill.UserHappiness.Address"/>
</histogram_suffixes>
<histogram_suffixes name="AutofillCreditCardInfoBarSaveType" separator=".">
@@ -143387,6 +148037,17 @@ should be kept until we use this API. -->
name="Autofill.FillDuration.FromInteraction.WithAutofill"/>
<affected-histogram
name="Autofill.FillDuration.FromInteraction.WithoutAutofill"/>
+ <affected-histogram name="Autofill.Funnel.FillAfterSuggestion"/>
+ <affected-histogram name="Autofill.Funnel.InteractionAfterParsedAsType"/>
+ <affected-histogram name="Autofill.Funnel.ParsedAsType"/>
+ <affected-histogram name="Autofill.Funnel.SubmissionAfterFill"/>
+ <affected-histogram name="Autofill.Funnel.SuggestionAfterInteraction"/>
+ <affected-histogram name="Autofill.KeyMetrics.FillingAcceptance"/>
+ <affected-histogram name="Autofill.KeyMetrics.FillingAssistance"/>
+ <affected-histogram name="Autofill.KeyMetrics.FillingCorrectness"/>
+ <affected-histogram name="Autofill.KeyMetrics.FillingReadiness"/>
+ <affected-histogram name="Autofill.KeyMetrics.FormSubmission.Autofilled"/>
+ <affected-histogram name="Autofill.KeyMetrics.FormSubmission.NotAutofilled"/>
<affected-histogram name="Autofill.UserHappiness"/>
</histogram_suffixes>
@@ -143736,6 +148397,9 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="BitstreamAudioFormats" separator=".">
+ <obsolete>
+ Removed as of May 2019.
+ </obsolete>
<suffix name="AC3" label="Dolby Digital / AC3"/>
<suffix name="DTS" label="DTS"/>
<suffix name="DTS-HD" label="DTS-HD"/>
@@ -143910,9 +148574,11 @@ should be kept until we use this API. -->
<suffix name="1msTo5ms" label="Ratio when main frame between 1ms and 5ms."/>
<suffix name="LessThan1ms" label="Ratio when main frame shorter than 1ms."/>
<suffix name="MoreThan5ms" label="Ratio when main frame longer than 5ms."/>
+ <affected-histogram name="Blink.MainFrame.AnimateRatio"/>
<affected-histogram name="Blink.MainFrame.CompositingCommitRatio"/>
<affected-histogram name="Blink.MainFrame.CompositingRatio"/>
<affected-histogram name="Blink.MainFrame.ForcedStyleAndLayoutRatio"/>
+ <affected-histogram name="Blink.MainFrame.HandleInputEventsRatio"/>
<affected-histogram name="Blink.MainFrame.IntersectionObservationRatio"/>
<affected-histogram name="Blink.MainFrame.PaintRatio"/>
<affected-histogram name="Blink.MainFrame.PrePaintRatio"/>
@@ -143934,6 +148600,20 @@ should be kept until we use this API. -->
<affected-histogram name="Blink.VisibleLoadTime.LazyLoadImages.BelowTheFold"/>
</histogram_suffixes>
+<histogram_suffixes name="BluetoothTransportTypes" separator=".">
+ <suffix name="BLE"/>
+ <suffix name="Classic"/>
+ <suffix name="Dual"/>
+ <affected-histogram name="Bluetooth.ChromeOS.Pairing.Result"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="BluetoothUISurfaces" separator=".">
+ <suffix name="Settings"/>
+ <suffix name="SystemTray"/>
+ <affected-histogram
+ name="Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt.Result"/>
+</histogram_suffixes>
+
<histogram_suffixes name="CachedImageFetcherClients" separator=".">
<obsolete>
Renamed to ImageFetcherClients on 04/2019.
@@ -143941,7 +148621,11 @@ should be kept until we use this API. -->
<suffix name="AssistantDetails"
label="Showing cache patterns only for AssistantDetails."/>
<suffix name="ContextualSuggestions"
- label="Showing cache patterns only for ContextualSuggestions."/>
+ label="Showing cache patterns only for ContextualSuggestions.">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
+ </suffix>
<suffix name="Feed" label="Showing cache patterns only for Feed."/>
<suffix name="Internal" label="Showing cache patterns only for Internal."/>
<suffix name="NewTabPageAnimatedLogo"
@@ -144291,6 +148975,16 @@ should be kept until we use this API. -->
<affected-histogram name="DiskBasedCertCache.CertIo"/>
</histogram_suffixes>
+<histogram_suffixes name="CertVerifyProcImpl" separator=".">
+ <suffix name="Android" label="CertVerifyProcAndroid"/>
+ <suffix name="Builtin" label="CertVerifyProcBuiltin"/>
+ <suffix name="IOS" label="CertVerifyProcIOS"/>
+ <suffix name="Mac" label="CertVerifyProcMac"/>
+ <suffix name="NSS" label="CertVerifyProcNSS"/>
+ <suffix name="Win" label="CertVerifyProcWin"/>
+ <affected-histogram name="Net.CertVerifier.NameNormalizationPrivateRoots"/>
+</histogram_suffixes>
+
<histogram_suffixes name="ChromeActivityName" separator=".">
<suffix name="ChromeTabbedActivity"
label="Activity launched in TABBED mode on Android"/>
@@ -144338,6 +149032,35 @@ should be kept until we use this API. -->
name="ServiceWorker.ActivatedWorkerPreparationForMainFrame.Type"/>
</histogram_suffixes>
+<histogram_suffixes name="ChromeOS.Camera.JpegProcessMethod" separator=".">
+ <suffix name="Hardware"/>
+ <suffix name="Software"/>
+ <affected-histogram name="ChromeOS.Camera.Jpeg.Latency"/>
+ <affected-histogram name="ChromeOS.Camera.Jpeg.Resolution"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="ChromeOS.Camera.JpegProcessType" separator=".">
+ <suffix name="Decode"/>
+ <suffix name="Encode"/>
+ <affected-histogram name="ChromeOS.Camera.Jpeg.Latency"/>
+ <affected-histogram name="ChromeOS.Camera.Jpeg.Resolution"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="ChromeOS.Camera.StreamFormat" separator=".">
+ <suffix name="BGRA_8888" label="Format HAL_PIXEL_FORMAT_BGRA_8888"/>
+ <suffix name="BLOB" label="Format HAL_PIXEL_FORMAT_BLOB"/>
+ <suffix name="IMPLEMENTATION_DEFINED"
+ label="Format HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED"/>
+ <suffix name="RGBA_8888" label="Format HAL_PIXEL_FORMAT_RGBA_8888"/>
+ <suffix name="RGBX_8888" label="Format HAL_PIXEL_FORMAT_RGBX_8888"/>
+ <suffix name="YCbCr_420_888" label="Format HAL_PIXEL_FORMAT_YCbCr_420_888"/>
+ <suffix name="YCbCr_422_I" label="Format HAL_PIXEL_FORMAT_YCbCr_422_I"/>
+ <suffix name="YCrCb_420_SP" label="Format HAL_PIXEL_FORMAT_YCrCb_420_SP"/>
+ <suffix name="YV12" label="Format HAL_PIXEL_FORMAT_YV12"/>
+ <affected-histogram
+ name="ChromeOS.Camera.ConfigureStreams.Output.Resolution"/>
+</histogram_suffixes>
+
<histogram_suffixes name="ChromeOS.MachineIdRegen.AgeSeconds" separator="_">
<suffix name="Network"/>
<suffix name="Periodic"/>
@@ -144672,6 +149395,9 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="ContextMenuType" separator=".">
+ <obsolete>
+ Removed from code as of 05/2019.
+ </obsolete>
<suffix name="Image"
label="The context menu was shown for a (non-link) image"/>
<suffix name="ImageLink"
@@ -144686,6 +149412,43 @@ should be kept until we use this API. -->
<affected-histogram name="ContextMenu.SelectedOption"/>
</histogram_suffixes>
+<histogram_suffixes name="ContextMenuTypeAndroid" separator=".">
+ <suffix name="Image"
+ label="The context menu was shown for a (non-link) image"/>
+ <suffix name="ImageLink"
+ label="The context menu was shown for an image which is also a link"/>
+ <suffix name="Link"
+ label="The context menu was shown for a (non-image) link"/>
+ <suffix name="Video" label="The context menu was shown for a video"/>
+ <affected-histogram name="ContextMenu.SelectedOptionAndroid"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="ContextMenuTypeDesktop" separator=".">
+ <suffix name="Image"
+ label="The context menu was shown for a (non-link) image"/>
+ <suffix name="ImageLink"
+ label="The context menu was shown for an image which is also a link"/>
+ <suffix name="MisspelledWord"
+ label="The context menu was shown for a misspelt word"/>
+ <suffix name="Other"
+ label="The context menu was shown in a context other than those
+ explicitly enumerated"/>
+ <suffix name="SelectedText"
+ label="The context menu was shown for a text selection"/>
+ <suffix name="Video" label="The context menu was shown for a video"/>
+ <affected-histogram name="ContextMenu.SelectedOptionDesktop"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="ContextMenuTypeIOS" separator=".">
+ <suffix name="Image"
+ label="The context menu was shown for a (non-link) image"/>
+ <suffix name="ImageLink"
+ label="The context menu was shown for an image which is also a link"/>
+ <suffix name="Link"
+ label="The context menu was shown for a (non-image) link"/>
+ <affected-histogram name="ContextMenu.SelectedOptionIOS"/>
+</histogram_suffixes>
+
<histogram_suffixes name="ContextType" separator=".">
<suffix name="BlimpRenderCompositor"
label="BlimpCompositor compositor command buffer context">
@@ -144743,6 +149506,9 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="ContextualSuggestionsPageViewSource" separator=".">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<suffix name="ContextualSuggestions"
label="For contextual suggestions navigations"/>
<suffix name="Other" label="For non contextual suggestions navigations"/>
@@ -146073,6 +150839,7 @@ should be kept until we use this API. -->
<suffix name="MountainInternal" label="Mountain internal client."/>
<suffix name="OfflinePage" label="Offline page prefetch."/>
<suffix name="PluginVmImage" label="PluginVm image."/>
+ <affected-histogram name="Download.Service.Clients.InflatedFullBrowser"/>
<affected-histogram name="Download.Service.Request.ClientAction"/>
<affected-histogram name="Download.Service.Request.StartResponse"/>
<affected-histogram name="Download.Service.Request.StartResult"/>
@@ -146283,9 +151050,6 @@ should be kept until we use this API. -->
<suffix name="EnterOverview" label="Triggered by entering overview"/>
<suffix name="ExitOverview" label="Triggered by exiting overview"/>
<affected-histogram name="Apps.StateTransition.AnimationSmoothness"/>
- <affected-histogram name="Apps.StateTransition.Drag.PresentationTime"/>
- <affected-histogram
- name="Apps.StateTransition.Drag.PresentationTime.MaxLatency"/>
<affected-histogram name="KioskNextHome.StateTransition.AnimationSmoothness"/>
</histogram_suffixes>
@@ -146330,6 +151094,39 @@ should be kept until we use this API. -->
<affected-histogram name="Enterprise.AutoEnrollmentRequestStatus"/>
</histogram_suffixes>
+<histogram_suffixes name="EnterpriseDMServerRequest" separator=".">
+ <owner>poromov@chromium.org</owner>
+ <owner>zmin@chromium.org</owner>
+ <suffix name="ActiveDirectoryEnrollPlayUser"
+ label="Active Directory Enroll Play User."/>
+ <suffix name="ActiveDirectoryPlayActivity"
+ label="Active Directory Play Activity."/>
+ <suffix name="AndroidManagementCheck" label="Android Management Check."/>
+ <suffix name="ApiAuthCodeFetch" label="Api Auth Code Fetch."/>
+ <suffix name="AttributeUpdate" label="Attribute Update."/>
+ <suffix name="AttributeUpdatePermission"
+ label="Attribute Update Permission."/>
+ <suffix name="AutoEnrollment" label="Auto Enrollment."/>
+ <suffix name="CertBasedRegistration" label="Cert Based Registration."/>
+ <suffix name="ChromeDesktopReport" label="Chrome Desktop Report."/>
+ <suffix name="DeviceStateRetrieval" label="Device State Retrieval."/>
+ <suffix name="GcmIdUpdate" label="Gcm Id Update."/>
+ <suffix name="InitialEnrollmentStateRetrieval"
+ label="Initial Enrollment State Retrieval."/>
+ <suffix name="PolicyFetch" label="Policy Fetch."/>
+ <suffix name="Registration" label="Registration."/>
+ <suffix name="RemoteCommands" label="Remote Commands."/>
+ <suffix name="RequestLicenseTypes" label="Request License Types."/>
+ <suffix name="TokenEnrollment" label="Token Enrollment."/>
+ <suffix name="Unregistration" label="Unregistration."/>
+ <suffix name="UploadAppInstallReport" label="Upload App Install Report."/>
+ <suffix name="UploadCertificate" label="Upload Certificate."/>
+ <suffix name="UploadPolicyValidationReport"
+ label="Upload Policy Validation Report."/>
+ <suffix name="UploadStatus" label="Upload Status."/>
+ <affected-histogram name="Enterprise.DMServerRequestSuccess"/>
+</histogram_suffixes>
+
<histogram_suffixes name="EnterpriseRetrievePolicyResponse" separator=".">
<owner>emaxx@chromium.org</owner>
<owner>igorcov@chromium.org</owner>
@@ -146595,7 +151392,7 @@ should be kept until we use this API. -->
<affected-histogram name="ContentSuggestions.Feed.OperationCommitTime"/>
</histogram_suffixes>
-<histogram_suffixes name="FeedTaskType" separator="." ordering="prefix,2">
+<histogram_suffixes name="FeedTaskType" separator="." ordering="prefix,3">
<suffix name="CleanUpSessionJournals" label="Clean up session journals"/>
<suffix name="ClearAll" label="Clear all"/>
<suffix name="ClearAllWithRefresh" label="Clear all with refresh"/>
@@ -146817,6 +151614,19 @@ should be kept until we use this API. -->
<affected-histogram name="PLT.PT_StartToFinish"/>
</histogram_suffixes>
+<histogram_suffixes name="FrozenTabPercentage" separator=".">
+ <suffix name="1To5HiddenTabs"
+ label="The percentage of hidden tabs that are frozen for users with 1
+ to 5 hidden tabs."/>
+ <suffix name="6To20HiddenTabs"
+ label="The percentage of hidden tabs that are frozen for users with 6
+ to 20 hidden tabs."/>
+ <suffix name="MoreThan20HiddenTabs"
+ label="The percentage of hidden tabs that are frozen for users with
+ more than 20 hidden tabs."/>
+ <affected-histogram name="Tabs.FrozenTabPercentage"/>
+</histogram_suffixes>
+
<histogram_suffixes name="GaiaListAccountsRetry" separator="_">
<suffix name="0" label="Inital request"/>
<suffix name="1" label="1st retry"/>
@@ -146920,6 +151730,27 @@ should be kept until we use this API. -->
<affected-histogram name="GoogleUpdate.Inline.StateChange.Error"/>
</histogram_suffixes>
+<histogram_suffixes name="GoogleUpdate.Result.UpdateType" separator=".">
+ <suffix base="true" name="Inline" label="Intent Updates"/>
+ <suffix base="true" name="Intent" label="Inline Updates"/>
+ <suffix base="true" name="Unknown" label="Unknown Update Type"/>
+ <affected-histogram name="GoogleUpdate.Result.Session"/>
+ <affected-histogram name="GoogleUpdate.Result.TimeWindow"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="GoogleUpdate.Result.UpdateType.UpdateSource"
+ separator=".">
+ <suffix name="Infobar" label="Update initiated from the infobar"/>
+ <suffix name="Menu" label="Update initiated from the menu"/>
+ <suffix name="Notification" label="Update initiated from the notification"/>
+ <suffix name="Unknown" label="Update initiated from an unknown source"/>
+ <affected-histogram name="GoogleUpdate.Result.Session.Inline"/>
+ <affected-histogram name="GoogleUpdate.Result.Session.Unknown"/>
+ <affected-histogram name="GoogleUpdate.Result.TimeWindow.Inline"/>
+ <affected-histogram name="GoogleUpdate.Result.TimeWindow.Intent"/>
+ <affected-histogram name="GoogleUpdate.Result.TimeWindow.Unknown"/>
+</histogram_suffixes>
+
<histogram_suffixes name="GPU.ContextType" separator=".">
<suffix name="GLES" label="GLES Context."/>
<suffix name="WebGL" label="WebGL Context."/>
@@ -146971,6 +151802,9 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="GpuChannelResponse" separator=".">
+ <obsolete>
+ Expired in M75.
+ </obsolete>
<suffix name="Failure" label="Failed Request"/>
<suffix name="Success" label="Successful Request"/>
<affected-histogram name="GPU.EstablishGpuChannelDuration"/>
@@ -146987,6 +151821,23 @@ should be kept until we use this API. -->
name="GraphicsPipeline.SubmitCompositorFrameAfterBeginFrame"/>
</histogram_suffixes>
+<histogram_suffixes name="GwpAsanBackingAllocator" separator=".">
+ <suffix name="Malloc" label="From malloc"/>
+ <suffix name="PartitionAlloc" label="From PartitionAlloc"/>
+ <affected-histogram name="GwpAsan.CrashAnalysisResult"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="GwpAsanPerProcessOom" separator=".">
+ <suffix name="Browser" label="for the browser process."/>
+ <suffix name="Extension" label="for the extension process."/>
+ <suffix name="Gpu" label="for the gpu-process."/>
+ <suffix name="Ppapi" label="for the ppapi process."/>
+ <suffix name="Renderer" label="for the renderer process."/>
+ <suffix name="Utility" label="for the utility process."/>
+ <affected-histogram name="GwpAsan.AllocatorOom.Malloc"/>
+ <affected-histogram name="GwpAsan.AllocatorOom.PartitionAlloc"/>
+</histogram_suffixes>
+
<histogram_suffixes name="GWSChromeJointExperiment" separator="_">
<suffix name="Experiment1"
label="Only page loads that are a result of a navigation from a web
@@ -147148,7 +151999,22 @@ should be kept until we use this API. -->
<suffix name="HandshakeConfirmed" label="the handshake was confirmed"/>
<affected-histogram name="Net.QuicSession.ClosedByPublicReset"/>
<affected-histogram name="Net.QuicSession.ConnectionCloseErrorCodeClient"/>
+ <affected-histogram
+ name="Net.QuicSession.ConnectionCloseErrorCodeClientGoogle"/>
+ <affected-histogram name="Net.QuicSession.ConnectionCloseErrorCodeServer"/>
+ <affected-histogram
+ name="Net.QuicSession.ConnectionCloseErrorCodeServerGoogle"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="HandshakeNotConfirmed" separator=".">
+ <suffix name="HandshakeNotConfirmed" label="the handshake was confirmed"/>
+ <affected-histogram name="Net.QuicSession.ClosedByPublicReset"/>
+ <affected-histogram name="Net.QuicSession.ConnectionCloseErrorCodeClient"/>
+ <affected-histogram
+ name="Net.QuicSession.ConnectionCloseErrorCodeClientGoogle"/>
<affected-histogram name="Net.QuicSession.ConnectionCloseErrorCodeServer"/>
+ <affected-histogram
+ name="Net.QuicSession.ConnectionCloseErrorCodeServerGoogle"/>
</histogram_suffixes>
<histogram_suffixes name="HighDownloadBandwidth" separator=".">
@@ -147291,6 +152157,8 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="ImageFetcherClients" separator=".">
+ <suffix name="AnswerSuggestions"
+ label="Showing cache patterns only for AnswerSuggestions."/>
<suffix name="AssistantDetails"
label="Showing cache patterns only for AssistantDetails."/>
<suffix name="ContextualSuggestions"
@@ -147597,7 +152465,11 @@ should be kept until we use this API. -->
label="In product help for contextual search for users who use web
search."/>
<suffix name="IPH_ContextualSuggestions"
- label="In product help for contextual suggestions."/>
+ label="In product help for contextual suggestions.">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
+ </suffix>
<suffix name="IPH_DataSaverDetail"
label="In product help data saver detail."/>
<suffix name="IPH_DataSaverMilestonePromo"
@@ -147616,9 +152488,16 @@ should be kept until we use this API. -->
label="In product help download page for screenshot."/>
<suffix name="IPH_DownloadSettings"
label="In product help to access download settings from download home."/>
+ <suffix name="IPH_ExploreSitesTile" label="For Explore Sites feature."/>
<suffix name="IPH_HomePageButton" label="In product help home page button."/>
<suffix name="IPH_HomepageTile" label="In product help homepage tile."/>
<suffix name="IPH_IncognitoWindow" label="In product help incognito window."/>
+ <suffix name="IPH_KeyboardAccessoryAddressFilling"
+ label="In-product help for address autofill suggestions."/>
+ <suffix name="IPH_KeyboardAccessoryPasswordFilling"
+ label="In-product help for password autofill suggestions."/>
+ <suffix name="IPH_KeyboardAccessoryPaymentFilling"
+ label="In-product help for payments autofill suggestions."/>
<suffix name="IPH_LongPressToolbarTip"
label="In product help LongPress toolbar."/>
<suffix name="IPH_NewIncognitoTabTip"
@@ -148213,12 +153092,36 @@ should be kept until we use this API. -->
<histogram_suffixes name="Media.Learning.BinaryThreshold" separator=".">
<suffix name="BaseTable" label="Basic features, lookup table model"/>
- <suffix name="BaseTree" label="Basic feaetures, ExtraTrees model"/>
+ <suffix name="BaseTree" label="Basic features, ExtraTrees model">
+ <obsolete>
+ Removed as of 5/15/2019.
+ </obsolete>
+ </suffix>
+ <suffix name="BaseUnweightedTable"
+ label="Basic features, unweighted lookup table model"/>
+ <suffix name="BaseUnweightedTree"
+ label="Basic features, unweighted ExtraTrees model"/>
+ <suffix name="BaseUnweightedTree200"
+ label="Basic features, unweighted ExtraTrees model, 200 examples"/>
<suffix name="BinarySmoothnessTree"
- label="Basic+extra features, pre-thresholded ExtraTrees model"/>
- <suffix name="EnhancedTree" label="Basic+extra features, ExtraTrees model"/>
+ label="Basic+extra features, unweighted pre-thresholded ExtraTrees model">
+ <obsolete>
+ Removed as of 5/15/2019.
+ </obsolete>
+ </suffix>
+ <suffix name="EnhancedTree" label="Basic+extra features, ExtraTrees model">
+ <obsolete>
+ Removed as of 5/15/2019.
+ </obsolete>
+ </suffix>
<suffix name="EnhancedUnweightedTree"
- label="Basic+extra features, unweighted ExtraTrees model"/>
+ label="Basic+extra features, unweighted ExtraTrees model">
+ <obsolete>
+ Removed as of 5/15/2019.
+ </obsolete>
+ </suffix>
+ <suffix name="EnhancedUnweightedTree200"
+ label="Basic+extra features, unweighted ExtraTrees model, 200 examples"/>
<affected-histogram name="Media.Learning.BinaryThreshold.Aggregate"/>
<affected-histogram name="Media.Learning.BinaryThreshold.ByFeature"/>
<affected-histogram name="Media.Learning.BinaryThreshold.ByTrainingWeight"/>
@@ -148304,7 +153207,7 @@ should be kept until we use this API. -->
<histogram_suffixes name="MediaLearningDroppedFrameRatioTask" separator=".">
<suffix name="BaseTable" label="Basic features, lookup table model"/>
- <suffix name="BaseTree" label="Basic feaetures, ExtraTrees model"/>
+ <suffix name="BaseTree" label="Basic features, ExtraTrees model"/>
<suffix name="BinarySmoothnessTree"
label="Basic+extra features, pre-thresholded ExtraTrees model"/>
<suffix name="EnhancedTree" label="Basic+extra features, ExtraTrees model"/>
@@ -148607,6 +153510,24 @@ should be kept until we use this API. -->
<affected-histogram name="Memory.Coordinator.TotalPrivate"/>
</histogram_suffixes>
+<histogram_suffixes name="MixedContentDownloadInitiator" separator=".">
+ <suffix base="true" name="InitiatorInsecure"/>
+ <suffix base="true" name="InitiatorSecure"/>
+ <suffix base="true" name="InitiatorUnknown"/>
+ <affected-histogram name="Download.InsecureBlocking.Extensions"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="MixedContentDownloadInitiator" separator=".">
+ <suffix base="true" name="DownloadInsecure"/>
+ <suffix base="true" name="DownloadSecure"/>
+ <affected-histogram
+ name="Download.InsecureBlocking.Extensions.InitiatorInsecure"/>
+ <affected-histogram
+ name="Download.InsecureBlocking.Extensions.InitiatorSecure"/>
+ <affected-histogram
+ name="Download.InsecureBlocking.Extensions.InitiatorUnknown"/>
+</histogram_suffixes>
+
<histogram_suffixes name="Mobile.DefaultBrowser.SystemDefaultBrowser.Type"
separator=".">
<suffix name="ChromeNotSystem"
@@ -148622,6 +153543,23 @@ should be kept until we use this API. -->
<affected-histogram name="Mobile.DefaultBrowser.BrowserCount"/>
</histogram_suffixes>
+<histogram_suffixes name="Mobile.Messages.Password.Type" separator=".">
+ <suffix name="InfobarTypePasswordSave"/>
+ <suffix name="InfobarTypePasswordUpdate"/>
+ <affected-histogram name="Mobile.Messages.Passwords.Modal.Dismiss"/>
+ <affected-histogram name="Mobile.Messages.Passwords.Modal.Event"/>
+ <affected-histogram name="Mobile.Messages.Passwords.Modal.Present"/>
+</histogram_suffixes>
+
+<histogram_suffixes name="Mobile.Messages.Type" separator=".">
+ <suffix name="InfobarTypeConfirm"/>
+ <suffix name="InfobarTypePasswordSave"/>
+ <suffix name="InfobarTypePasswordUpdate"/>
+ <affected-histogram name="Mobile.Messages.Banner.Dismiss"/>
+ <affected-histogram name="Mobile.Messages.Banner.Event"/>
+ <affected-histogram name="Mobile.Messages.Modal.Event"/>
+</histogram_suffixes>
+
<histogram_suffixes name="MobileDownloadBytesDownloadedTypes" separator=".">
<suffix name="ChromeNetworkStack.Failure"/>
<suffix name="ChromeNetworkStack.Success"/>
@@ -150416,6 +155354,7 @@ should be kept until we use this API. -->
</obsolete>
</suffix>
<suffix name="custom_links" label="User customized links."/>
+ <suffix name="explore" label="Explore sites related entry points."/>
<suffix name="homepage" label="The currently set home page."/>
<!-- TODO(fhorschig): Add <obsolete> tag as soon as M-62 is rolled out. -->
@@ -151091,6 +156030,16 @@ should be kept until we use this API. -->
<affected-histogram name="OOBE.StepCompletionTime"/>
</histogram_suffixes>
+<histogram_suffixes name="OptimizationGuide.StoreEntryTypes" separator=".">
+ <suffix name="ComponentHint"
+ label="Holds hint received from the Chrome Optimization Hints Component"/>
+ <suffix name="Empty" label="Unknown entry type"/>
+ <suffix name="FetchedHint"
+ label="Holds hint fetched from the Chrome Optimization Guide Service"/>
+ <suffix name="Metadata" label="Holds metadata about the store"/>
+ <affected-histogram name="OptimizationGuide.HintsLoadedPercentage"/>
+</histogram_suffixes>
+
<histogram_suffixes name="OtherActivityProcesses" separator=".">
<suffix name="gpu-process"/>
<suffix name="ppapi"/>
@@ -151133,7 +156082,7 @@ should be kept until we use this API. -->
<suffix name="SingleClamshellMode"
label="In Clamshell mode with only top maximized/fullscren window
animates"/>
- <suffix name="SplitViewMode" label="Animates in SplitView enabled"/>
+ <suffix name="SplitView" label="Animates in SplitView enabled"/>
<suffix name="TabletMode" label="Animates in Tablet mode w/o split view"/>
<affected-histogram name="Ash.Overview.AnimationSmoothness.Enter"/>
<affected-histogram name="Ash.Overview.AnimationSmoothness.Exit"/>
@@ -151279,6 +156228,9 @@ should be kept until we use this API. -->
<histogram_suffixes name="PageLoadMetricsAfterRedirectToNonAmpPage"
separator=".">
+ <obsolete>
+ Deprecated 5/2019
+ </obsolete>
<suffix name="RedirectToNonAmpPage"
label="Limited to redirects to non-AMP pages."/>
<affected-histogram
@@ -151319,6 +156271,9 @@ should be kept until we use this API. -->
<histogram_suffixes name="PageLoadMetricsClientsAmp" separator="."
ordering="prefix">
+ <obsolete>
+ Deprecated 5/2019
+ </obsolete>
<suffix name="Clients.AMP"
label="AMP page load. Same page navigations are not tracked."/>
<suffix name="Clients.AMP.AmpCache"
@@ -152236,19 +157191,27 @@ should be kept until we use this API. -->
<affected-histogram name="PasswordManager.AccountsPerSite.AutoGenerated"/>
<affected-histogram name="PasswordManager.AccountsPerSite.UserCreated"/>
<affected-histogram name="PasswordManager.BlacklistedSites"/>
+ <affected-histogram name="PasswordManager.BlacklistedSitesHiRes"/>
<affected-histogram name="PasswordManager.TimesGeneratedPasswordUsed"/>
<affected-histogram name="PasswordManager.TimesPasswordUsed.AutoGenerated"/>
<affected-histogram name="PasswordManager.TimesPasswordUsed.UserCreated"/>
<affected-histogram name="PasswordManager.TotalAccounts.AutoGenerated"/>
<affected-histogram name="PasswordManager.TotalAccounts.UserCreated"/>
+ <affected-histogram
+ name="PasswordManager.TotalAccountsHiRes.ByType.AutoGenerated"/>
+ <affected-histogram name="PasswordManager.TotalAccountsHiRes.ByType.Overall"/>
+ <affected-histogram
+ name="PasswordManager.TotalAccountsHiRes.ByType.UserCreated"/>
</histogram_suffixes>
<histogram_suffixes name="PasswordGenerated" separator=".">
<suffix base="true" name="AutoGenerated"/>
+ <suffix base="true" name="Overall"/>
<suffix base="true" name="UserCreated"/>
<affected-histogram name="PasswordManager.AccountsPerSite"/>
<affected-histogram name="PasswordManager.TimesPasswordUsed"/>
<affected-histogram name="PasswordManager.TotalAccounts"/>
+ <affected-histogram name="PasswordManager.TotalAccountsHiRes.ByType"/>
</histogram_suffixes>
<histogram_suffixes name="PasswordManagerMonitor" separator="_">
@@ -152666,10 +157629,13 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="PlatformMeminfoSize" separator="">
+ <suffix name="FileTotal" label="Size of file memory (active + inactive)."/>
<suffix name="MemFreeDerived" label="Size derived from free+buffers+cached."/>
<suffix name="MemTotal" label="Size of total installed memory."/>
<suffix name="MemUsedDerived"
label="Size of &quot;Total - FreeDerived&quot; memory."/>
+ <suffix name="ProcessDataTotal"
+ label="Size of process data (active + inactive + swap)."/>
<suffix name="Shmem" label="Size of shared memory."/>
<suffix name="Slab" label="Size of slab memory."/>
<suffix name="SwapUsed" label="Size of used swap memory."/>
@@ -153033,6 +157999,7 @@ should be kept until we use this API. -->
<histogram_suffixes name="Previews.Types" separator=".">
<suffix name="AMPRedirection" label="AMP Redirection previews"/>
+ <suffix name="DeferAllScript" label="Defers execution of script"/>
<suffix name="LitePage" label="Lite page previews"/>
<suffix name="LitePageRedirect" label="Lite page redirection previews"/>
<suffix name="LoFi" label="LoFi previews"/>
@@ -153061,6 +158028,7 @@ should be kept until we use this API. -->
label="Only counting memory used by Discardable manager."/>
<suffix name="Extensions.ValueStore"
label="Only counting memory used by Extension value store database."/>
+ <suffix name="GpuMemory" label="Only counting memory allocated for the GPU."/>
<suffix name="JavaHeap"
label="Only counting memory used by Java heap in Android."/>
<suffix name="Malloc" label="Constrained to malloc allocator."/>
@@ -153111,6 +158079,7 @@ should be kept until we use this API. -->
<affected-histogram name="Memory.Experimental.Browser2"/>
<affected-histogram name="Memory.Experimental.Extension2"/>
<affected-histogram name="Memory.Experimental.Gpu2"/>
+ <affected-histogram name="Memory.Experimental.NetworkService2"/>
<affected-histogram name="Memory.Experimental.Renderer2"/>
<affected-histogram name="Memory.Experimental.Utility2"/>
</histogram_suffixes>
@@ -153167,11 +158136,29 @@ should be kept until we use this API. -->
<affected-histogram name="Memory.Experimental.Browser2.Small"/>
<affected-histogram name="Memory.Experimental.Extension2.Small"/>
<affected-histogram name="Memory.Experimental.Gpu2.Small"/>
+ <affected-histogram name="Memory.Experimental.NetworkService2.Small"/>
<affected-histogram name="Memory.Experimental.Renderer2.Small"/>
<affected-histogram name="Memory.Experimental.Utility2.Small"/>
</histogram_suffixes>
+<histogram_suffixes name="ProcessMemoryType" separator=".">
+ <suffix name="Anon" label="Measures anonymous RSS."/>
+ <suffix name="File" label="Measures file RSS."/>
+ <suffix name="Shmem" label="Measures shmem RSS."/>
+ <suffix name="Swap" label="Measures swap in use."/>
+ <suffix name="Total" label="Measures total RSS."/>
+ <affected-histogram name="Platform.Memory.ARC"/>
+ <affected-histogram name="Platform.Memory.Browser"/>
+ <affected-histogram name="Platform.Memory.Daemons"/>
+ <affected-histogram name="Platform.Memory.Gpu"/>
+ <affected-histogram name="Platform.Memory.Renderers"/>
+ <affected-histogram name="Platform.Memory.VMs"/>
+</histogram_suffixes>
+
<histogram_suffixes name="ProcessType" separator=".">
+ <obsolete>
+ Removed 2019-05
+ </obsolete>
<suffix name="BrowserProcess" label="Browser Process"/>
<suffix name="ExtensionProcess" label="Extension Process"/>
<suffix name="RendererProcess"
@@ -153790,6 +158777,14 @@ should be kept until we use this API. -->
<affected-histogram name="RendererScheduler.TaskDurationPerThreadType2"/>
</histogram_suffixes>
+<histogram_suffixes name="RendererScheduler.QueueType" separator=".">
+ <suffix name="Compositor"/>
+ <suffix name="Input"/>
+ <suffix name="Loading"/>
+ <suffix name="Other"/>
+ <affected-histogram name="RendererScheduler.QueueingDurationPerQueueType"/>
+</histogram_suffixes>
+
<histogram_suffixes name="RendererScheduler.TaskCountPerTaskLength"
separator=".">
<suffix name="LongerThan1s"/>
@@ -154171,10 +159166,8 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="SafeBrowsing.V4Store.Metrics" separator=".">
- <suffix name="AnyIpMalware" label="(Obsolete, not recorded)"/>
<suffix name="CertCsdDownloadWhitelist"/>
<suffix name="ChromeExtMalware"/>
- <suffix name="ChromeFilenameClientIncident" label="(Obsolete, not recorded)"/>
<suffix name="ChromeUrlClientIncident"/>
<suffix name="IpMalware"/>
<suffix name="UrlBilling"/>
@@ -154185,7 +159178,6 @@ should be kept until we use this API. -->
<suffix name="UrlSoceng"/>
<suffix name="UrlSubresourceFilter"/>
<suffix name="UrlSuspiciousSite"/>
- <suffix name="UrlSuspiciousSiteId" label="(Obsolete, UrlSuspiciousSite)"/>
<suffix name="UrlUws"/>
<affected-histogram name="SafeBrowsing.V4Database.Size"/>
<affected-histogram
@@ -154217,7 +159209,6 @@ should be kept until we use this API. -->
<affected-histogram name="SafeBrowsing.V4ReadFromDisk.DecodeAdditions.Time"/>
<affected-histogram name="SafeBrowsing.V4ReadFromDisk.MergeUpdate.Time"/>
<affected-histogram name="SafeBrowsing.V4Store.IsStoreValid"/>
- <affected-histogram name="SafeBrowsing.V4UnusedStoreFileExists"/>
</histogram_suffixes>
<histogram_suffixes name="SafeBrowsing.V4Store.V3.Metrics" separator=".">
@@ -154240,6 +159231,13 @@ should be kept until we use this API. -->
<affected-histogram name="SafeBrowsing.V4UnusedStoreFileExists.V3"/>
</histogram_suffixes>
+<histogram_suffixes name="SafeBrowsing.V4UnusedStore.Metrics" separator=".">
+ <suffix name="AnyIpMalware"/>
+ <suffix name="ChromeFilenameClientIncident"/>
+ <suffix name="UrlSuspiciousSiteId"/>
+ <affected-histogram name="SafeBrowsing.V4UnusedStoreFileExists"/>
+</histogram_suffixes>
+
<histogram_suffixes name="SafeBrowsingLists" separator=".">
<suffix name="Browse" label="Browse"/>
<suffix name="CsdWhitelist" label="CsdWhitelist"/>
@@ -154433,6 +159431,10 @@ should be kept until we use this API. -->
<suffix name="Main" label="ScrollUpdate handled on main thread"/>
<affected-histogram name="Event.Latency.Scroll.Wheel.TimeToHandled2"/>
<affected-histogram
+ name="Event.Latency.ScrollBegin.Scrollbar.HandledToRendererSwap2"/>
+ <affected-histogram
+ name="Event.Latency.ScrollBegin.Scrollbar.TimeToHandled2"/>
+ <affected-histogram
name="Event.Latency.ScrollBegin.Touch.HandledToRendererSwap2"/>
<affected-histogram name="Event.Latency.ScrollBegin.Touch.TimeToHandled2"/>
<affected-histogram
@@ -154443,6 +159445,10 @@ should be kept until we use this API. -->
<affected-histogram name="Event.Latency.ScrollInertial.Touch.TimeToHandled2"/>
<affected-histogram name="Event.Latency.ScrollUpdate.HandledToRendererSwap"/>
<affected-histogram
+ name="Event.Latency.ScrollUpdate.Scrollbar.HandledToRendererSwap2"/>
+ <affected-histogram
+ name="Event.Latency.ScrollUpdate.Scrollbar.TimeToHandled2"/>
+ <affected-histogram
name="Event.Latency.ScrollUpdate.Touch.HandledToRendererSwap2"/>
<affected-histogram name="Event.Latency.ScrollUpdate.Touch.TimeToHandled2"/>
<affected-histogram name="Event.Latency.ScrollUpdate.TouchToHandled"/>
@@ -154602,11 +159608,32 @@ should be kept until we use this API. -->
<owner>tgupta@chromium.org</owner>
<suffix name="ContentMenu" label="Option shown in the content context menu"/>
<suffix name="LinkMenu" label="Option shown in the link context menu"/>
+ <suffix name="OmniboxIcon" label="Icon shown in the omnibox"/>
<suffix name="OmniboxMenu" label="Option shown in the omnibox context menu"/>
+ <suffix name="ShareMenu" label="Option shown in the share sheet menu"/>
<suffix name="TabMenu" label="Option shown in the tab context menu"/>
<affected-histogram name="SendTabToSelf.ClickResult"/>
</histogram_suffixes>
+<histogram_suffixes name="SendTabToSelfValidDevice" separator="."
+ ordering="prefix">
+ <owner>jeffreycohen@chromium.org</owner>
+ <owner>sebsg@chromium.org</owner>
+ <owner>tgupta@chromium.org</owner>
+ <suffix name="ContentMenu"
+ label="The count of devices shown in the content submenu"/>
+ <suffix name="LinkMenu"
+ label="The count of devices shown in the link submenu"/>
+ <suffix name="OmniboxIcon"
+ label="The count of devices shown in the omnibox icon bubble"/>
+ <suffix name="OmniboxMenu"
+ label="The count of devices shown in the omnibox submenu"/>
+ <suffix name="ShareMenu"
+ label="The count of devices shown in the share sheet menu"/>
+ <suffix name="TabMenu" label="The count of devices shown in the tab submenu"/>
+ <affected-histogram name="SendTabToSelf.DeviceCount"/>
+</histogram_suffixes>
+
<histogram_suffixes name="ServiceWorker.ContextRequestType" separator=".">
<obsolete>
The affected histogram is obsolete.
@@ -154683,6 +159710,14 @@ should be kept until we use this API. -->
<affected-histogram name="ServiceWorker.StartWorker.AfterFailureStreak"/>
</histogram_suffixes>
+<histogram_suffixes name="ServiceWorker.LookupRegistrationResult" separator=".">
+ <suffix name="DoesNotExist" label="The registration doesn't exist."/>
+ <suffix name="Error" label="Failed to look up the registration."/>
+ <suffix name="Exists" label="The registration exists."/>
+ <affected-histogram
+ name="ServiceWorker.LookupRegistration.MainResource.Time"/>
+</histogram_suffixes>
+
<histogram_suffixes name="ServiceWorker.NavigationHint" separator=".">
<obsolete>
This experiment was turned down, see https://crbug.com/616502.
@@ -155833,6 +160868,7 @@ should be kept until we use this API. -->
label="Request made by chrome://history/syncedTabs."/>
<suffix name="UNKNOWN" label="Request made by an unknown source."/>
<affected-histogram name="Sync.FaviconAvailability"/>
+ <affected-histogram name="Sync.SizeOfFaviconServerRequestGroup"/>
</histogram_suffixes>
<histogram_suffixes name="SyncKeyDerivationMethod" separator=".">
@@ -155908,6 +160944,7 @@ should be kept until we use this API. -->
<suffix name="USER_CONSENT" label="USER_CONSENT"/>
<suffix name="USER_EVENT" label="USER_EVENT"/>
<suffix name="WALLET_METADATA" label="WALLET_METADATA"/>
+ <suffix name="WIFI_CONFIGURATION" label="WIFI_CONFIGURATION"/>
<suffix name="WIFI_CREDENTIAL" label="WIFI_CREDENTIAL"/>
<affected-histogram name="FCMInvalidations.SubscriptionResponseCodeForTopic"/>
<affected-histogram name="Sync.CommitLatency"/>
@@ -155947,7 +160984,11 @@ should be kept until we use this API. -->
<affected-histogram name="Sync.ModelTypeEntityChange3"/>
<affected-histogram name="Sync.ModelTypeMemoryKB"/>
<affected-histogram name="Sync.NonReflectionUpdateFreshnessPossiblySkewed"/>
- <affected-histogram name="Sync.ReceivedDataTypeGetUpdatesResponseWithToken"/>
+ <affected-histogram name="Sync.ReceivedDataTypeGetUpdatesResponseWithToken">
+ <obsolete>
+ Deprecated 05/2019.
+ </obsolete>
+ </affected-histogram>
<affected-histogram name="Sync.USSMigrationEntityCount"/>
</histogram_suffixes>
@@ -156016,6 +161057,7 @@ should be kept until we use this API. -->
<suffix name="TypedUrls" label="Typed urls"/>
<suffix name="UserConsents" label="User consents"/>
<suffix name="UserEvents" label="User events"/>
+ <suffix name="WifiConfigurations" label="Wifi configurations"/>
<suffix name="WifiCredentials" label="Wifi credentials"/>
<affected-histogram name="Sync.AssociationTime"/>
<affected-histogram name="Sync.ConfigureFailure"/>
@@ -156082,6 +161124,26 @@ should be kept until we use this API. -->
<affected-histogram name="Startup.BrowserOpenTabs"/>
</histogram_suffixes>
+<histogram_suffixes name="TabCountMetrics" separator=".">
+ <suffix name="ByTabCount.0Tabs"
+ label="Recorded with 0 tabs open in the browser."/>
+ <suffix name="ByTabCount.1Tab"
+ label="Recorded with 1 tab open in the browser."/>
+ <suffix name="ByTabCount.2Tabs"
+ label="Recorded with 2 tabs open in the browser."/>
+ <suffix name="ByTabCount.3To4Tabs"
+ label="Recorded with between 3 and 4 tabs open in the browser."/>
+ <suffix name="ByTabCount.5To7Tabs"
+ label="Recorded with between 5 and 7 tabs open in the browser."/>
+ <suffix name="ByTabCount.8To19Tabs"
+ label="Recorded with between 8 and 19 tabs open in the browser."/>
+ <suffix name="ByTabCount.8To19Tabs"
+ label="Recorded with between 20 and 39 tabs open in the browser."/>
+ <suffix name="ByTabCount.40OrMoreTabs"
+ label="Recorded with 40 or more tabs open in the browser."/>
+ <affected-histogram name="TabHoverCards.TabHoverCardsSeenBeforeTabSelection"/>
+</histogram_suffixes>
+
<histogram_suffixes name="TabCreatedReason" separator=".">
<suffix name="FromExternalApp"
label="This bucket is for any tabs that are created because of custom
@@ -156105,9 +161167,11 @@ should be kept until we use this API. -->
<suffix name="ClamshellMode" label="Clamshell Mode Enabled"/>
<suffix name="TabletMode" label="Tablet Mode Enabled"/>
<affected-histogram name="Apps.AppListFolderNameLength"/>
+ <affected-histogram name="Apps.AppListPageSwitcherSource"/>
<affected-histogram name="Apps.AppListSearchBoxActivated"/>
<affected-histogram name="Apps.AppListSearchQueryLength"/>
<affected-histogram name="Apps.AppListSearchResultOpenTypeV2"/>
+ <affected-histogram name="Apps.AppListSuggestedChipOpenType"/>
<affected-histogram name="Apps.ContextMenuExecuteCommand.FromApp"/>
<affected-histogram name="Apps.ContextMenuExecuteCommand.NotFromApp"/>
<affected-histogram name="Apps.ContextMenuShowSource.AppGrid"/>
@@ -156126,12 +161190,15 @@ should be kept until we use this API. -->
name="Apps.ContextMenuUserJourneyTime.SuggestedAppFullscreen"/>
<affected-histogram
name="Apps.ContextMenuUserJourneyTime.SuggestedAppPeeking"/>
+ <affected-histogram name="Apps.PaginationTransition.AnimationSmoothness"/>
<affected-histogram
name="Apps.PaginationTransition.DragScroll.PresentationTime"/>
<affected-histogram
name="Apps.PaginationTransition.DragScroll.PresentationTime.MaxLatency"/>
<affected-histogram name="Apps.StateTransition.AnimationSmoothness"/>
+ <affected-histogram name="Apps.StateTransition.Drag.PresentationTime"/>
<affected-histogram name="Ash.Overview.AnimationSmoothness.Close"/>
+ <affected-histogram name="Ash.Overview.WindowDrag.PresentationTime"/>
</histogram_suffixes>
<histogram_suffixes name="TabNewTabOnload" separator=".">
@@ -156190,15 +161257,22 @@ should be kept until we use this API. -->
<affected-histogram name="Tabs.UsedInInterval.Count"/>
</histogram_suffixes>
-<histogram_suffixes name="TabSwitchingTime" separator=".">
+<histogram_suffixes name="TabSwitchingType" separator=".">
<suffix name="NoSavedFrames"
label="The time from the input timestamp on a tab switch, until the
frame is presented on the screen when there is no saved frame in
the cache."/>
+ <suffix name="NoSavedFrames_Loaded_Frozen"
+ label="Same as NoSavedFrames with the destination tab being loaded and
+ frozen."/>
+ <suffix name="NoSavedFrames_Loaded_NotFrozen"
+ label="Same as NoSavedFrames with the destination tab being loaded and
+ not frozen."/>
+ <suffix name="NoSavedFrames_NotLoaded"
+ label="Same as WithSavedFrames with the destination tab being unloaded."/>
<suffix name="WithSavedFrames"
- label="The time from the input timestamp on a tab switch, until the
- frame is presented on the screen when there are saved frames in
- the cache."/>
+ label="There is a saved frame in the cache when the tab switch starts."/>
+ <affected-histogram name="Browser.Tabs.TabSwitchResult"/>
<affected-histogram name="Browser.Tabs.TotalSwitchDuration"/>
</histogram_suffixes>
@@ -156469,9 +161543,6 @@ should be kept until we use this API. -->
</histogram_suffixes>
<histogram_suffixes name="ThreadPoolName" separator=".">
- <obsolete>
- Deprecated 4/2019. Prefix renamed to ThreadPool.
- </obsolete>
<suffix base="true" name="Browser"
label="ThreadPool for the browser process."/>
<suffix base="true" name="ContentChild"
diff --git a/chromium/tools/metrics/histograms/pretty_print.py b/chromium/tools/metrics/histograms/pretty_print.py
index a72d2c5ee2b..0ea2e842ac3 100755
--- a/chromium/tools/metrics/histograms/pretty_print.py
+++ b/chromium/tools/metrics/histograms/pretty_print.py
@@ -30,6 +30,7 @@ class Error(Exception):
pass
UNIT_REWRITES = {
+ 'mcs': 'microseconds',
'microsecond': 'microseconds',
'us': 'microseconds',
'millisecond': 'ms',
diff --git a/chromium/tools/metrics/histograms/update_policies.py b/chromium/tools/metrics/histograms/update_policies.py
index 40dc23e076f..c90edc7d286 100644
--- a/chromium/tools/metrics/histograms/update_policies.py
+++ b/chromium/tools/metrics/histograms/update_policies.py
@@ -25,7 +25,8 @@ import histograms_print_style
ENUMS_PATH = histogram_paths.ENUMS_XML
POLICY_TEMPLATES_PATH = 'components/policy/resources/policy_templates.json'
-ENUM_NAME = 'EnterprisePolicies'
+POLICIES_ENUM_NAME = 'EnterprisePolicies'
+POLICY_ATOMIC_GROUPS_ENUM_NAME = 'PolicyAtomicGroups'
class UserError(Exception):
def __init__(self, message):
@@ -36,7 +37,7 @@ class UserError(Exception):
return self.args[0]
-def UpdateHistogramDefinitions(policy_templates, doc):
+def UpdatePoliciesHistogramDefinitions(policy_templates, doc):
"""Sets the children of <enum name="EnterprisePolicies" ...> node in |doc| to
values generated from policy ids contained in |policy_templates|.
@@ -49,7 +50,7 @@ def UpdateHistogramDefinitions(policy_templates, doc):
"""
# Find EnterprisePolicies enum.
for enum_node in doc.getElementsByTagName('enum'):
- if enum_node.attributes['name'].value == ENUM_NAME:
+ if enum_node.attributes['name'].value == POLICIES_ENUM_NAME:
policy_enum_node = enum_node
break
else:
@@ -74,6 +75,44 @@ def UpdateHistogramDefinitions(policy_templates, doc):
policy_enum_node.appendChild(node)
+def UpdateAtomicGroupsHistogramDefinitions(policy_templates, doc):
+ """Sets the children of <enum name="PolicyAtomicGroups" ...> node in |doc| to
+ values generated from policy ids contained in |policy_templates|.
+
+ Args:
+ policy_templates: A list of dictionaries, defining policy atomic
+ groups. The format is exactly the same as in
+ policy_templates.json file.
+ doc: A minidom.Document object representing parsed histogram definitions
+ XML file.
+ """
+ # Find EnterprisePolicies enum.
+ for enum_node in doc.getElementsByTagName('enum'):
+ if enum_node.attributes['name'].value == POLICY_ATOMIC_GROUPS_ENUM_NAME:
+ atomic_group_enum_node = enum_node
+ break
+ else:
+ raise UserError('No policy atomic group enum node found')
+
+ # Remove existing values.
+ while atomic_group_enum_node.hasChildNodes():
+ atomic_group_enum_node.removeChild(atomic_group_enum_node.lastChild)
+
+ # Add a "Generated from (...)" comment
+ comment = ' Generated from {0} '.format(POLICY_TEMPLATES_PATH)
+ atomic_group_enum_node.appendChild(doc.createComment(comment))
+
+ # Add values generated from policy templates.
+ ordered_atomic_groups = [
+ x for x in policy_templates['policy_atomic_group_definitions']
+ ]
+ ordered_atomic_groups.sort(key=lambda policy: policy['id'])
+ for group in ordered_atomic_groups:
+ node = doc.createElement('int')
+ node.attributes['value'] = str(group['id'])
+ node.attributes['label'] = group['name']
+ atomic_group_enum_node.appendChild(node)
+
def main():
if len(sys.argv) > 1:
print >>sys.stderr, 'No arguments expected!'
@@ -82,12 +121,14 @@ def main():
with open(path_util.GetInputFile(POLICY_TEMPLATES_PATH), 'rb') as f:
policy_templates = literal_eval(f.read())
+
with open(ENUMS_PATH, 'rb') as f:
histograms_doc = minidom.parse(f)
f.seek(0)
xml = f.read()
- UpdateHistogramDefinitions(policy_templates, histograms_doc)
+ UpdatePoliciesHistogramDefinitions(policy_templates, histograms_doc)
+ UpdateAtomicGroupsHistogramDefinitions(policy_templates, histograms_doc)
new_xml = histograms_print_style.GetPrintStyle().PrettyPrintXml(
histograms_doc)
if PromptUserToAcceptDiff(xml, new_xml, 'Is the updated version acceptable?'):
diff --git a/chromium/tools/metrics/ukm/PRESUBMIT.py b/chromium/tools/metrics/ukm/PRESUBMIT.py
index 1fc56293d1d..9599e113889 100644
--- a/chromium/tools/metrics/ukm/PRESUBMIT.py
+++ b/chromium/tools/metrics/ukm/PRESUBMIT.py
@@ -36,7 +36,7 @@ def CheckChange(input_api, output_api):
return [
output_api.PresubmitError(
'%s does not pass format validation; run %s/validate_format.py '
- 'and fix the reported error(s).' %
+ 'and fix the reported error(s) or warning(s).' %
(UKM_XML, input_api.PresubmitLocalPath())),
]
diff --git a/chromium/tools/metrics/ukm/ukm.xml b/chromium/tools/metrics/ukm/ukm.xml
index c537e63f62f..430d7e4e311 100644
--- a/chromium/tools/metrics/ukm/ukm.xml
+++ b/chromium/tools/metrics/ukm/ukm.xml
@@ -80,6 +80,132 @@ be describing additional metrics about the same event.
</metric>
</event>
+<event name="AdFrameLoad">
+ <owner>johnidel@chromium.org</owner>
+ <owner>jkarlin@chromium.org</owner>
+ <summary>
+ Records metrics associated with a single ad frame for a page load. An ad
+ frame includes itself and all of its child frames. Only recorded for frames
+ with non-zero bytes. Recorded when a page is destroyed or when the app is
+ backgrounded on mobile.
+ </summary>
+ <metric name="CpuTime.PreActivation">
+ <summary>
+ Wall time of tasks attributed to the frame after the frame recieved user
+ activation. Measured in millseconds.
+ </summary>
+ </metric>
+ <metric name="CpuTime.Total">
+ <summary>
+ Total wall time of tasks attributed to the frame. Measured in
+ milliseconds.
+ </summary>
+ </metric>
+ <metric name="FrameDepth">
+ <summary>
+ The depth of this frame's frame tree. There is no set limit on a frame's
+ maximum depth.
+ </summary>
+ </metric>
+ <metric name="Loading.CacheBytes">
+ <summary>
+ Bytes loaded from the cache for all resources loaded within the frame.
+ This is rounded down to the nearest exponential bucket (with a bucket
+ ratio of 1.3).
+ </summary>
+ </metric>
+ <metric name="Loading.ImageBytes">
+ <summary>
+ Network bytes loaded for resources with an image mime type within the
+ frame. Includes header bytes. This is rounded down to the nearest
+ exponential bucket (with a bucket ratio of 1.3).
+ </summary>
+ </metric>
+ <metric name="Loading.JavascriptBytes">
+ <summary>
+ Network bytes loaded for resources with a javascript mime type within the
+ frame. Includes header bytes. This is rounded down to the nearest
+ exponential bucket (with a bucket ratio of 1.3).
+ </summary>
+ </metric>
+ <metric name="Loading.NetworkBytes">
+ <summary>
+ Network bytes loaded for all resources within the frame. Includes header
+ bytes. This is rounded down to the nearest exponential bucket (with a
+ bucket ratio of 1.3).
+ </summary>
+ </metric>
+ <metric name="Loading.NumResources">
+ <summary>
+ Total number of resources loaded by the frame, including incomplete
+ resources.
+ </summary>
+ </metric>
+ <metric name="Loading.VideoBytes">
+ <summary>
+ Network bytes loaded for resources with a video/ mime type within the
+ frame. Includes header bytes. This is rounded down to the nearest
+ exponential bucket (with a bucket ratio of 1.3).
+ </summary>
+ </metric>
+ <metric name="Status.CrossOrigin">
+ <summary>
+ An enum representing whether the frame was Cross-Origin or Same-Origin to
+ it's parent frame. See FrameData::OriginStatus.
+ </summary>
+ </metric>
+ <metric name="Status.Media">
+ <summary>
+ An enum representing whether media was played in the frame. See
+ FrameData::MediaStatus.
+ </summary>
+ </metric>
+ <metric name="Status.UserActivation">
+ <summary>
+ An enum representing whether the frame received user activation. See
+ FrameData::UserActivationStatus.
+ </summary>
+ </metric>
+ <metric name="Timing.FirstContentfulPaint">
+ <summary>
+ Number of milliseconds before FirstContentfulpaint was reached in the
+ frame. This is relative to subframe navigation start.
+ </summary>
+ </metric>
+ <metric name="Timing.Interactive">
+ <summary>
+ Number of millseconds before Time-To-Interactive was reached in the frame.
+ This is relative to subframe navigation start.
+ </summary>
+ </metric>
+ <metric name="Timing.PreActivationForegroundDuration">
+ <summary>
+ Number of millseconds that the current web contents spent in the
+ foreground prior to the frame receiving user activation.
+ </summary>
+ </metric>
+ <metric name="Visibility.FrameHeight">
+ <summary>
+ Last known height of the iframe in pixels. Not reported accurately when
+ &quot;Visiblity.Hidden&quot; is true. This is rounded down to the nearest
+ exponential bucket (with a bucket ratio of 1.15).
+ </summary>
+ </metric>
+ <metric name="Visibility.FrameWidth">
+ <summary>
+ Last known width of the iframe in pixels. Not reported accurately when
+ &quot;Visiblity.Hidden&quot; is true. This is rounded down to the nearest
+ exponential bucket (with a bucket ratio of 1.15).
+ </summary>
+ </metric>
+ <metric name="Visibility.Hidden">
+ <summary>
+ A 0 or 1 values representing whether the frame had a display=none styling
+ set. Records the last known value.
+ </summary>
+ </metric>
+</event>
+
<event name="AdPageLoad">
<owner>johnidel@chromium.org</owner>
<owner>jkarlin@chromium.org</owner>
@@ -105,6 +231,12 @@ be describing additional metrics about the same event.
page was interactive.
</summary>
</metric>
+ <metric name="AdCpuTime">
+ <summary>
+ Amount of CPU wall time inside of ad iframes over the duration of a page
+ load, while the page is in the foreground. Measured in milliseconds.
+ </summary>
+ </metric>
<metric name="AdJavascriptBytes">
<summary>
Amount of bytes used to load ad resources with a supported javascript mime
@@ -201,7 +333,7 @@ be describing additional metrics about the same event.
</metric>
<metric name="AppType">
<summary>
- The type of app. 1: CHROME, 2: PLAY, 3: PWA.
+ The type of app. 1: CHROME, 2: PLAY, 3: PWA/Bookmark app.
</summary>
</metric>
<metric name="ClicksEachHour00">
@@ -429,7 +561,8 @@ be describing additional metrics about the same event.
from the suggestion chip, or from the grid of apps. The UKM metrics are not
keyed by navigational urls. Instead, for Chrome apps the keys are based upon
the app id, for Play apps the keys are based upon a hash of the package name
- and for PWAs the keys are the urls associated with the PWA.
+ and for PWAs and bookmark apps the keys are the urls associated with the
+ PWA/bookmark.
</summary>
<metric name="AllClicksLast24Hours">
<summary>
@@ -447,7 +580,7 @@ be describing additional metrics about the same event.
</metric>
<metric name="AppType">
<summary>
- The type of app. 1: CHROME, 2: PLAY, 3: PWA.
+ The type of app. 1: CHROME, 2: PLAY, 3: PWA/Bookmark app.
</summary>
</metric>
<metric name="ClickMethod">
@@ -1862,7 +1995,7 @@ be describing additional metrics about the same event.
should be used to reason about whether a breaking change is acceptable or
not.
</summary>
- <metric name="Feature">
+ <metric name="Feature" enum="FeatureObserver">
<summary>
Opt-in UseCounter feature.
</summary>
@@ -1874,7 +2007,7 @@ be describing additional metrics about the same event.
</history>
</aggregation>
</metric>
- <metric name="IsMainFrameFeature">
+ <metric name="IsMainFrameFeature" enum="Boolean">
<summary>
Emits True(1) or False(0) to indicate whether the Feature recorded is in
the main frame or not.
@@ -2193,6 +2326,9 @@ be describing additional metrics about the same event.
</event>
<event name="ContextualSuggestions">
+ <obsolete>
+ This feature was deprecated in M74
+ </obsolete>
<owner>donnd@chromium.org</owner>
<owner>fgorski@chromium.org</owner>
<owner>twellington@chromium.org</owner>
@@ -3337,6 +3473,61 @@ be describing additional metrics about the same event.
<metric name="Length"/>
</event>
+<event name="Media.Learning.PredictionRecord">
+ <owner>liberato@chromium.org</owner>
+ <summary>
+ A record of some predicted value vs. an observation. If the prediction is
+ for a regression-style task (e.g., &quot;predict a number&quot; rather than
+ &quot;predict an enum value&quot;), then the predicted and observed values
+ are the numeric values, scaled by default to be in the integer range 0-100.
+
+ The exact scaling used depends on the particular regression problem. Please
+ see the LearningTask structure for the task of interest to find out how it
+ maps values into the [0, 100] output range.
+
+ A record is created for every prediction separately.
+
+ For example, in the MediaCapabilities experiments, each playback generates a
+ record. The predicted / observed values are the ratio of dropped to decoded
+ frames, expressed as a percentage scaled to 0-100.
+ </summary>
+ <metric name="LearningTask">
+ <summary>
+ The learning task to which this record applies. This is a persistent hash
+ of the |name| field in the LearningTask. Presumably, you'll want to
+ include only records of a particular task when analyzing results.
+ </summary>
+ </metric>
+ <metric name="ObservedValue">
+ <summary>
+ Observed value for this sample, scaled into the range [0, 100]. The exact
+ scaling factor depends on the particular task.
+
+ MediaCapabilities, for example, reports 100 * percentage_of_dropped_frames
+ in this field.
+ </summary>
+ </metric>
+ <metric name="PredictedValue">
+ <summary>
+ Predicted value for this sample, scaled into the range [0, 100]. The exact
+ scaling factor depends on the particular task.
+
+ MediaCapabilities, for example, reports 100 * percentage_of_dropped_frames
+ in this field.
+ </summary>
+ </metric>
+ <metric name="TrainingDataSize">
+ <summary>
+ Number of training examples that were used to train this model.
+ </summary>
+ </metric>
+ <metric name="TrainingDataTotalWeight">
+ <summary>
+ Total weight of all examples that were used to train this model.
+ </summary>
+ </metric>
+</event>
+
<event name="Media.SiteMuted" singular="True">
<owner>steimel@chromium.org</owner>
<owner>media-dev@chromium.org</owner>
@@ -3665,6 +3856,11 @@ be describing additional metrics about the same event.
process.
</summary>
</metric>
+ <metric name="GpuMemory">
+ <summary>
+ Measure of GPU memory used by Chrome.
+ </summary>
+ </metric>
<metric name="History">
<summary>
Approximate measure of memory consumed by History service.
@@ -4352,6 +4548,26 @@ be describing additional metrics about the same event.
</metric>
</event>
+<event name="OptimizationGuide">
+ <owner>sophiechang@chromium.org</owner>
+ <summary>
+ Optimization guide metrics associated with a page load. See
+ //components/optimization_guide/.
+ </summary>
+ <metric name="HintGenerationTimestamp">
+ <summary>
+ The timestamp, in seconds from epoch, that the server generated the hint
+ for the optimization applied on the page load.
+ </summary>
+ </metric>
+ <metric name="HintSource">
+ <summary>
+ The |optimization_guide::proto::HintSource| for the optimization that was
+ applied on the page load.
+ </summary>
+ </metric>
+</event>
+
<event name="PageDomainInfo">
<owner>uthakore@chromium.org</owner>
<owner>invernizzi@chromium.org</owner>
@@ -4390,6 +4606,12 @@ be describing additional metrics about the same event.
<summary>
Core metrics associated with web page loads.
</summary>
+ <metric name="CpuTime">
+ <summary>
+ Amount of CPU wall time over the duration of a page load, while the page
+ is in the foreground. Measured in milliseconds.
+ </summary>
+ </metric>
<metric name="DocumentTiming.NavigationToDOMContentLoadedEventFired">
<summary>
Measures the time in milliseconds from navigation timing's navigation
@@ -4551,13 +4773,6 @@ be describing additional metrics about the same event.
meaningful input per navigation. See https://goo.gl/tr1oTZ for a detailed
explanation. In ms.
</summary>
- <aggregation>
- <history>
- <statistics>
- <quantiles type="std-percentiles"/>
- </statistics>
- </history>
- </aggregation>
</metric>
<metric name="InteractiveTiming.FirstInputDelay.SkipFilteringComparison">
<summary>
@@ -4579,14 +4794,6 @@ be describing additional metrics about the same event.
meaningful input per navigation. See https://goo.gl/tr1oTZ for a detailed
explanation. In ms.
</summary>
- <aggregation>
- <history>
- <index fields="profile.country"/>
- <statistics>
- <quantiles type="std-percentiles"/>
- </statistics>
- </history>
- </aggregation>
</metric>
<metric name="InteractiveTiming.FirstInputDelay3">
<summary>
@@ -4696,14 +4903,6 @@ be describing additional metrics about the same event.
timestamp and the start of event processing on the main thread for the
meaningful input per navigation. In ms.
</summary>
- <aggregation>
- <history>
- <index fields="profile.country"/>
- <statistics>
- <quantiles type="std-percentiles"/>
- </statistics>
- </history>
- </aggregation>
</metric>
<metric name="InteractiveTiming.LongestInputDelay3">
<summary>
@@ -4776,6 +4975,14 @@ be describing additional metrics about the same event.
value is 100x the fractional jank score described in the explainer.
</summary>
</metric>
+ <metric name="LayoutStability.JankScore.MainFrame.BeforeInputOrScroll">
+ <summary>
+ Measures the amount of layout jank (bit.ly/lsm-explainer) that has
+ occurred in the main frame during the session, before any user input or
+ document scroll. This metric's integral value is 100x the fractional jank
+ score described in the explainer.
+ </summary>
+ </metric>
<metric name="MainDocumentSequenceNumber">
<owner>altimin@chromium.org</owner>
<owner>arthursonzogni@chromium.org</owner>
@@ -4805,6 +5012,12 @@ be describing additional metrics about the same event.
tools/metrics/histograms/enum.xml.
</summary>
</metric>
+ <metric name="MainFrameResource.NavigationStartToReceiveHeadersStart">
+ <summary>
+ The duration from the start of the navigation to the start of the response
+ headers being received. In ms.
+ </summary>
+ </metric>
<metric name="MainFrameResource.NavigationStartToRequestStart">
<summary>
The duration from the start of the navigation to the start of the main
@@ -5090,6 +5303,15 @@ be describing additional metrics about the same event.
distinguish two forms on the same site.
</summary>
</metric>
+ <metric name="DynamicFormChanges">
+ <summary>
+ Records a bitmask of password form changes after the first time this form
+ is seen by Password Manager. Recorded once per a form when the form is
+ removed from DOM. Bit 0 - changes in number of fields, bit 1 - changes in
+ fields renderer ids, bit 2 - changes in autocomplete attributes, bit 3 -
+ changes in form control types.
+ </summary>
+ </metric>
<metric name="Fill.FirstFillingResultInRenderer">
<summary>
Records whether the PasswordAutofillAgent in the renderer manages to fill
@@ -5493,9 +5715,9 @@ be describing additional metrics about the same event.
<event name="Permission">
<owner>timloh@chromium.org</owner>
<summary>
- Metrics for when a user's permission actions. Currently we only log when a
- permission prompt is resolved. Grouped (microphone+camera) permission
- prompts are reported separately.
+ Metrics for a user's permission actions, logged when a permission prompt is
+ resolved or when a permission is revoked. Grouped (microphone+camera)
+ permission prompts are reported separately.
</summary>
<metric name="Action">
<summary>
@@ -5604,6 +5826,14 @@ be describing additional metrics about the same event.
Set to 1 when a user is shown a lite page redirect in page load.
</summary>
</metric>
+ <metric name="lite_page_redirect_eligibility_reason">
+ <summary>
+ Set to the value of the last known reason a Lite Page Redirect preview was
+ not eligible on this page load. The value of this metric corresponds to
+ the PreviewsEligibilityReason enum. This metric is only set when it is
+ non-zero.
+ </summary>
+ </metric>
<metric name="navigation_restart_penalty">
<summary>
Set to the number of milliseconds spent restarting navigations when a Lite
@@ -5616,6 +5846,22 @@ be describing additional metrics about the same event.
Set to 1 when a user is shown a NoScript preview on a page load.
</summary>
</metric>
+ <metric name="noscript_eligibility_reason">
+ <summary>
+ Set to the value of the last known reason a NoScript preview was not
+ eligible on this page load. The value of this metric corresponds to the
+ PreviewsEligibilityReason enum. This metric is only set when it is
+ non-zero.
+ </summary>
+ </metric>
+ <metric name="offline_eligibility_reason">
+ <summary>
+ Set to the value of the last known reason an Offline preview was not
+ eligible on this page load. The value of this metric corresponds to the
+ PreviewsEligibilityReason enum. This metric is only set when it is
+ non-zero.
+ </summary>
+ </metric>
<metric name="offline_preview">
<summary>
Set to 1 when a user is shown an offline preview page in page load.
@@ -5645,12 +5891,28 @@ be describing additional metrics about the same event.
is impacted by the coin flip holdback.
</summary>
</metric>
+ <metric name="proxy_lite_page_eligibility_reason">
+ <summary>
+ Set to the value of the last known reason a Data Reduction Proxy Lite Page
+ preview was not eligible on this page load. The value of this metric
+ corresponds to the PreviewsEligibilityReason enum. This metric is only set
+ when it is non-zero.
+ </summary>
+ </metric>
<metric name="resource_loading_hints">
<summary>
Set to 1 when a user is shown a resource loading hints based preview on a
page load.
</summary>
</metric>
+ <metric name="resource_loading_hints_eligibility_reason">
+ <summary>
+ Set to the value of the last known reason a Resource Loading Hints preview
+ was not eligible on this page load. The value of this metric corresponds
+ to the PreviewsEligibilityReason enum. This metric is only set when it is
+ non-zero.
+ </summary>
+ </metric>
<metric name="save_data_enabled">
<summary>
Set to 1 if the data saver feature was enabled in Chrome at the time of
@@ -6160,6 +6422,13 @@ be describing additional metrics about the same event.
loaded on the page, but subresource filtering is not actually applied.
</summary>
</metric>
+ <metric name="EnforcementRedirectPosition">
+ <summary>
+ An enum denoting where in the redirect chain there was a URL that matched
+ one of the subresource_filter activation lists, and wasn't marked as
+ warning. See subresource_filter::RedirectPosition for values.
+ </summary>
+ </metric>
</event>
<event name="Tab.RendererOOM">
@@ -7354,6 +7623,12 @@ be describing additional metrics about the same event.
<event name="XR.WebXR" singular="True">
<owner>billorr@chromium.org</owner>
+ <summary>
+ Records information about WebXR methods that were used in a single
+ navigation. The event will be recorded as the WebXR functions are called -
+ since the event is singular, the data that will eventualy be sent will
+ contain a union of metrics that were set in an event.
+ </summary>
<metric name="DidGetGamepads">
<obsolete>
Deprecated in M75.
@@ -7371,6 +7646,7 @@ be describing additional metrics about the same event.
<metric name="DidRequestAvailableDevices">
<summary>
Boolean value that indicates that the API to enumerate devices was called.
+ This API is only exposed through WebVR.
</summary>
</metric>
<metric name="DidRequestPose">
@@ -7391,7 +7667,7 @@ be describing additional metrics about the same event.
<metric name="ReturnedDevice">
<summary>
Boolean value that indicates that a device was returned by the API to
- enumerate devices.
+ enumerate devices. This API is only exposed through WebVR.
</summary>
</metric>
<metric name="ReturnedPresentationCapableDevice">
@@ -7403,7 +7679,10 @@ be describing additional metrics about the same event.
</event>
<event name="XR.WebXR.PresentationSession">
- <owner>offenwanger@chromium.org</owner>
+ <obsolete>
+ Deprecated 5/2019
+ </obsolete>
+ <owner>xr-dev@chromium.org</owner>
<summary>
Records data for a presentation session, where WebXR is running an exclusive
presentation to some device.
@@ -7418,14 +7697,67 @@ be describing additional metrics about the same event.
</metric>
<metric name="StartAction">
<summary>
- A metric to track specifically how the user got into XR presentation. 0:
- Other, catch all. 1: RequestFrom2DBrowsing, the page requested
- presentation while Chrome was in 2D mode. 2: RequestFromVRBrowsing, the
- page requested presentation while Chrome was in VR browsing mode. 3:
- HeadsetActivation, the user activated the VR headset while in 2D browsing
- on the page, which listens for headset activations to request
- presentation. 4: DeepLinkedApp, The page was launched in Chrome from the
- VR system home (e.g., Daydream Home) and requested presentation.
+ An enum value to track specifically how the user got into XR presentation.
+ See `vr::PresentationStartAction` for enum type declaration. 0: Other,
+ catch all. 1: RequestFrom2DBrowsing, the page requested presentation while
+ Chrome was in 2D mode. 2: RequestFromVRBrowsing, the page requested
+ presentation while Chrome was in VR browsing mode. 3: HeadsetActivation,
+ the user activated the VR headset while in 2D browsing on the page, which
+ listens for headset activations to request presentation. 4: DeepLinkedApp
+ (Obsolete), The page was launched in Chrome from the VR system home (e.g.,
+ Daydream Home) and requested presentation.
+ </summary>
+ </metric>
+</event>
+
+<event name="XR.WebXR.Session">
+ <owner>billorr@chromium.org</owner>
+ <owner>bialpio@chromium.org</owner>
+ <owner>xr-dev@chromium.org</owner>
+ <summary>
+ When session ends, records data for a WebXR / WebVR session.
+ </summary>
+ <metric name="Duration">
+ <summary>
+ The approximate amount of time (in seconds) that elapsed from session
+ creation to session end. Times are reported accurately when low, for
+ example, under a minute, and get rounded to minutes and then hours as they
+ get larger. This is done by SessionTracker::GetRoundedDurationInSeconds.
+ For inline sessions, this might get pretty large.
+ </summary>
+ </metric>
+ <metric name="IsLegacyWebVR">
+ <summary>
+ Boolean value indicating whether a session was created using the legacy
+ WebVR API rather than WebXR.
+ </summary>
+ </metric>
+ <metric name="Mode">
+ <summary>
+ An enum value specifying WebXR session's mode. See `device::SessionMode`
+ for enum type declaration. 0: Unknown, catch all. 1: Inline session. 2:
+ Immersive VR session. 3: Immersive AR session.
+ </summary>
+ </metric>
+</event>
+
+<event name="XR.WebXR.SessionRequest">
+ <owner>xr-dev@chromium.org</owner>
+ <summary>
+ Recorded when promise returned by `requestSession` gets resolved / rejected.
+ </summary>
+ <metric name="Mode">
+ <summary>
+ An enum value that indicates that the `requestSession` API was called to
+ request session with this mode. See `device::SessionMode` for enum type
+ declaration. 0: Unknown, catch all. 1: Inline session was requested. 2:
+ Immersive VR session was requested. 3: Immersive AR session was requested.
+ </summary>
+ </metric>
+ <metric name="Status">
+ <summary>
+ An enum value that describes the result of the call to `requestSession`
+ method. See `` for enum type declaration. 0: Success. 1: Other failure.
</summary>
</metric>
</event>
diff --git a/chromium/tools/metrics/ukm/ukm_model.py b/chromium/tools/metrics/ukm/ukm_model.py
index 9e4f1f2dc7d..aa4fdd446ef 100644
--- a/chromium/tools/metrics/ukm/ukm_model.py
+++ b/chromium/tools/metrics/ukm/ukm_model.py
@@ -74,6 +74,7 @@ _METRIC_TYPE = models.ObjectNodeType(
attributes=[
('name', unicode, r'^[A-Za-z0-9_.]+$'),
('semantic_type', unicode, None),
+ ('enum', unicode, None),
],
alphabetization=[
(_OBSOLETE_TYPE.tag, _KEEP_ORDER),
diff --git a/chromium/tools/metrics/ukm/validate_format.py b/chromium/tools/metrics/ukm/validate_format.py
index 152c86b65ca..b95d49d8590 100755
--- a/chromium/tools/metrics/ukm/validate_format.py
+++ b/chromium/tools/metrics/ukm/validate_format.py
@@ -4,11 +4,18 @@
# found in the LICENSE file.
"""Verifies that the UKM XML file is well-formatted."""
+import os
import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
+import path_util
+
from xml_validations import UkmXmlValidation
from xml.dom import minidom
-UKM_XML = 'ukm.xml'
+UKM_XML = path_util.GetInputFile('tools/metrics/ukm/ukm.xml')
+
+IGNORE_METRIC_CHECK_WARNINGS = True
def main():
@@ -18,9 +25,18 @@ def main():
validator = UkmXmlValidation(config)
ownerCheckSuccess, ownerCheckErrors = validator.checkEventsHaveOwners()
+ metricCheckSuccess, metricCheckErrors, metricCheckWarnings = \
+ validator.checkMetricTypeIsSpecified()
+
+ results = dict();
+
+ if not metricCheckSuccess or not metricCheckSuccess:
+ results['Errors'] = ownerCheckErrors + metricCheckErrors
+ if metricCheckWarnings and not IGNORE_METRIC_CHECK_WARNINGS:
+ results['Warnings'] = metricCheckWarnings
- if not ownerCheckSuccess:
- return ownerCheckErrors
+ if 'Warnings' in results or 'Errors' in results:
+ return results
if __name__ == '__main__':
diff --git a/chromium/tools/metrics/ukm/xml_validations.py b/chromium/tools/metrics/ukm/xml_validations.py
index 5e2d2f6af33..b4d4327bb25 100644
--- a/chromium/tools/metrics/ukm/xml_validations.py
+++ b/chromium/tools/metrics/ukm/xml_validations.py
@@ -2,6 +2,13 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import os
+import sys
+
+sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'histograms'))
+import extract_histograms
+import histogram_paths
+import merge_xml
class UkmXmlValidation(object):
"""Validations for the content of ukm.xml."""
@@ -43,3 +50,29 @@ class UkmXmlValidation(object):
isSuccess = not errors
return (isSuccess, errors)
+
+ def checkMetricTypeIsSpecified(self):
+ """Check each metric is either specified with an enum or a unit."""
+ errors = []
+ warnings = []
+
+ enum_tree = merge_xml.MergeFiles([histogram_paths.ENUMS_XML])
+ enums, _ = extract_histograms.ExtractEnumsFromXmlTree(enum_tree)
+
+ for event_node in self.config.getElementsByTagName('event'):
+ for metric_node in self.config.getElementsByTagName('metric'):
+ if metric_node.hasAttribute('enum'):
+ enum_name = metric_node.getAttribute('enum');
+ # Check if the enum is defined in enums.xml.
+ if enum_name not in enums:
+ errors.append("Unknown enum %s in ukm metric %s:%s." %
+ (enum_name, event_node.getAttribute('name'),
+ metric_node.getAttribute('name')))
+ elif not metric_node.hasAttribute('unit'):
+ warnings.append("Warning: Neither \'enum\' or \'unit\' is specified "
+ "for ukm metric %s:%s."
+ % (event_node.getAttribute('name'),
+ metric_node.getAttribute('name')))
+
+ isSuccess = not errors
+ return (isSuccess, errors, warnings)
diff --git a/chromium/tools/metrics/ukm/xml_validations_test.py b/chromium/tools/metrics/ukm/xml_validations_test.py
index f7d31041227..17a0074f8bd 100644
--- a/chromium/tools/metrics/ukm/xml_validations_test.py
+++ b/chromium/tools/metrics/ukm/xml_validations_test.py
@@ -51,6 +51,31 @@ class UkmXmlValidationTest(unittest.TestCase):
self.assertFalse(success)
self.assertListEqual(expected_errors, errors)
+ def testMetricHasUndefinedEnum(self):
+ ukm_config = self.toUkmConfig("""
+ <ukm-configuration>
+ <event name="Event">
+ <metric name="Metric1" enum="BadEnum"/>
+ <metric name="Metric2" enum="FeatureObserver"/>
+ <metric name="Metric3" unit="ms"/>
+ <metric name="Metric4"/>
+ </event>
+ </ukm-configuration>
+ """.strip())
+ expected_errors = [
+ "Unknown enum BadEnum in ukm metric Event:Metric1.",
+ ]
+
+ expected_warnings = [
+ "Warning: Neither 'enum' or 'unit' is specified for ukm metric "
+ "Event:Metric4.",
+ ]
+
+ validator = UkmXmlValidation(ukm_config)
+ success, errors, warnings = validator.checkMetricTypeIsSpecified()
+ self.assertFalse(success)
+ self.assertListEqual(expected_errors, errors)
+ self.assertListEqual(expected_warnings, warnings)
if __name__ == '__main__':
unittest.main()
diff --git a/chromium/tools/perf/BUILD.gn b/chromium/tools/perf/BUILD.gn
index d646f6f0685..c9ddc306189 100644
--- a/chromium/tools/perf/BUILD.gn
+++ b/chromium/tools/perf/BUILD.gn
@@ -2,6 +2,7 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+# Keep in sync with group("perf_without_chrome").
group("perf") {
testonly = true
deps = [
@@ -18,6 +19,7 @@ group("perf") {
# Field trial dependencies
"//tools/json_comment_eater/",
"//tools/json_to_struct/",
+ "//components/variations/service/generate_ui_string_overrider.py",
# For blink_perf benchmarks.
"//third_party/blink/perf_tests/",
@@ -52,7 +54,8 @@ if (is_android) {
}
}
-# Group for running benchmarks without building Chrome
+# Group for running benchmarks without building Chrome. Keep in sync with
+# group("perf").
group("perf_without_chrome") {
testonly = true
deps = [
@@ -69,6 +72,7 @@ group("perf_without_chrome") {
# Field trial dependencies
"//tools/json_comment_eater/",
"//tools/json_to_struct/",
+ "//components/variations/service/generate_ui_string_overrider.py",
# For blink_perf benchmarks.
"//third_party/blink/perf_tests/",
diff --git a/chromium/tools/perf/chrome_telemetry_build/BUILD.gn b/chromium/tools/perf/chrome_telemetry_build/BUILD.gn
index e1853f94c41..0818db84187 100644
--- a/chromium/tools/perf/chrome_telemetry_build/BUILD.gn
+++ b/chromium/tools/perf/chrome_telemetry_build/BUILD.gn
@@ -50,7 +50,7 @@ group("telemetry_chrome_test") {
if (is_mac) {
data_deps += [
"//chrome:chrome_framework",
- "//chrome:chrome_helper_app",
+ "//chrome:chrome_helper_app_default",
"//third_party/breakpad:dump_syms",
"//third_party/crashpad/crashpad/tools:crashpad_database_util",
]
diff --git a/chromium/tools/perf/contrib/vr_benchmarks/BUILD.gn b/chromium/tools/perf/contrib/vr_benchmarks/BUILD.gn
index 758057abdbc..51644e03acf 100644
--- a/chromium/tools/perf/contrib/vr_benchmarks/BUILD.gn
+++ b/chromium/tools/perf/contrib/vr_benchmarks/BUILD.gn
@@ -72,7 +72,7 @@ action("generate_vr_assets_profile") {
"//chrome/browser/resources/vr/assets/vr_assets_component_files.json",
]
outputs = [
- "$target_gen_dir/vr_assets_profile/",
+ "$target_gen_dir/vr_assets_profile",
]
args = [
"--output",
diff --git a/chromium/tools/polymer/polymer_grdp_to_txt.py b/chromium/tools/polymer/polymer_grdp_to_txt.py
index 9940faa36de..92130acc7f2 100755
--- a/chromium/tools/polymer/polymer_grdp_to_txt.py
+++ b/chromium/tools/polymer/polymer_grdp_to_txt.py
@@ -3,14 +3,16 @@
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
+import argparse
import sys
import xml.sax
class PathsExtractor(xml.sax.ContentHandler):
- def __init__(self):
+ def __init__(self, polymer_version):
self.paths = []
+ self.polymer_version = polymer_version
def startElement(self, name, attrs):
if name != 'structure':
@@ -18,17 +20,23 @@ class PathsExtractor(xml.sax.ContentHandler):
path = attrs['file']
if path.startswith('../../../third_party/web-animations-js'):
return
- prefix_1_0 = '../../../third_party/polymer/v1_0/components-chromium/'
- if path.startswith(prefix_1_0):
- self.paths.append(path[len(prefix_1_0):])
+ prefix = ('../../../third_party/polymer/v%s_0/components-chromium/' %
+ self.polymer_version)
+ if path.startswith(prefix):
+ self.paths.append(path[len(prefix):])
else:
raise Exception("Unexpected path %s." % path)
def main(argv):
- xml_handler = PathsExtractor()
- xml.sax.parse(argv[1], xml_handler)
+ parser = argparse.ArgumentParser()
+ parser.add_argument('input')
+ parser.add_argument('--polymer_version', required=True)
+ args = parser.parse_args(argv)
+
+ xml_handler = PathsExtractor(args.polymer_version)
+ xml.sax.parse(args.input, xml_handler)
print '\n'.join(sorted(xml_handler.paths))
if __name__ == '__main__':
- sys.exit(main(sys.argv))
+ sys.exit(main(sys.argv[1:]))
diff --git a/chromium/tools/polymer/txt_to_polymer_grdp.py b/chromium/tools/polymer/txt_to_polymer_grdp.py
index ed483ba6ee4..096dce94fab 100755
--- a/chromium/tools/polymer/txt_to_polymer_grdp.py
+++ b/chromium/tools/polymer/txt_to_polymer_grdp.py
@@ -4,6 +4,7 @@
# found in the LICENSE file.
from __future__ import with_statement
+import argparse
import os
import string
import sys
@@ -12,7 +13,8 @@ import sys
FILE_TEMPLATE = \
"""<?xml version="1.0" encoding="utf-8"?>
<!--
- This file is generated.
+ This file is partially generated. See note below about the "partially" part.
+
Please use 'src/tools/polymer/polymer_grdp_to_txt.py' and
'src/tools/polymer/txt_to_polymer_grdp.py' to modify it, if possible.
@@ -26,35 +28,40 @@ FILE_TEMPLATE = \
'txt_to_polymer_grdp.py' converts list back to GRDP file.
Usage:
- $ polymer_grdp_to_txt.py polymer_resources.grdp > /tmp/list.txt
+ $ polymer_grdp_to_txt.py polymer_resources.grdp \-\-polymer_version=%(version)s > /tmp/list.txt
$ vim /tmp/list.txt
- $ txt_to_polymer_grdp.py /tmp/list.txt > polymer_resources.grdp
+ $ txt_to_polymer_grdp.py /tmp/list.txt \-\-polymer_version=%(version)s > polymer_resources.grdp
+
+ NOTE: Regenerating this file will eliminate all previous <if expr> statements.
+ Please restore these manually.
-->
<grit-part>
- <!-- Polymer 1.0 -->
-%(v_1_0)s
- <structure name="IDR_POLYMER_1_0_WEB_ANIMATIONS_JS_WEB_ANIMATIONS_NEXT_LITE_MIN_JS"
- file="../../../third_party/web-animations-js/sources/web-animations-next-lite.min.js"
- type="chrome_html"
- compress="gzip" />
+ <!-- Polymer %(version)s.0 -->
+%(contents)s
+%(web_animations)s
</grit-part>
"""
+DEFINITION_TEMPLATE_WEB_ANIMATIONS = \
+""" <structure name="IDR_POLYMER_1_0_WEB_ANIMATIONS_JS_WEB_ANIMATIONS_NEXT_LITE_MIN_JS"
+ file="../../../third_party/web-animations-js/sources/web-animations-next-lite.min.js"
+ type="chrome_html"
+ compress="gzip" />"""
-DEFINITION_TEMPLATE_1_0 = \
-""" <structure name="%s"
- file="../../../third_party/polymer/v1_0/components-chromium/%s"
+DEFINITION_TEMPLATE = \
+""" <structure name="%(name)s"
+ file="../../../third_party/polymer/v%(version)s_0/components-chromium/%(path)s"
type="chrome_html"
compress="gzip" />"""
-def PathToGritId(path):
+def PathToGritId(polymer_version, path):
table = string.maketrans(string.lowercase + '/.-', string.uppercase + '___')
- return 'IDR_POLYMER_1_0_' + path.translate(table)
+ return ('IDR_POLYMER_%s_0_' % polymer_version) + path.translate(table)
-def SortKey(record):
- return (record, PathToGritId(record))
+def SortKey(polymer_version, record):
+ return (record, PathToGritId(record, polymer_version))
def ParseRecord(record):
@@ -66,23 +73,38 @@ class FileNotFoundException(Exception):
_HERE = os.path.dirname(os.path.realpath(__file__))
-_POLYMER_DIR = os.path.join(_HERE, os.pardir, os.pardir,
- 'third_party', 'polymer', 'v1_0', 'components-chromium')
def main(argv):
- with open(argv[1]) as f:
+ parser = argparse.ArgumentParser()
+ parser.add_argument('input')
+ parser.add_argument('--polymer_version', required=True)
+ args = parser.parse_args(argv)
+
+ polymer_version = args.polymer_version
+
+ polymer_dir = os.path.join(_HERE, os.pardir, os.pardir,
+ 'third_party', 'polymer', 'v%s_0' % polymer_version,
+ 'components-chromium')
+
+ with open(args.input) as f:
records = [ParseRecord(r) for r in f if not r.isspace()]
- lines = { 'v_1_0': [] }
- for path in sorted(set(records), key=SortKey):
- full_path = os.path.normpath(os.path.join(_POLYMER_DIR, path))
+ lines = []
+ for path in sorted(set(records), key=lambda r: SortKey(r, polymer_version)):
+ full_path = os.path.normpath(os.path.join(polymer_dir, path))
if not os.path.exists(full_path):
raise FileNotFoundException('%s not found' % full_path)
- template = DEFINITION_TEMPLATE_1_0
- lines['v_1_0'].append(
- template % (PathToGritId(path), path))
- print FILE_TEMPLATE % { 'v_1_0': '\n'.join(lines['v_1_0']) }
+ lines.append(DEFINITION_TEMPLATE % {
+ 'version': polymer_version,
+ 'name': PathToGritId(polymer_version, path),
+ 'path': path})
+
+ print FILE_TEMPLATE % {
+ 'contents': '\n'.join(lines),
+ 'web_animations': '' if polymer_version == '3' else
+ DEFINITION_TEMPLATE_WEB_ANIMATIONS,
+ 'version' : polymer_version }
if __name__ == '__main__':
- sys.exit(main(sys.argv))
+ sys.exit(main(sys.argv[1:]))
diff --git a/chromium/tools/resources/OWNERS b/chromium/tools/resources/OWNERS
index ea259a77735..138419c281a 100644
--- a/chromium/tools/resources/OWNERS
+++ b/chromium/tools/resources/OWNERS
@@ -1,3 +1,7 @@
agrieve@chromium.org
+
+per-file *svgo*=dbeam@chromium.org
+per-file PRESUBMIT.py=dbeam@chromium.org
+
per-file filter_resource_whitelist.*=estevenson@chromium.org
per-file generate_resource_whitelist.*=estevenson@chromium.org
diff --git a/chromium/tools/resources/PRESUBMIT.py b/chromium/tools/resources/PRESUBMIT.py
new file mode 100644
index 00000000000..b378edc3ef4
--- /dev/null
+++ b/chromium/tools/resources/PRESUBMIT.py
@@ -0,0 +1,23 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+def CheckChangeOnUpload(*args):
+ return _CommonChecks(*args)
+
+
+def CheckChangeOnCommit(*args):
+ return _CommonChecks(*args)
+
+
+def _CommonChecks(input_api, output_api):
+ cwd = input_api.PresubmitLocalPath()
+ path = input_api.os_path
+ files = [path.basename(f.LocalPath()) for f in input_api.AffectedFiles()]
+
+ if any(f for f in files if f.startswith('svgo_presubmit')):
+ tests = [path.join(cwd, 'svgo_presubmit_test.py')]
+ return input_api.canned_checks.RunUnitTests(input_api, output_api, tests)
+
+ return []
diff --git a/chromium/tools/resources/__init__.py b/chromium/tools/resources/__init__.py
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/chromium/tools/resources/__init__.py
diff --git a/chromium/tools/resources/svgo.py b/chromium/tools/resources/svgo.py
new file mode 100755
index 00000000000..7b4089cbfb9
--- /dev/null
+++ b/chromium/tools/resources/svgo.py
@@ -0,0 +1,26 @@
+#!/usr/bin/env python
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+def Run(os_path=None, args=None):
+ _HERE_PATH = os_path.dirname(os_path.realpath(__file__))
+ _SRC_PATH = os_path.normpath(os_path.join(_HERE_PATH, '..', '..'))
+
+ import sys
+ old_sys_path = sys.path[:]
+ sys.path.append(os_path.join(_SRC_PATH, 'third_party', 'node'))
+
+ try:
+ import node, node_modules
+ finally:
+ sys.path = old_sys_path
+
+ return node.RunNode([node_modules.PathToSvgo()] + args)
+
+
+if __name__ == '__main__':
+ import os
+ import sys
+ print Run(os_path=os.path, args=sys.argv[1:])
diff --git a/chromium/tools/resources/svgo_presubmit.py b/chromium/tools/resources/svgo_presubmit.py
new file mode 100644
index 00000000000..a32dfb33d46
--- /dev/null
+++ b/chromium/tools/resources/svgo_presubmit.py
@@ -0,0 +1,26 @@
+# Copyright 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+
+def CheckOptimized(input_api, output_api):
+ file_filter = lambda f: f.LocalPath().endswith('.svg')
+ svgs = input_api.AffectedFiles(file_filter=file_filter, include_deletes=False)
+
+ if not svgs:
+ return []
+
+ import svgo
+
+ unoptimized = []
+ for f in svgs:
+ output = svgo.Run(input_api.os_path, ['-o', '-', f.AbsoluteLocalPath()])
+ if output.strip() != '\n'.join(f.NewContents()).strip():
+ unoptimized.append(f.LocalPath())
+
+ if unoptimized:
+ instructions = 'Run tools/resources/svgo.py on these files to optimize:'
+ msg = '\n '.join([instructions] + unoptimized)
+ return [output_api.PresubmitNotifyResult(msg)]
+
+ return []
diff --git a/chromium/tools/resources/svgo_presubmit_test.py b/chromium/tools/resources/svgo_presubmit_test.py
new file mode 100755
index 00000000000..cb7427b0ecc
--- /dev/null
+++ b/chromium/tools/resources/svgo_presubmit_test.py
@@ -0,0 +1,55 @@
+#!/usr/bin/env python
+# Copyright 2017 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import os
+import svgo_presubmit
+import sys
+import tempfile
+import unittest
+
+
+_HERE_PATH = os.path.dirname(__file__)
+sys.path.append(os.path.join(_HERE_PATH, '..', '..'))
+
+from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi, MockFile
+
+_OPTIMIZED_SVG = '''
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="#757575"><path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg>
+'''.strip()
+
+_UNOPTIMIZED_SVG = '''
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#757575">
+ <path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"></path>
+</svg>
+'''
+
+class SvgPresubmitTest(unittest.TestCase):
+ def tearDown(self):
+ os.remove(self._tmp_file)
+
+ def check_contents(self, file_contents):
+ tmp_args = {'suffix': '.svg', 'dir': _HERE_PATH, 'delete': False}
+ with tempfile.NamedTemporaryFile(**tmp_args) as f:
+ self._tmp_file = f.name
+ f.write(file_contents)
+
+ input_api = MockInputApi()
+ input_api.files = [MockFile(os.path.abspath(self._tmp_file), file_contents.splitlines())]
+ input_api.presubmit_local_path = _HERE_PATH
+
+ return svgo_presubmit.CheckOptimized(input_api, MockOutputApi())
+
+ def testUnoptimizedSvg(self):
+ results = self.check_contents(_UNOPTIMIZED_SVG)
+ self.assertEquals(len(results), 1)
+ self.assertTrue(results[0].type == 'notify')
+ self.assertTrue('svgo' in results[0].message)
+
+ def testOptimizedSvg(self):
+ self.assertEquals(len(self.check_contents(_OPTIMIZED_SVG)), 0)
+
+
+if __name__ == '__main__':
+ unittest.main()
diff --git a/chromium/tools/traffic_annotation/bin/README.md b/chromium/tools/traffic_annotation/bin/README.md
index 0a43e822aec..86b30732f5c 100644
--- a/chromium/tools/traffic_annotation/bin/README.md
+++ b/chromium/tools/traffic_annotation/bin/README.md
@@ -9,7 +9,7 @@ in this folder, otherwise run:
# On Linux:
```bash
git new-branch roll_traffic_annotation_tools
-python tools/clang/scripts/update.py --bootstrap --force-local-build \
+python tools/clang/scripts/build.py --bootstrap \
--without-android --extra-tools traffic_annotation_extractor
cp third_party/llvm-build/Release+Asserts/bin/traffic_annotation_extractor \
tools/traffic_annotation/bin/linux64/
@@ -39,7 +39,7 @@ git cl upload
# On Windows:
```bash
git new-branch roll_traffic_annotation_tools
-python tools/clang/scripts/update.py --bootstrap --force-local-build ^
+python tools/clang/scripts/build.py --bootstrap ^
--without-android --extra-tools traffic_annotation_extractor
cp third_party/llvm-build/Release+Asserts/bin/traffic_annotation_extractor.exe ^
tools/traffic_annotation/bin/win32/
@@ -74,5 +74,5 @@ and land the resulting CL.
The following two lines will be updated by the above script, and the modified
README should be committed along with the updated .sha1 checksums.
-CLANG_REVISION = '357692'
-LASTCHANGE=344017b45ac7c4c94742ec577fe3babc0dfd271a-refs/heads/master@{#651701}
+CLANG_REVISION = '360094'
+LASTCHANGE=ecda211dff8f3722704938f87637e0df657d15f1-refs/heads/master@{#659930}
diff --git a/chromium/tools/traffic_annotation/bin/linux64/traffic_annotation_extractor.sha1 b/chromium/tools/traffic_annotation/bin/linux64/traffic_annotation_extractor.sha1
index c8636dc3731..a9a4ec87160 100644
--- a/chromium/tools/traffic_annotation/bin/linux64/traffic_annotation_extractor.sha1
+++ b/chromium/tools/traffic_annotation/bin/linux64/traffic_annotation_extractor.sha1
@@ -1 +1 @@
-ac5d58a08edc6f8dc8fc1ed343d56437bba1eaa8 \ No newline at end of file
+c4e2a772fbab2f1f7e47cf8f4f23425933f8cd0f \ No newline at end of file
diff --git a/chromium/tools/traffic_annotation/bin/win32/traffic_annotation_extractor.exe.sha1 b/chromium/tools/traffic_annotation/bin/win32/traffic_annotation_extractor.exe.sha1
index be0688afa64..688de3b1eab 100644
--- a/chromium/tools/traffic_annotation/bin/win32/traffic_annotation_extractor.exe.sha1
+++ b/chromium/tools/traffic_annotation/bin/win32/traffic_annotation_extractor.exe.sha1
@@ -1 +1 @@
-5314ef2a54f60f179e6cf5e4dd65d0f3bbc51bdf \ No newline at end of file
+eac43e1fb9f3fb1a300515061ad9daef6d51839d \ No newline at end of file
diff --git a/chromium/tools/traffic_annotation/summary/annotations.xml b/chromium/tools/traffic_annotation/summary/annotations.xml
index 5f7d6442557..0cb448ad3cd 100644
--- a/chromium/tools/traffic_annotation/summary/annotations.xml
+++ b/chromium/tools/traffic_annotation/summary/annotations.xml
@@ -11,8 +11,6 @@ Refer to README.md for content description and update process.
<item id="CRD_dns_blackhole_checker" hash_code="7634838" type="0" content_hash_code="86431305" os_list="linux,windows" file_path="remoting/host/dns_blackhole_checker.cc"/>
<item id="CRD_ice_config_request" hash_code="49825319" type="0" content_hash_code="8740825" os_list="linux,windows" file_path="remoting/protocol/http_ice_config_request.cc"/>
<item id="CRD_relay_session_request" hash_code="24058523" type="0" content_hash_code="36997811" os_list="linux,windows" file_path="remoting/protocol/port_allocator.cc"/>
- <item id="CRD_service_client" hash_code="25502614" type="0" content_hash_code="76861209" os_list="linux,windows" file_path="remoting/host/setup/service_client.cc"/>
- <item id="CRD_telemetry_log" hash_code="18670926" type="0" content_hash_code="49025478" os_list="linux,windows" file_path="remoting/base/telemetry_log_writer.cc"/>
<item id="accounts_image_fetcher" hash_code="98658519" type="0" content_hash_code="45432230" os_list="linux,windows" file_path="components/signin/core/browser/account_fetcher_service.cc"/>
<item id="adb_client_socket" hash_code="87775794" type="0" content_hash_code="56654828" os_list="linux,windows" file_path="chrome/browser/devtools/device/adb/adb_client_socket.cc"/>
<item id="affiliation_lookup" hash_code="111904019" type="0" content_hash_code="81061452" os_list="linux,windows" file_path="components/password_manager/core/browser/android_affiliation/affiliation_fetcher.cc"/>
@@ -103,6 +101,7 @@ Refer to README.md for content description and update process.
<item id="external_policy_fetcher" hash_code="9459438" type="0" content_hash_code="64260484" os_list="linux,windows" file_path="components/policy/core/common/cloud/external_policy_data_fetcher.cc"/>
<item id="family_info" hash_code="30913825" type="0" content_hash_code="25369370" os_list="linux,windows" file_path="chrome/browser/supervised_user/child_accounts/family_info_fetcher.cc"/>
<item id="favicon_loader" hash_code="112189210" type="0" content_hash_code="70773116" os_list="linux,windows" file_path="content/renderer/loader/web_url_loader_impl.cc"/>
+ <item id="favicon_request_handler_get_favicon" hash_code="18468467" type="0" content_hash_code="72011341" os_list="linux,windows" file_path="components/favicon/core/favicon_request_handler.cc"/>
<item id="feed_image_fetcher" hash_code="87439531" type="0" deprecated="2019-01-04" content_hash_code="26756208" file_path=""/>
<item id="gaia_auth_check_connection_info" hash_code="4598626" type="0" content_hash_code="57347000" os_list="linux,windows" file_path="google_apis/gaia/gaia_auth_fetcher.cc"/>
<item id="gaia_auth_exchange_cookies" hash_code="134289752" type="0" deprecated="2018-09-11" content_hash_code="66433230" file_path=""/>
@@ -156,7 +155,8 @@ Refer to README.md for content description and update process.
<item id="network_location_provider" hash_code="23472048" type="1" second_id="96590038" content_hash_code="41087976" os_list="linux,windows" semantics_fields="1" policy_fields="3,4" file_path="services/device/geolocation/network_location_provider.cc"/>
<item id="network_location_request" hash_code="96590038" type="2" content_hash_code="80741011" os_list="linux,windows" semantics_fields="2,3,4,5" policy_fields="-1" file_path="services/device/geolocation/network_location_request.cc"/>
<item id="network_time_component" hash_code="46188932" type="0" content_hash_code="28051857" os_list="linux,windows" file_path="components/network_time/network_time_tracker.cc"/>
- <item id="ntp_contextual_suggestions_fetch" hash_code="95711309" type="0" content_hash_code="107035434" os_list="linux,windows" file_path="components/ntp_snippets/contextual/contextual_suggestions_fetch.cc"/>
+ <item id="ntp_contextual_suggestions_fetch" hash_code="95711309" type="0" deprecated="2019-04-18" content_hash_code="107035434" file_path=""/>
+ <item id="ntp_custom_background" hash_code="92125886" type="0" content_hash_code="61176452" os_list="linux,windows" file_path="chrome/browser/search/instant_service.cc"/>
<item id="ntp_custom_link_checker_request" hash_code="78408551" type="0" deprecated="2018-10-26" content_hash_code="13407730" file_path=""/>
<item id="ntp_icon_source" hash_code="29197139" type="0" content_hash_code="16399294" os_list="linux,windows" file_path="chrome/browser/search/ntp_icon_source.cc"/>
<item id="ntp_snippets_fetch" hash_code="15418154" type="0" content_hash_code="10078959" os_list="linux,windows" file_path="components/ntp_snippets/remote/json_request.cc"/>
@@ -177,7 +177,7 @@ Refer to README.md for content description and update process.
<item id="omnibox_zerosuggest_experimental" hash_code="3813491" type="0" content_hash_code="22929259" os_list="linux,windows" file_path="components/omnibox/browser/contextual_suggestions_service.cc"/>
<item id="one_google_bar_service" hash_code="78917933" type="0" content_hash_code="46527252" os_list="linux,windows" file_path="chrome/browser/search/one_google_bar/one_google_bar_loader_impl.cc"/>
<item id="open_search" hash_code="107267424" type="0" content_hash_code="83025542" os_list="linux,windows" file_path="components/search_engines/template_url_fetcher.cc"/>
- <item id="origin_policy_loader" hash_code="6483617" type="0" content_hash_code="20680909" os_list="linux,windows" file_path="content/browser/frame_host/origin_policy_throttle.cc"/>
+ <item id="origin_policy_loader" hash_code="6483617" type="0" content_hash_code="20680909" os_list="linux,windows" file_path="services/network/origin_policy/origin_policy_fetcher.cc"/>
<item id="parallel_download_job" hash_code="135118587" type="0" content_hash_code="105330419" os_list="linux,windows" file_path="components/download/internal/common/parallel_download_job.cc"/>
<item id="password_protection_request" hash_code="66322287" type="0" content_hash_code="25596947" os_list="linux,windows" file_path="components/safe_browsing/password_protection/password_protection_request.cc"/>
<item id="password_requirements_spec_fetch" hash_code="69585116" type="0" content_hash_code="5591260" os_list="linux,windows" file_path="components/password_manager/core/browser/generation/password_requirements_spec_fetcher_impl.cc"/>
@@ -235,7 +235,6 @@ Refer to README.md for content description and update process.
<item id="safe_browsing_module_loader" hash_code="6019475" type="0" content_hash_code="49511650" os_list="linux,windows" file_path="chrome/browser/safe_browsing/client_side_model_loader.cc"/>
<item id="safe_browsing_v4_get_hash" hash_code="8561691" type="0" content_hash_code="132435617" os_list="linux,windows" file_path="components/safe_browsing/db/v4_get_hash_protocol_manager.cc"/>
<item id="safe_browsing_v4_update" hash_code="82509217" type="0" content_hash_code="5247849" os_list="linux,windows" file_path="components/safe_browsing/db/v4_update_protocol_manager.cc"/>
- <item id="safe_search_url_reporter" hash_code="119677115" type="0" content_hash_code="67393078" os_list="linux,windows" file_path="chrome/browser/supervised_user/experimental/safe_search_url_reporter.cc"/>
<item id="save_file_manager" hash_code="56275203" type="0" content_hash_code="56692339" os_list="linux,windows" file_path="content/browser/download/save_file_manager.cc"/>
<item id="sdch_dictionary_fetch" hash_code="47152935" type="0" deprecated="2017-09-16" content_hash_code="16764294" file_path=""/>
<item id="search_suggest_service" hash_code="57785193" type="0" content_hash_code="132247652" os_list="linux,windows" file_path="chrome/browser/search/search_suggest/search_suggest_loader_impl.cc"/>
diff --git a/chromium/tools/translation/helper/translation_helper.py b/chromium/tools/translation/helper/translation_helper.py
index f9c61b6dc61..1f9434dbd78 100644
--- a/chromium/tools/translation/helper/translation_helper.py
+++ b/chromium/tools/translation/helper/translation_helper.py
@@ -75,14 +75,24 @@ def get_translatable_grds(repo_root, all_grd_paths,
translation_expectations_path: The path to the translation expectations
file, which specifies which grds to translate and into which languages.
"""
- grd_to_langs, untranslated_grds = _parse_translation_expectations(
+ parsed_expectations = _parse_translation_expectations(
translation_expectations_path)
+ grd_to_langs, untranslated_grds, internal_grds = parsed_expectations
+ errors = []
+ # Make sure that grds in internal_grds aren't processed, since they might
+ # contain pieces not available publicly.
+ for internal_grd in internal_grds:
+ try:
+ all_grd_paths.remove(internal_grd)
+ except ValueError:
+ errors.append(
+ '%s is listed in translation expectations as an internal file to be '
+ 'ignored, but this grd file does not exist.' % internal_grd)
# Check that every grd that appears translatable is listed in
# the translation expectations.
grds_with_expectations = set(grd_to_langs.keys()).union(untranslated_grds)
all_grds = {p: GRDFile(os.path.join(repo_root, p)) for p in all_grd_paths}
- errors = []
for path, grd in all_grds.iteritems():
if grd.appears_translatable:
if path not in grds_with_expectations:
@@ -169,18 +179,25 @@ def _parse_translation_expectations(path):
"languages": ["de", "pt-BR"],
"files": [
"chrome/android/android_chrome_strings.grd",
+ ],
},
"untranslated_grds": {
"chrome/locale_settings.grd": "Not UI strings; localized separately",
"chrome/locale_settings_mac.grd": "Not UI strings; localized separately",
},
+ "internal_grds": [
+ "chrome/internal.grd",
+ ],
}
Returns:
- A tuple (grd_to_langs, untranslated_grds). grd_to_langs maps each grd path
- to the list of languages into which that grd should be translated.
- untranslated_grds is a list of grds that "appear translatable" but should
- not be translated.
+ A tuple (grd_to_langs, untranslated_grds, internal_grds).
+ grd_to_langs maps each grd path to the list of languages into which
+ that grd should be translated. untranslated_grds is a list of grds
+ that "appear translatable" but should not be translated.
+ internal_grds is a list of grds that are internal only and should
+ not be read by this helper (since they might contain parts not
+ available publicly).
"""
with open(path) as f:
file_contents = f.read()
@@ -196,6 +213,7 @@ def _parse_translation_expectations(path):
grd_to_langs = {}
untranslated_grds = []
+ internal_grds = []
for group_name, settings in translations_expectations.iteritems():
if group_name == 'untranslated_grds':
@@ -203,6 +221,11 @@ def _parse_translation_expectations(path):
assert_list_of_strings(untranslated_grds, 'untranslated_grds')
continue
+ if group_name == 'internal_grds':
+ internal_grds = settings
+ assert_list_of_strings(internal_grds, 'internal_grds')
+ continue
+
languages = settings['languages']
files = settings['files']
assert_list_of_strings(languages, group_name + '.languages')
@@ -210,7 +233,7 @@ def _parse_translation_expectations(path):
for grd in files:
grd_to_langs[grd] = languages
- return grd_to_langs, untranslated_grds
+ return grd_to_langs, untranslated_grds, internal_grds
except Exception:
print 'Error: failed to parse', path
diff --git a/chromium/tools/translation/helper/translation_helper_unittest.py b/chromium/tools/translation/helper/translation_helper_unittest.py
index 4b5ff585c21..8b6249b5961 100644
--- a/chromium/tools/translation/helper/translation_helper_unittest.py
+++ b/chromium/tools/translation/helper/translation_helper_unittest.py
@@ -17,7 +17,7 @@ class TcHelperTest(unittest.TestCase):
def test_get_translatable_grds(self):
grds = translation_helper.get_translatable_grds(
- testdata_path, ['test.grd', 'not_translated.grd'],
+ testdata_path, ['test.grd', 'not_translated.grd', 'internal.grd'],
os.path.join(testdata_path, 'translation_expectations.pyl'))
self.assertEqual(1, len(grds))
@@ -43,13 +43,28 @@ class TcHelperTest(unittest.TestCase):
'translation_expectations.pyl')
with self.assertRaises(Exception) as context:
translation_helper.get_translatable_grds(
- testdata_path, ['test.grd'], TRANSLATION_EXPECTATIONS)
+ testdata_path, ['test.grd', 'internal.grd'], TRANSLATION_EXPECTATIONS)
self.assertEqual(
'%s needs to be updated. Please fix these issues:\n'
' - not_translated.grd is listed in the translation expectations, '
'but this grd file does not exist.' % TRANSLATION_EXPECTATIONS,
context.exception.message)
+ # The expectations list an internal file (internal.grd), but the grd list
+ # doesn't contain it.
+ def test_missing_internal(self):
+ TRANSLATION_EXPECTATIONS = os.path.join(testdata_path,
+ 'translation_expectations.pyl')
+ with self.assertRaises(Exception) as context:
+ translation_helper.get_translatable_grds(
+ testdata_path, ['test.grd', 'not_translated.grd'],
+ TRANSLATION_EXPECTATIONS)
+ self.assertEqual(
+ '%s needs to be updated. Please fix these issues:\n'
+ ' - internal.grd is listed in translation expectations as an internal '
+ 'file to be ignored, but this grd file does not exist.' %
+ TRANSLATION_EXPECTATIONS, context.exception.message)
+
# The expectations list a translatable file (test.grd), but the grd list
# doesn't contain it.
def test_missing_translatable(self):
@@ -57,7 +72,8 @@ class TcHelperTest(unittest.TestCase):
'translation_expectations.pyl')
with self.assertRaises(Exception) as context:
translation_helper.get_translatable_grds(
- testdata_path, ['not_translated.grd'], TRANSLATION_EXPECTATIONS)
+ testdata_path, ['not_translated.grd', 'internal.grd'],
+ TRANSLATION_EXPECTATIONS)
self.assertEqual(
'%s needs to be updated. Please fix these issues:\n'
' - test.grd is listed in the translation expectations, but this grd '
@@ -71,7 +87,8 @@ class TcHelperTest(unittest.TestCase):
'translation_expectations.pyl')
with self.assertRaises(Exception) as context:
translation_helper.get_translatable_grds(
- testdata_path, ['test.grd', 'part.grdp', 'not_translated.grd'],
+ testdata_path,
+ ['test.grd', 'part.grdp', 'not_translated.grd', 'internal.grd'],
TRANSLATION_EXPECTATIONS)
self.assertEqual(
'%s needs to be updated. Please fix these issues:\n'
diff --git a/chromium/tools/translation/upload_screenshots.py b/chromium/tools/translation/upload_screenshots.py
index 03a38054cd1..a22825f4502 100755
--- a/chromium/tools/translation/upload_screenshots.py
+++ b/chromium/tools/translation/upload_screenshots.py
@@ -50,7 +50,7 @@ else:
GIT = 'git'
-def query_yes_no(question, default='yes'):
+def query_yes_no(question, default='no'):
"""Ask a yes/no question via raw_input() and return their answer.
"question" is a string that is presented to the user.
@@ -201,7 +201,8 @@ def main():
# Always ask if the .sha1 files should be added to the CL, even if they are
# already part of the CL. If the files are not modified, adding again is a
# no-op.
- if not query_yes_no('Do you want to add these files to your CL?'):
+ if not query_yes_no('Do you want to add these files to your CL?',
+ default='yes'):
exit(0)
if not args.dry_run:
diff --git a/chromium/tools/v8_context_snapshot/BUILD.gn b/chromium/tools/v8_context_snapshot/BUILD.gn
index 771fc0df366..2d7b357cfc2 100644
--- a/chromium/tools/v8_context_snapshot/BUILD.gn
+++ b/chromium/tools/v8_context_snapshot/BUILD.gn
@@ -11,7 +11,7 @@ import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
import("//build/config/c++/c++.gni")
import("//build/config/compiler/compiler.gni")
-import("//v8/snapshot_toolchain.gni")
+import("//v8/gni/snapshot_toolchain.gni")
if (is_android) {
import("//build/config/android/rules.gni")
diff --git a/chromium/tools/v8_context_snapshot/v8_context_snapshot_generator.cc b/chromium/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
index 4298bff3a07..480121ac436 100644
--- a/chromium/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
+++ b/chromium/tools/v8_context_snapshot/v8_context_snapshot_generator.cc
@@ -5,8 +5,8 @@
#include "base/at_exit.h"
#include "base/command_line.h"
#include "base/files/file_util.h"
-#include "base/message_loop/message_loop.h"
#include "base/single_thread_task_runner.h"
+#include "base/task/single_thread_task_executor.h"
#include "base/task/thread_pool/thread_pool.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/v8_initializer.h"
@@ -41,8 +41,8 @@ int main(int argc, char** argv) {
#endif
// Set up environment to make Blink and V8 workable.
- base::MessageLoop message_loop;
- base::ThreadPool::CreateAndStartWithDefaultParams("TakeSnapshot");
+ base::SingleThreadTaskExecutor main_thread_task_executor;
+ base::ThreadPoolInstance::CreateAndStartWithDefaultParams("TakeSnapshot");
mojo::core::Init();
// Set predictable flag in V8 to generate identical snapshot file.
diff --git a/chromium/tools/variations/fieldtrial_to_struct.py b/chromium/tools/variations/fieldtrial_to_struct.py
index 41128753dd1..b1d92de8cb1 100755
--- a/chromium/tools/variations/fieldtrial_to_struct.py
+++ b/chromium/tools/variations/fieldtrial_to_struct.py
@@ -7,6 +7,7 @@ import json
import os.path
import sys
import optparse
+
_script_path = os.path.realpath(__file__)
sys.path.insert(0, os.path.normpath(_script_path + "/../../json_comment_eater"))
@@ -21,6 +22,14 @@ try:
finally:
sys.path.pop(0)
+sys.path.insert(
+ 0,
+ os.path.normpath(_script_path + "/../../../components/variations/service"))
+try:
+ import generate_ui_string_overrider
+finally:
+ sys.path.pop(0)
+
_platforms = [
'android',
'android_webview',
@@ -61,6 +70,16 @@ def _LoadFieldTrialConfig(filename, platforms):
"""
return _FieldTrialConfigToDescription(_Load(filename), platforms)
+def _ConvertOverrideUIStrings(override_ui_strings):
+ """Converts override_ui_strings to formatted dicts."""
+ overrides = []
+ for ui_string, override in override_ui_strings.iteritems():
+ overrides.append({
+ 'name_hash': generate_ui_string_overrider.HashName(ui_string),
+ 'value': override
+ })
+ return overrides
+
def _CreateExperiment(experiment_data,
platforms,
is_low_end_device,
@@ -84,6 +103,10 @@ def _CreateExperiment(experiment_data,
disable_features_data = experiment_data.get('disable_features')
if disable_features_data:
experiment['disable_features'] = disable_features_data
+ override_ui_strings = experiment_data.get('override_ui_strings')
+ if override_ui_strings:
+ experiment['override_ui_string'] = _ConvertOverrideUIStrings(
+ override_ui_strings)
return experiment
def _CreateTrial(study_name, experiment_configs, platforms):
diff --git a/chromium/tools/variations/fieldtrial_to_struct_unittest.py b/chromium/tools/variations/fieldtrial_to_struct_unittest.py
index 4314b947c69..57c090f4680 100644
--- a/chromium/tools/variations/fieldtrial_to_struct_unittest.py
+++ b/chromium/tools/variations/fieldtrial_to_struct_unittest.py
@@ -297,6 +297,91 @@ class FieldTrialToStruct(unittest.TestCase):
self.maxDiff = None
self.assertEqual(expected, result)
+ _MULTIPLE_OVERRIDE_UI_STRING_CONFIG = {
+ 'Trial1': [
+ {
+ 'platforms': ['windows'],
+ 'experiments': [
+ {
+ 'name': 'Group1',
+ 'override_ui_strings': {
+ 'IDS_NEW_TAB_TITLE': 'test1',
+ 'IDS_SAD_TAB_TITLE': 'test2',
+ },
+ },
+ ]
+ }
+ ],
+ 'Trial2': [
+ {
+ 'platforms': ['windows'],
+ 'experiments': [
+ {
+ 'name': 'Group2',
+ 'override_ui_strings': {
+ 'IDS_DEFAULT_TAB_TITLE': 'test3',
+ },
+ }
+ ]
+ }
+ ]
+ }
+
+ def test_FieldTrialToDescriptionMultipleOverrideUIStringTrial(self):
+ result = fieldtrial_to_struct._FieldTrialConfigToDescription(
+ self._MULTIPLE_OVERRIDE_UI_STRING_CONFIG, ['windows'])
+ expected = {
+ 'elements': {
+ 'kFieldTrialConfig': {
+ 'studies': [
+ {
+ 'name': 'Trial1',
+ 'experiments': [
+ {
+ 'name': 'Group1',
+ 'platforms': ['Study::PLATFORM_WINDOWS'],
+ 'override_ui_string': [
+ {
+ 'name_hash':
+ 4045341670,
+ 'value': 'test1'
+ },
+ {
+ 'name_hash':
+ 1173727369,
+ 'value': 'test2'
+ },
+ ],
+ 'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
+ 'form_factors': [],
+ },
+ ],
+ },
+ {
+ 'name': 'Trial2',
+ 'experiments': [
+ {
+ 'name': 'Group2',
+ 'platforms': ['Study::PLATFORM_WINDOWS'],
+ 'override_ui_string': [
+ {
+ 'name_hash':
+ 3477264953,
+ 'value': 'test3'
+ },
+ ],
+ 'is_low_end_device': 'Study::OPTIONAL_BOOL_MISSING',
+ 'form_factors': [],
+ },
+ ],
+ }
+ ]
+ }
+ }
+ }
+ self.maxDiff = None
+ self.assertEqual(expected, result)
+
def test_FieldTrialToStructMain(self):
schema = self.FullRelativePath(
diff --git a/chromium/tools/variations/unittest_data/expected_output.cc b/chromium/tools/variations/unittest_data/expected_output.cc
index 933ab9e2630..54ca24ea75e 100644
--- a/chromium/tools/variations/unittest_data/expected_output.cc
+++ b/chromium/tools/variations/unittest_data/expected_output.cc
@@ -10,6 +10,36 @@
#include "test_output.h"
+const OverrideUIString array_kFieldTrialConfig_override_ui_string[] = {
+ {
+ 4045341670,
+ "test",
+ },
+};
+const Study::FormFactor array_kFieldTrialConfig_form_factors_8[] = {
+};
+const Study::Platform array_kFieldTrialConfig_platforms_8[] = {
+ Study::PLATFORM_WINDOWS,
+};
+const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_5[] = {
+ {
+ "TestGroup",
+ array_kFieldTrialConfig_platforms_8,
+ 1,
+ array_kFieldTrialConfig_form_factors_8,
+ 0,
+ Study::OPTIONAL_BOOL_MISSING,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ NULL,
+ 0,
+ NULL,
+ array_kFieldTrialConfig_override_ui_string,
+ 1,
+ },
+};
const Study::FormFactor array_kFieldTrialConfig_form_factors_7[] = {
Study::TABLET,
};
@@ -38,6 +68,8 @@ const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_4[] = {
NULL,
0,
NULL,
+ NULL,
+ 0,
},
{
"TestGroup2",
@@ -53,6 +85,8 @@ const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_4[] = {
NULL,
0,
NULL,
+ NULL,
+ 0,
},
};
const Study::FormFactor array_kFieldTrialConfig_form_factors_5[] = {
@@ -75,6 +109,8 @@ const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_3[] = {
NULL,
0,
"my-forcing-flag",
+ NULL,
+ 0,
},
};
const Study::FormFactor array_kFieldTrialConfig_form_factors_4[] = {
@@ -102,6 +138,8 @@ const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_2[] = {
NULL,
0,
NULL,
+ NULL,
+ 0,
},
{
"TestGroup2",
@@ -117,6 +155,8 @@ const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_2[] = {
NULL,
0,
NULL,
+ NULL,
+ 0,
},
};
const char* const array_kFieldTrialConfig_enable_features_1[] = {
@@ -142,6 +182,8 @@ const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_1[] = {
NULL,
0,
NULL,
+ NULL,
+ 0,
},
};
const char* const array_kFieldTrialConfig_disable_features_0[] = {
@@ -203,6 +245,8 @@ const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = {
array_kFieldTrialConfig_disable_features,
1,
NULL,
+ NULL,
+ 0,
},
{
"TestGroup2-2",
@@ -218,6 +262,8 @@ const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments_0[] = {
array_kFieldTrialConfig_disable_features_0,
1,
NULL,
+ NULL,
+ 0,
},
};
const Study::FormFactor array_kFieldTrialConfig_form_factors[] = {
@@ -240,6 +286,8 @@ const FieldTrialTestingExperiment array_kFieldTrialConfig_experiments[] = {
NULL,
0,
NULL,
+ NULL,
+ 0,
},
};
const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {
@@ -273,8 +321,13 @@ const FieldTrialTestingStudy array_kFieldTrialConfig_studies[] = {
array_kFieldTrialConfig_experiments_4,
2,
},
+ {
+ "TrialWithOverrideUIString",
+ array_kFieldTrialConfig_experiments_5,
+ 1,
+ },
};
const FieldTrialTestingConfig kFieldTrialConfig = {
array_kFieldTrialConfig_studies,
- 6,
+ 7,
};
diff --git a/chromium/tools/variations/unittest_data/expected_output.h b/chromium/tools/variations/unittest_data/expected_output.h
index e01eee7c0c5..891823f1c15 100644
--- a/chromium/tools/variations/unittest_data/expected_output.h
+++ b/chromium/tools/variations/unittest_data/expected_output.h
@@ -14,6 +14,11 @@
#include "components/variations/proto/study.pb.h"
+struct OverrideUIString {
+ const int name_hash;
+ const char* const value;
+};
+
struct FieldTrialTestingExperimentParams {
const char* const key;
const char* const value;
@@ -33,6 +38,8 @@ struct FieldTrialTestingExperiment {
const char* const * disable_features;
const size_t disable_features_size;
const char* const forcing_flag;
+ const OverrideUIString * override_ui_string;
+ const size_t override_ui_string_size;
};
struct FieldTrialTestingStudy {
diff --git a/chromium/tools/variations/unittest_data/test_config.json b/chromium/tools/variations/unittest_data/test_config.json
index 8b34c7949e0..0c5e72d66c1 100644
--- a/chromium/tools/variations/unittest_data/test_config.json
+++ b/chromium/tools/variations/unittest_data/test_config.json
@@ -70,5 +70,16 @@
"form_factors": ["tablet"],
"experiments": [{"name": "TestGroup2"}]
}
+ ],
+ "TrialWithOverrideUIString": [
+ {
+ "platforms": ["windows"],
+ "experiments": [
+ {
+ "name": "TestGroup",
+ "override_ui_strings": {"IDS_NEW_TAB_TITLE": "test"}
+ }
+ ]
+ }
]
}
diff --git a/chromium/tools/vscode/settings.json5 b/chromium/tools/vscode/settings.json5
index 26410388db0..3dcf9b2730e 100644
--- a/chromium/tools/vscode/settings.json5
+++ b/chromium/tools/vscode/settings.json5
@@ -45,12 +45,13 @@
},
// Wider author column for annotator extension.
+ // https://marketplace.visualstudio.com/items?itemName=ryu1kn.annotator
"annotator.annotationColumnWidth": "24em",
// C++ clang format settings.
"C_Cpp.clang_format_path": "${workspaceFolder}/third_party/depot_tools/clang-format",
"C_Cpp.clang_format_sortIncludes": true,
- "C_Cpp.clang_format_formatOnSave": true,
+ "editor.formatOnSave": true,
// YouCompleteMe
"ycmd.path": "<full_path_to_your_home>/.ycmd", // Please replace this path
diff --git a/chromium/tools/vscode/tasks.json5 b/chromium/tools/vscode/tasks.json5
index b90e8128799..8e736cad833 100644
--- a/chromium/tools/vscode/tasks.json5
+++ b/chromium/tools/vscode/tasks.json5
@@ -1,17 +1,27 @@
{
- "version": "0.1.0",
+ "version": "2.0.0",
"runner": "terminal",
- "showOutput": "always",
- "echoCommand": true,
"tasks": [
{
- "taskName": "1-build_chrome_debug",
+ "label": "1-build_chrome_debug",
+ "type": "shell",
"command": "ninja -C out/Debug -j 2000 chrome",
- "isShellCommand": true,
- "isTestCommand": true,
+ "group": "test",
+ "presentation": {
+ "echo": true,
+ "reveal": "always"
+ },
"problemMatcher": [
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Debug"],
+ "pattern": {
+ "regexp": "^(gen/.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -20,6 +30,14 @@
},
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Debug"],
+ "pattern": {
+ "regexp": "^(gen/.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "severity": 3, "message": 4
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -28,13 +46,25 @@
}]
},
{
- "taskName": "2-build_chrome_release",
+ "label": "2-build_chrome_release",
+ "type": "shell",
"command": "ninja -C out/Release -j 2000 chrome",
- "isShellCommand": true,
- "isBuildCommand": true,
+ "group": "build",
+ "presentation": {
+ "echo": true,
+ "reveal": "always"
+ },
"problemMatcher": [
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Release"],
+ "pattern": {
+ "regexp": "^(gen/.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -43,6 +73,14 @@
},
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Release"],
+ "pattern": {
+ "regexp": "^(gen/.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "severity": 3, "message": 4
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -51,12 +89,24 @@
}]
},
{
- "taskName": "3-build_all_debug",
+ "label": "3-build_all_debug",
+ "type": "shell",
"command": "ninja -C out/Debug -j 2000",
- "isShellCommand": true,
+ "presentation": {
+ "echo": true,
+ "reveal": "always"
+ },
"problemMatcher": [
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Debug"],
+ "pattern": {
+ "regexp": "^(gen/.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -65,6 +115,14 @@
},
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Debug"],
+ "pattern": {
+ "regexp": "^(gen/.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "severity": 3, "message": 4
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -73,12 +131,24 @@
}]
},
{
- "taskName": "4-build_all_release",
+ "label": "4-build_all_release",
+ "type": "shell",
"command": "ninja -C out/Release -j 2000",
- "isShellCommand": true,
+ "presentation": {
+ "echo": true,
+ "reveal": "always"
+ },
"problemMatcher": [
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Release"],
+ "pattern": {
+ "regexp": "^(gen/.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -87,6 +157,14 @@
},
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Release"],
+ "pattern": {
+ "regexp": "^(gen/.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "severity": 3, "message": 4
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -95,12 +173,24 @@
}]
},
{
- "taskName": "5-build_test_debug",
+ "label": "5-build_test_debug",
+ "type": "shell",
"command": "ninja -C out/Debug -j 2000 unit_tests components_unittests browser_tests",
- "isShellCommand": true,
+ "presentation": {
+ "echo": true,
+ "reveal": "always"
+ },
"problemMatcher": [
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Debug"],
+ "pattern": {
+ "regexp": "^(gen/.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -109,6 +199,14 @@
},
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Debug"],
+ "pattern": {
+ "regexp": "^(gen/.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "severity": 3, "message": 4
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -117,12 +215,24 @@
}]
},
{
- "taskName": "6-build_current_file",
+ "label": "6-build_current_file",
+ "type": "shell",
"command": "compile_single_file --build-dir=out/Debug --file-path=${file}",
- "isShellCommand": true,
+ "presentation": {
+ "echo": true,
+ "reveal": "always"
+ },
"problemMatcher": [
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Debug"],
+ "pattern": {
+ "regexp": "^(gen/.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "line": 2, "column": 3, "severity": 4, "message": 5
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*):(\\d+):(\\d+):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -131,6 +241,14 @@
},
{
"owner": "cpp",
+ "fileLocation": ["relative", "${workspaceRoot}/out/Debug"],
+ "pattern": {
+ "regexp": "^(gen/.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
+ "file": 1, "severity": 3, "message": 4
+ }
+ },
+ {
+ "owner": "cpp",
"fileLocation": ["relative", "${workspaceRoot}"],
"pattern": {
"regexp": "^../../(.*?):(.*):\\s+(warning|\\w*\\s?error):\\s+(.*)$",
@@ -138,4 +256,4 @@
}
}]
}]
-} \ No newline at end of file
+}
diff --git a/chromium/tools/wayland_aux/Makefile b/chromium/tools/wayland_aux/Makefile
new file mode 100644
index 00000000000..56a9fc7c5c3
--- /dev/null
+++ b/chromium/tools/wayland_aux/Makefile
@@ -0,0 +1,31 @@
+THIS_DIR := $(dir $(abspath $(lastword $(MAKEFILE_LIST))))
+XDGSHELL := $(THIS_DIR)/../../third_party/wayland-protocols/src/unstable/xdg-shell/xdg-shell-unstable-v6.xml $(wildcard *.py)
+
+all: x.in.svg x.de.svg l.in.svg l.de.svg fuzz_actions.proto
+ @echo $(XDG_SHELL)
+
+fuzz_actions.proto: $(XDGSHELL)
+ python main.py --spec $< -t proto > $@
+
+%.in.svg: %.in.gv
+ fdp -Tsvg $< -o $@
+
+%.de.svg: %.de.gv
+ dot -Tsvg $< -o $@
+
+x.in.gv: $(XDGSHELL)
+ python main.py --spec $< -t interfaces -x > $@
+
+l.in.gv: $(XDGSHELL)
+ python main.py --spec $< -t interfaces > $@
+
+x.de.gv: $(XDGSHELL)
+ python main.py --spec $< -t deps -x > $@
+
+l.de.gv: $(XDGSHELL)
+ python main.py --spec $< -t deps > $@
+
+clean:
+ rm -f *.svg *.gv
+ rm -rf __pycache__
+ rm -f fuzz_actions.proto
diff --git a/chromium/tools/wayland_aux/OWNERS b/chromium/tools/wayland_aux/OWNERS
new file mode 100644
index 00000000000..a86b2ce0e4f
--- /dev/null
+++ b/chromium/tools/wayland_aux/OWNERS
@@ -0,0 +1,2 @@
+benwells@chromium.org
+hollingum@google.com
diff --git a/chromium/tools/wayland_aux/gv_diagram.py b/chromium/tools/wayland_aux/gv_diagram.py
new file mode 100644
index 00000000000..99cabb1ef89
--- /dev/null
+++ b/chromium/tools/wayland_aux/gv_diagram.py
@@ -0,0 +1,220 @@
+# Copyright (c) 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Draw wayland protocols with Graphviz.
+
+Provides a GvPrinter class which is used to output one (or more) wayland
+protocols as a graph, showing the relationships between interfaces, their
+messages, and how those messages create new interfaces.
+"""
+
+from __future__ import absolute_import
+from __future__ import print_function
+import protocol_util
+
+
+class GvPrinter(object):
+ """Base class for printing graphviz graphs.
+
+ The base printer class, has several generic utilities for printing different
+ graph representations of the protocols.
+
+ Users of this class will call the "draw(protocols)" method to print a
+ graphviz-syntax graph.
+ """
+
+ def __init__(self):
+ self.nodes = {}
+
+ def force_iface(self, arg):
+ i_name = arg.attrib.get('interface', 'unknown')
+ if (i_name, None) not in self.nodes:
+ self.out('"%s" [label="%s" shape=parallelogram]' % (i_name, i_name))
+ self.nodes[(i_name, None)] = i_name
+ return (i_name, None)
+
+ def out(self, text):
+ print(text)
+
+ def draw_nodes(self, protocol):
+ pass
+
+ def draw_edges(self, protocol):
+ pass
+
+ def draw(self, protocols):
+ """Draw the graph.
+
+ Args:
+ protocols: the list of xml.etree.ElementTree.Element protocols which you
+ want to draw as a graph. See third_party/wayland/src/protocol/ for more
+ information.
+ """
+ self.out('digraph g {')
+ self.out('pack=false;')
+ self.out('start="random";')
+ self.out('overlap=false;')
+ self.out('splines=true;')
+ self.out('graph [rankdir = "LR"];')
+ for protocol in protocols:
+ self.draw_nodes(protocol)
+ for protocol in protocols:
+ self.draw_edges(protocol)
+ self.out('}')
+
+
+class InterfacesPrinter(GvPrinter):
+ """Print protocol interfaces as a graphviz graph.
+
+ A specialization of the graph printer which draws interfaces and their
+ methods as a class diagram, where edges indicate relationships between the
+ methods.
+ """
+
+ def __init__(self, draw_enums=False):
+ super(InterfacesPrinter, self).__init__()
+ self.draw_enums = draw_enums
+
+ def draw_edge(self, src, snk):
+ for n in [src, snk]:
+ if n not in self.nodes:
+ raise Exception('Unable to find node "%s" when drawing (%s, %s)' %
+ (n, src, snk))
+ self.out(self.nodes[src] + ' -> ' + self.nodes[snk] + ' [];')
+
+ def draw_edges(self, protocol):
+ """Draw edges between interfaces and methods.
+
+ Draws all the edges:
+ - From an enum to a method that uses that enum as an argument.
+ - From an interface to a method that uses that interface as an argument.
+ - From a method to an interface that invoking that method will create.
+
+ Args:
+ protocol: a wayland <protocol> as an xml.etree.ElementTree.Element.
+ """
+ for interface in protocol.findall('interface'):
+ i_name = interface.attrib['name']
+ for message in protocol_util.grab_interface_messages(interface):
+ m_name = message.attrib['name']
+ for arg in message.findall('arg'):
+ if self.draw_enums and 'enum' in arg.attrib:
+ self.draw_edge((i_name, arg.attrib['enum']), (i_name, m_name))
+ continue
+ ty = arg.attrib['type']
+ if ty == 'new_id':
+ self.draw_edge((i_name, m_name), self.force_iface(arg))
+ elif ty == 'object':
+ self.draw_edge(self.force_iface(arg), (i_name, m_name))
+
+ def draw_nodes(self, protocol):
+ """Draw record nodes for each interface.
+
+ Draws a record-style node for each interface. The header is the interface
+ name and each subsequent entry is an event or request which that interface
+ defines.
+
+ As a side-effect, this method populates the |nodes| map.
+
+ Args:
+ protocol: a wayland <protocol> as an xml.etree.ElementTree.Element.
+ """
+ for interface in protocol.findall('interface'):
+ i_name = interface.attrib['name']
+ i_label = '<i>'+i_name
+ if self.draw_enums:
+ for enum in interface.findall('enum'):
+ e_name = enum.attrib['name']
+ node_name = i_name + '_' + e_name
+ fields = [
+ e.attrib['name'] + ' = ' + e.attrib['value']
+ for e in enum.findall('entry')
+ ]
+ self.out('"%s" [label="%s" shape=record]' %
+ (node_name, '|'.join(['<e>'+e_name]+fields)))
+ self.nodes[(i_name, e_name)] = node_name+':e'
+ for count, message in enumerate(
+ protocol_util.grab_interface_messages(interface)):
+ m_name = message.attrib['name']
+ is_request = message.tag == 'request'
+ m_label = ('<m%d>'%count) + (m_name + ' -\\>' if is_request
+ else '-\\> ' + m_name)
+ i_label += '|' + m_label
+ self.nodes[(i_name, m_name)] = i_name + (':m%d'%count)
+ self.out('"%s" [label="%s" shape=record]' % (i_name, i_label))
+ self.nodes[(i_name, None)] = i_name+':i'
+
+
+class DepsPrinter(GvPrinter):
+ """Print message dependencies as a graphviz graph.
+
+ A specialization of the graph printer for showind dependencies between
+ methods. Nodes in this graph are either interfaces or methods, and edges
+ indicate a relationship of "defines" (when the interface is the method's
+ 'this' object), "uses" (when the interface is an argument), or "creates"
+ (when the result of the call is the creation of an object).
+ """
+
+ def __init__(self, draw_all=False):
+ super(DepsPrinter, self).__init__()
+ self.draw_all = draw_all
+
+ def should_draw_message(self, message):
+ return self.draw_all or protocol_util.is_constructor(message)
+
+ def draw_nodes(self, protocol):
+ """Draws a node for each message/interface.
+
+ Draws a node for every interface and all of its methods. As a side effect,
+ calling this method will populate the |nodes| map.
+
+ Args:
+ protocol: a wayland <protocol> as an xml.etree.ElementTree.Element.
+ """
+ self.nodes[(None, None)] = '_unknown_'
+ self.out('"_unknown_" [label="?" shape=diamond]')
+ for i in protocol.findall('interface'):
+ i_name = i.attrib['name']
+ self.nodes[(i_name, None)] = i_name
+ self.out('"%s" [shape=box]' % (i_name))
+ for m in protocol_util.grab_interface_messages(i):
+ if self.should_draw_message(m):
+ m_name = m.attrib['name']
+ m_node = i_name + ':' + m_name
+ m_shape = 'hexagon' if m.tag == 'event' else 'ellipse'
+ self.nodes[(i_name, m_name)] = m_node
+ self.out('"%s" [label="%s" shape=%s]' %
+ (m_node, m_name, m_shape))
+
+ def get_obj(self, arg):
+ if 'interface' in arg.attrib:
+ return self.nodes[self.force_iface(arg)]
+ return self.nodes[(None, None)]
+
+ def draw_edges(self, protocol):
+ """Draw edges showing message arguments.
+
+ Draws edges showing the relationship between the messages and the
+ interfaces. Bold edges signify "defines" or "creates" relationships, while
+ dotted edges signify "uses" relationships.
+
+ Args:
+ protocol: a wayland <protocol> as an xml.etree.ElementTree.Element.
+ """
+ for i in protocol.findall('interface'):
+ i_name = i.attrib['name']
+ for m in protocol_util.grab_interface_messages(i):
+ if self.should_draw_message(m):
+ m_name = m.attrib['name']
+ self.out('"%s" -> "%s" [style=bold]' %
+ (self.nodes[(i_name, None)], self.nodes[(i_name, m_name)]))
+ for pa in m.findall('arg'):
+ if pa.attrib['type'] == 'object':
+ self.out('"%s" -> "%s" [style=dotted]' %
+ (self.get_obj(pa), self.nodes[(i_name, m_name)]))
+ for pa in m.findall('arg'):
+ if pa.attrib['type'] == 'new_id':
+ self.out('"%s" -> "%s" [style=bold]' %
+ (self.nodes[(i_name, m_name)], self.get_obj(pa)))
+
diff --git a/chromium/tools/wayland_aux/main.py b/chromium/tools/wayland_aux/main.py
new file mode 100644
index 00000000000..70aebc1a322
--- /dev/null
+++ b/chromium/tools/wayland_aux/main.py
@@ -0,0 +1,67 @@
+# Copyright (c) 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Process wayland specifications.
+
+Various functions for converting/processing/understanding wayland protocols.
+"""
+
+from __future__ import absolute_import
+import argparse
+import sys
+import xml.etree.ElementTree as xml
+import gv_diagram
+import proto_gen
+
+
+def strip_protocol(protocol):
+ for desc in protocol.findall('description'):
+ protocol.remove(desc)
+ for copy in protocol.findall('copyright'):
+ protocol.remove(copy)
+ if 'summary' in protocol.attrib:
+ protocol.attrib.pop('summary')
+ for c in protocol.getchildren():
+ strip_protocol(c)
+ return protocol
+
+
+def dump_protocol(protocol):
+ xml.dump(protocol)
+
+
+def read_protocol(path):
+ return xml.parse(path).getroot()
+
+
+def main(argv):
+ parser = argparse.ArgumentParser(description=__doc__)
+ parser.add_argument('-s', '--spec',
+ help='path(s) to the wayland specification(s)',
+ nargs='+', required=True)
+ parser.add_argument('-t', '--type',
+ help='Output different types of graph',
+ choices=['interfaces', 'deps',
+ 'harness', 'proto'], required=True)
+ parser.add_argument('-x', '--extra',
+ help='add extra detail to the normal printout',
+ action='store_true')
+
+ parsed = parser.parse_args(argv[1:])
+ protocols = [strip_protocol(read_protocol(path)) for path in parsed.spec]
+ extra = parsed.extra
+ if parsed.type == 'deps':
+ gv_diagram.DepsPrinter(extra).draw(protocols)
+ elif parsed.type == 'interfaces':
+ gv_diagram.InterfacesPrinter(extra).draw(protocols)
+ elif parsed.type == 'harness':
+ pass
+ elif parsed.type == 'proto':
+ proto_gen.generate(protocols)
+ else:
+ raise Exception('%s not implemented' % parsed.type)
+
+
+if __name__ == '__main__':
+ main(sys.argv)
diff --git a/chromium/tools/wayland_aux/proto_gen.py b/chromium/tools/wayland_aux/proto_gen.py
new file mode 100644
index 00000000000..1fddc628b9e
--- /dev/null
+++ b/chromium/tools/wayland_aux/proto_gen.py
@@ -0,0 +1,121 @@
+# Copyright (c) 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Generates a protobuf for fuzzing purposes.
+
+Use the generate() function to print a protobuf file, which allows libfuzzer to
+fuzz the given protocols..
+"""
+
+from __future__ import absolute_import
+from __future__ import print_function
+import protocol_util
+
+
+class Generator(object):
+ """Base class for generating something from a list of protocols.
+
+ Provides several utilities for generating files of things from a list of
+ protocols.
+ """
+
+ def out(self, text):
+ print(text)
+
+ def generate(self, protocols):
+ pass
+
+
+proto_type_conversions = {
+ 'object': 'uint32',
+ 'int': 'int32',
+ 'uint': 'uint32',
+ 'string': 'string',
+ 'fd': 'uint32',
+}
+
+
+class ProtoGenerator(Generator):
+ """Generate a libfuzzable protobuf.
+
+ Creates a protobuf for use when fuzzing wayland. This protobuf defines all the
+ client-side messages which the fuzzer might call.
+ """
+
+ def named(self, *args):
+ return '_'.join((e.attrib['name'] for e in args))
+
+ def get_type(self, ty):
+ if ty in proto_type_conversions:
+ return proto_type_conversions[ty]
+ raise Exception('unknown conversion for type: ' + ty)
+
+ def generate_action(self, name, args):
+ self.out('message %s {' % name)
+ for (idx, (a_type, a_name)) in enumerate([('uint32', 'receiver')] + args):
+ self.out('required %s %s = %d;'%(a_type, a_name, idx+1))
+ self.out('}')
+
+ def generate_req_action(self, ptc, ifc, msg):
+ """Generate an action protobuf message.
+
+ Args:
+ ptc: the <protocol> xml element.
+ ifc: the <interface> xml element.
+ msg: the <request> xml element (given that <event>s don't need messages).
+ """
+ args = []
+ name = self.named(ptc, ifc, msg)
+ if name == 'wayland_wl_registry_bind':
+ args = [('global', 'global'), ('uint32', 'name'), ('uint32', 'version')]
+ else:
+ args = [(self.get_type(arg.attrib['type']), arg.attrib['name'])
+ for arg in msg.findall('arg')
+ if arg.attrib['type'] != 'new_id']
+ if protocol_util.is_constructor(msg):
+ c_type = protocol_util.get_constructed(msg)
+ self.out('// Constructs %s' % (c_type if c_type else '???'))
+ self.generate_action(name, args)
+
+ def generate(self, protocols):
+ self.out('syntax = "proto2";')
+ self.out('package = exo.wayland_fuzzer;')
+
+ # Make the globals enum for identifying globals to bind.
+ self.out('enum global {')
+ self.out('GLOBAL_UNSPECIFIED=0;')
+ for (idx, (pro, ifc)) in enumerate(protocol_util.get_globals(protocols)):
+ self.out('%s = %d;'%(self.named(pro, ifc), idx+1))
+ self.out('}')
+
+ # List all the possible actions.
+ self.out('message actions {')
+ self.out('repeated action acts = 1;')
+ self.out('}')
+ self.out('message action {')
+ self.out('oneof act {')
+ actions = ['meta_dispatch', 'meta_roundtrip'] + [
+ self.named(p, i, m)
+ for (p, i, m) in protocol_util.all_messages(protocols)
+ if protocol_util.is_request(m)]
+ for (idx, act) in enumerate(actions):
+ self.out('%s act_%s = %d;' % (act, act, idx+1))
+ self.out('}')
+ self.out('}')
+ self.generate_action('meta_dispatch', [])
+ self.generate_action('meta_roundtrip', [])
+ for (p, i, m) in protocol_util.all_messages(protocols):
+ if protocol_util.is_request(m):
+ self.generate_req_action(p, i, m)
+
+
+def generate(protocols):
+ """Make a protobuf for fuzzing the |protocols|.
+
+ Args:
+ protocols: a list of xml.etree.ElementTree.Element where each element is a
+ wayland <protocol> node. This list will be converted to a protobuf file
+ that can be used for fuzzing.
+ """
+ ProtoGenerator().generate(protocols)
diff --git a/chromium/tools/wayland_aux/protocol_util.py b/chromium/tools/wayland_aux/protocol_util.py
new file mode 100644
index 00000000000..59d886e6a51
--- /dev/null
+++ b/chromium/tools/wayland_aux/protocol_util.py
@@ -0,0 +1,124 @@
+# Copyright (c) 2019 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""Misc utils.
+
+Misc utils for interpreting protocols.
+"""
+
+from __future__ import absolute_import
+
+
+def grab_interface_messages(interface):
+ """Get the events+requests in this interface.
+
+ Args:
+ interface: the interface which you want the messages of.
+
+ Yields:
+ All the events followed by all the requests.
+ """
+ for e in interface.findall('event'):
+ yield e
+ for r in interface.findall('request'):
+ yield r
+
+
+def is_event(message):
+ return message.tag == 'event'
+
+
+def is_request(message):
+ return message.tag == 'request'
+
+
+def is_constructor(message):
+ """Check if a message is a constructor.
+
+ Args:
+ message: the message which you want to check.
+
+ Returns:
+ True if the message constructs an object (via new_id), False otherwise.
+ """
+ return any(['type' in arg.attrib and arg.attrib['type'] == 'new_id'
+ for arg in message.findall('arg')])
+
+
+def is_destructor(message):
+ """Check if a message is a destructor.
+
+ Args:
+ message: the message which you want to check.
+
+ Returns:
+ True if the message destroys its "this" object (i.e. it has a
+ type=destructor attribute).
+ """
+ return 'type' in message.attrib and message.attrib['type'] == 'destructor'
+
+
+def all_interfaces(protocols):
+ """Get the interfaces in these protocols.
+
+ Args:
+ protocols: the list of protocols you want the interfaces of.
+
+ Yields:
+ Tuples (p, i) of (p)rotocol (i)nterface.
+ """
+ for p in protocols:
+ for i in p.findall('interface'):
+ yield (p, i)
+
+
+def all_messages(protocols):
+ """Get the messages in these protocols.
+
+ Args:
+ protocols: the list of protocols you want the messages of.
+
+ Yields:
+ Tuples (p, i, m) of (p)rotocol, (i)nterface, and (m)essage.
+ """
+ for (p, i) in all_interfaces(protocols):
+ for m in grab_interface_messages(i):
+ yield (p, i, m)
+
+
+def get_constructed(message):
+ """Gets the interface constructed by a message.
+
+ Note that even if is_constructor(message) returns true, get_constructed can
+ still return None when the message constructs an unknown interface (e.g.
+ wl_registry.bind()).
+
+ Args:
+ message: the message which may be a constructor.
+
+ Returns:
+ The name of the constructed interface (if there is one), or None.
+ """
+ for arg in message.findall('arg'):
+ if 'type' in arg.attrib and arg.attrib['type'] == 'new_id':
+ return arg.attrib.get('interface', None)
+ return None
+
+
+def get_globals(protocols):
+ """List all of the global interfaces (i.e. those without a constructor).
+
+ Args:
+ protocols: the list of protocols you want the globals for.
+
+ Yields:
+ Tuples (p, i) of (p)rotocol, (i)nterface, where the interface is a global.
+ """
+ non_globals = set(get_constructed(m)
+ for (p, i, m) in all_messages(protocols)
+ if get_constructed(m))
+ for (p, i) in all_interfaces(protocols):
+ if i.attrib['name'] not in non_globals:
+ yield (p, i)
+
diff --git a/chromium/tools/web_dev_style/html_checker.py b/chromium/tools/web_dev_style/html_checker.py
index b00552858f8..6f6086eef11 100644
--- a/chromium/tools/web_dev_style/html_checker.py
+++ b/chromium/tools/web_dev_style/html_checker.py
@@ -37,7 +37,7 @@ class HtmlChecker(object):
"Do not close single tags.")
def DoNotUseBrElementCheck(self, line_number, line):
- regex = r"(<br)"
+ regex = r"(<br\b)"
return regex_check.RegexCheck(self.input_api.re, line_number, line, regex,
"Do not use <br>; place blocking elements (<div>) as appropriate.")
diff --git a/chromium/tools/web_dev_style/html_checker_test.py b/chromium/tools/web_dev_style/html_checker_test.py
index 0931af2c554..83c979aa44d 100755
--- a/chromium/tools/web_dev_style/html_checker_test.py
+++ b/chromium/tools/web_dev_style/html_checker_test.py
@@ -115,6 +115,7 @@ class HtmlCheckerTest(SuperMoxTestBase):
lines = [
"br",
"br>",
+ "<browser-switch-app></browser-switch-app>",
"give me a break"
]
for line in lines:
diff --git a/chromium/tools/win/DebugVisualizers/BUILD.gn b/chromium/tools/win/DebugVisualizers/BUILD.gn
index ddbb8e631a4..cdd7a23887f 100644
--- a/chromium/tools/win/DebugVisualizers/BUILD.gn
+++ b/chromium/tools/win/DebugVisualizers/BUILD.gn
@@ -24,10 +24,6 @@ config("chrome") {
ldflags = [ "/NATVIS:" + rebase_path("chrome.natvis", root_build_dir) ]
}
-config("libc++") {
- ldflags = [ "/NATVIS:" + rebase_path("libc++.natvis", root_build_dir) ]
-}
-
config("skia") {
ldflags = [ "/NATVIS:" + rebase_path("skia.natvis", root_build_dir) ]
}
diff --git a/chromium/tools/win/DebugVisualizers/chrome.natvis b/chromium/tools/win/DebugVisualizers/chrome.natvis
index 57a7b620eb2..80cd0ac7b75 100644
--- a/chromium/tools/win/DebugVisualizers/chrome.natvis
+++ b/chromium/tools/win/DebugVisualizers/chrome.natvis
@@ -22,8 +22,11 @@
</Expand>
</Type>
<Type Name="base::Optional&lt;*&gt;">
- <DisplayString Condition="storage_.is_null_">(null)</DisplayString>
+ <DisplayString Condition="!storage_.is_populated_">(null)</DisplayString>
<DisplayString>{storage_.value_}</DisplayString>
+ <Expand>
+ <Item Name="Value" Condition="storage_.is_populated_">storage_.value_</Item>
+ </Expand>
</Type>
<Type Name="base::RefCounted&lt;*&gt;">
<DisplayString>RefCount: {ref_count_}</DisplayString>
diff --git a/chromium/tools/win/DebugVisualizers/libc++.natvis b/chromium/tools/win/DebugVisualizers/libc++.natvis
deleted file mode 100644
index 0445ef59a95..00000000000
--- a/chromium/tools/win/DebugVisualizers/libc++.natvis
+++ /dev/null
@@ -1,148 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<AutoVisualizer
- xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
-
- <!-- libc++'s __compressed_pair is an internal type used pervasively for
- doing the empty base class optimization.
-
- __compressed_pair<U,V> derives from __compressed_pair_elem<U,0> and
- __compressed_pair_elem<V,1>. __compressed_pair_elem<T> is specialized on
- a 3rd template parameter:
- * if T is empty and non-final the 3rd param is 1 and it derives from T
- * else it has a member variable __value_ of type T
- -->
- <Type Name="std::__1::__compressed_pair_elem&lt;*,*,0&gt;">
- <DisplayString>{__value_}</DisplayString>
- <Expand>
- <ExpandedItem>__value_</ExpandedItem>
- </Expand>
- </Type>
- <Type Name="std::__1::__compressed_pair_elem&lt;*,*,1&gt;">
- <DisplayString>{*($T1*)this}</DisplayString>
- <Expand>
- <ExpandedItem>*($T1*)this</ExpandedItem>
- </Expand>
- </Type>
-
- <!--libc++'s short string optimization:
- A basic_string is 3 size_t words long. In the "alternate string layout" that we use,
- they are: pointer to data, size, capacity.
- (In the normal layout, it's capacity, size, data instead.)
- If a string is short enough that it fits in these three size_ts instead,
- the string data is stored inline in these 3 words, with the last byte of
- the storage storing the length of the string.
- The highest bit of the "capacity" word is set for normal, "long" strings,
- and that bit needs to be masked out to know the real capacity.
- If this bit is not set, the string data is stored inline.
- (In the normal layout, if the lowest bit in the first byte is set,
- it's a "long" string, requiring a long string to always have even
- capacity. A short string here stores its length in the first byte
- and the inline data in the remaining storage.)
- -->
-
- <Type Name="std::__1::basic_string&lt;char,*&gt;">
- <!--<Intrinsic Name="is_long"
- Expression="((__rep*)&amp;__r_)-&gt;__s.__size_ &amp; 0x80" />-->
- <!-- The above doesn't work for reasons I don't understand.
- The below assumes the alternate string layout and little endianness :/
- -->
- <Intrinsic Name="is_long"
- Expression="*(((char*)this) + 3*sizeof(size_t) - 1) &amp; 0x80" />
- <DisplayString Condition="is_long()">{*(char**)this}</DisplayString>
- <DisplayString Condition="!is_long()">{(char*)this}</DisplayString>
- <StringView Condition="is_long()">*(char**)this</StringView>
- <StringView Condition="!is_long()">(char*)this</StringView>
- <Expand>
- <Item Name="[size]" Condition="is_long()"
- ExcludeView="simple">((size_t*)this)[1]</Item>
- <Item Name="[size]" Condition="!is_long()"
- ExcludeView="simple">*(((char*)this) + 3*sizeof(size_t) - 1)</Item>
- <Item Name="[capacity]" Condition="is_long()" ExcludeView="simple">
- ((size_t*)this)[2] &amp; (~((size_t)0) &gt;&gt; 1)
- </Item>
- <Item Name="[capacity]" Condition="!is_long()"
- ExcludeView="simple">22</Item>
- <ArrayItems>
- <Size Condition="is_long()">((size_t*)this)[1]</Size>
- <Size Condition="!is_long()">
- *(((char*)this) + 3*sizeof(size_t) - 1)
- </Size>
- <ValuePointer Condition="is_long()">*(char**)this</ValuePointer>
- <ValuePointer Condition="!is_long()">(char*)this</ValuePointer>
- </ArrayItems>
- </Expand>
- </Type>
-
- <Type Name="std::__1::basic_string&lt;wchar_t,*&gt;">
- <Intrinsic Name="is_long"
- Expression="*(((char*)this) + 3*sizeof(size_t) - 1) &amp; 0x80" />
- <DisplayString Condition="is_long()">{*(wchar_t**)this}</DisplayString>
- <DisplayString Condition="!is_long()">{(wchar_t*)this}</DisplayString>
- <StringView Condition="is_long()">*(wchar_t**)this</StringView>
- <StringView Condition="!is_long()">(wchar_t*)this</StringView>
- <Expand>
- <Item Name="[size]" Condition="is_long()"
- ExcludeView="simple">((size_t*)this)[1]</Item>
- <Item Name="[size]" Condition="!is_long()"
- ExcludeView="simple">*(((char*)this) + 3*sizeof(size_t) - 1)</Item>
- <Item Name="[capacity]" Condition="is_long()" ExcludeView="simple">
- ((size_t*)this)[2] &amp; (~((size_t)0) &gt;&gt; 1)
- </Item>
- <Item Name="[capacity]" Condition="!is_long()"
- ExcludeView="simple">10</Item>
- <ArrayItems>
- <Size Condition="is_long()">((size_t*)this)[1]</Size>
- <Size Condition="!is_long()">
- *(((char*)this) + 3*sizeof(size_t) - 1)
- </Size>
- <ValuePointer Condition="is_long()">*(wchar_t**)this</ValuePointer>
- <ValuePointer Condition="!is_long()">(wchar_t*)this</ValuePointer>
- </ArrayItems>
- </Expand>
- </Type>
-
- <Type Name="std::__1::map&lt;*&gt;">
- <DisplayString>{{ size={__tree_.__pair3_} }}</DisplayString>
- <Expand>
- <Item Name="[size]">__tree_.__pair3_</Item>
- <TreeItems>
- <Size>*(size_type*)&amp;__tree_.__pair3_</Size>
- <HeadPointer>
- ((__node_pointer)&amp;__tree_.__pair1_)-&gt;__left_</HeadPointer>
- <LeftPointer>
- ((std::__1::map&lt;$T1,$T2,$T3,$T4&gt;::__node_pointer)this)
- -&gt;__left_
- </LeftPointer>
- <RightPointer>
- ((std::__1::map&lt;$T1,$T2,$T3,$T4&gt;::__node_pointer)this)
- -&gt;__right_
- </RightPointer>
- <ValueNode>
- ((std::__1::map&lt;$T1,$T2,$T3,$T4&gt;::__node_pointer)this)
- -&gt;__value_.__cc
- </ValueNode>
- </TreeItems>
- </Expand>
- </Type>
-
- <Type Name="std::__1::unique_ptr&lt;*&gt;">
- <Intrinsic Name="value" Expression="*($T1**)&amp;__ptr_" />
- <SmartPointer Usage="Minimal">value()</SmartPointer>
- <DisplayString Condition="value() == 0">empty</DisplayString>
- <DisplayString Condition="value() != 0">
- unique_ptr {value()}</DisplayString>
- <Expand>
- <Item Condition="value() != 0" Name="[ptr]">value()</Item>
- </Expand>
- </Type>
-
- <Type Name="std::__1::vector&lt;*&gt;">
- <Intrinsic Name="size" Expression="__end_ - __begin_" />
- <Expand>
- <ArrayItems>
- <Size>size()</Size>
- <ValuePointer>__begin_</ValuePointer>
- </ArrayItems>
- </Expand>
- </Type>
-</AutoVisualizer>
diff --git a/chromium/tools/win/DebugVisualizers/webkit.natvis b/chromium/tools/win/DebugVisualizers/webkit.natvis
index 6dcf1e793dd..1c331b14e5b 100644
--- a/chromium/tools/win/DebugVisualizers/webkit.natvis
+++ b/chromium/tools/win/DebugVisualizers/webkit.natvis
@@ -114,6 +114,18 @@
<DisplayString Condition="is_float_">{(blink::Length::Type)type_} {float_value_}</DisplayString>
<DisplayString>{(blink::Length::Type)type_} {int_value_}</DisplayString>
</Type>
+ <Type Name="blink::LogicalOffset">
+ <DisplayString>({inline_offset}, {block_offset})</DisplayString>
+ </Type>
+ <Type Name="blink::LogicalSize">
+ <DisplayString>({inline_size} x {block_size})</DisplayString>
+ </Type>
+ <Type Name="blink::PhysicalOffset">
+ <DisplayString>({left}, {top})</DisplayString>
+ </Type>
+ <Type Name="blink::PhysicalSize">
+ <DisplayString>({width} x {height})</DisplayString>
+ </Type>
<Type Name="blink::WebRect">
<AlternativeType Name="blink::WebFloatRect"/>
<DisplayString>({x}, {y}) x ({width}, {height})</DisplayString>
@@ -140,11 +152,11 @@
</Type>
<!-- Component build version -->
<Type Name="blink::WebString">
- <DisplayString>{(blink_platform.dll!WTF::StringImpl*)(private_.storage_)}</DisplayString>
+ <DisplayString>{(wtf.dll!WTF::StringImpl*)(impl_.ptr_)}</DisplayString>
</Type>
<!-- Non-component build version -->
<Type Name="blink::WebString" Priority="Low">
- <DisplayString>{(WTF::StringImpl*)(private_.storage_)}</DisplayString>
+ <DisplayString>{(WTF::StringImpl*)(impl_.ptr_)}</DisplayString>
</Type>
<!-- DOM -->
<Type Name="blink::QualifiedName">
@@ -270,18 +282,6 @@
</Synthetic>
</Expand>
</Type>
- <Type Name="blink::NGLogicalOffset">
- <DisplayString>({inline_offset}, {block_offset})</DisplayString>
- </Type>
- <Type Name="blink::NGLogicalSize">
- <DisplayString>({inline_size} x {block_size})</DisplayString>
- </Type>
- <Type Name="blink::NGPhysicalOffset">
- <DisplayString>({left}, {top})</DisplayString>
- </Type>
- <Type Name="blink::NGPhysicalSize">
- <DisplayString>({width} x {height})</DisplayString>
- </Type>
<!-- Layout: TextRun -->
<Type Name="blink::TextRun">
<DisplayString Condition="is_8bit_">{data_.characters8,[len_]s}</DisplayString>
diff --git a/chromium/tools/win/pe_summarize.py b/chromium/tools/win/pe_summarize.py
index 13e4a4b2227..fa74d9e9c3a 100644
--- a/chromium/tools/win/pe_summarize.py
+++ b/chromium/tools/win/pe_summarize.py
@@ -71,13 +71,6 @@ def main():
print r'Sample: %s chrome.dll original\chrome.dll' % sys.argv[0]
return 0
- # Add to the path so that dumpbin can run.
- vs_dir = r'C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64'
- if not os.path.exists(os.path.join(vs_dir, 'dumpbin.exe')):
- print "Couldn't find dumpbin.exe. Visual Studio 2015 must be installed."
- return 0
- os.environ['PATH'] = vs_dir + ';' + os.environ["PATH"]
-
# Track the name of the last PE (Portable Executable) file to be processed -
# file name only, without the path.
last_pe_filepart = ""
@@ -92,32 +85,43 @@ def main():
print '%10s: %9s , %9s' % ('name', 'mem size', 'disk size')
sections = None
- command = 'dumpbin.exe /headers "%s"' % pe_path
- for line in subprocess.check_output(command).splitlines():
- if line.startswith('SECTION HEADER #'):
- sections = []
- elif type(sections) == type([]):
- # We must be processing a section header.
- sections.append(line.strip())
- # When we've accumulated four lines of data, process them.
- if len(sections) == 4:
- name, memory_size, _, disk_size = sections
- assert name.count('name') == 1
- assert memory_size.count('virtual size') == 1
- assert disk_size.count('size of raw data') == 1
- name = name.split()[0]
- memory_size = int(memory_size.split()[0], 16)
- disk_size = int(disk_size.split()[0], 16)
- # Print the sizes in decimal MB. This makes large numbers easier to
- # understand - 33.199959 is easier to read than 33199959. Decimal MB
- # is used to allow simple conversions to a precise number of bytes.
- if abs(memory_size - disk_size) < 512:
- print '%10s: %9.6f MB' % (name, memory_size / 1e6)
- else:
- print '%10s: %9.6f MB, %9.6f MB' % (name, memory_size / 1e6,
- disk_size / 1e6)
- results.append((name, memory_size))
- sections = None
+ # Pass the undocumented /nopdb header to avoid hitting symbol servers for
+ # the entrypoint name.
+ command = 'dumpbin.exe /nopdb /headers "%s"' % pe_path
+ try:
+ for line in subprocess.check_output(command).splitlines():
+ if line.startswith('SECTION HEADER #'):
+ sections = []
+ elif type(sections) == type([]):
+ # We must be processing a section header.
+ sections.append(line.strip())
+ # When we've accumulated four lines of data, process them.
+ if len(sections) == 4:
+ name, memory_size, _, disk_size = sections
+ assert name.count('name') == 1
+ assert memory_size.count('virtual size') == 1
+ assert disk_size.count('size of raw data') == 1
+ name = name.split()[0]
+ memory_size = int(memory_size.split()[0], 16)
+ disk_size = int(disk_size.split()[0], 16)
+ # Print the sizes in decimal MB. This makes large numbers easier to
+ # understand - 33.199959 is easier to read than 33199959. Decimal MB
+ # is used to allow simple conversions to a precise number of bytes.
+ if abs(memory_size - disk_size) < 512:
+ print '%10s: %9.6f MB' % (name, memory_size / 1e6)
+ else:
+ print '%10s: %9.6f MB, %9.6f MB' % (name, memory_size / 1e6,
+ disk_size / 1e6)
+ results.append((name, memory_size))
+ sections = None
+ except WindowsError as error:
+ if error.winerror == 2:
+ print (r'Cannot find dumpbin. Run "C:\Program Files (x86)\Microsoft '
+ r'Visual Studio\2017\Professional\VC\Auxiliary\Build'
+ r'\vcvarsall.bat amd64" or similar to add dumpbin to the path.')
+ else:
+ print error
+ break
print
pe_filepart = os.path.split(pe_path)[1]